gpt4 book ai didi

php - 使用带有 MySQL 查询变量的 PDO 准备语句

转载 作者:行者123 更新时间:2023-11-29 04:32:51 25 4
gpt4 key购买 nike

我正在尝试使用 PHP PDO 增加表中的行,我想出了这个查询

UPDATE users SET log = ? 

我正在尝试根据日志每一列的先前值进行更新

所以,如果我的 table 早先是这样的

+----+------+------+------------+--------+
|编号 |姓名 |年龄 |眼睛颜色 |日志 |
+----+------+------+----------+--------+
| 21 |奥拉 | 19 |黑色 | 1 |
| 22 |奥拉 | 19 |绿色 | 2 |
| 23 |奥拉 | 19 |灰色| 3 |
+----+------+------+------------+--------+

我期待得到这个结果

+----+------+------+------------+--------+
|编号 |姓名 |年龄 |眼睛颜色 |日志 |
+----+------+------+----------+--------+
| 21 |奥拉 | 19 |黑色 | 2 |
| 22 |奥拉 | 19 |绿色 | 3 |
| 23 |奥拉 | 19 |灰色| 4 |
+----+------+------+------------+--------+

我发现我可以让占位符的值变成

log + 1

通过进行完整查询

UPDATE users SET log = log + 1

当我使用 PDO 的查询方法以及我的终端时,这很有效,当我尝试使用准备好的语句更新它时,问题就来了,如果我这样做了

$stmt = $this->pdo->prepare("UPDATE users SET log = ?");
$stml->execute(['height + 1']);

然后所有的日志列都变成0。

我做错了什么吗?我也知道我可以让查询简单明了

$stmt = $this->pdo->prepare("UPDATE users SET log = log + 1");
$stmt->execute(['log + 1']);

但我更喜欢我最初的方法,我在一些限制条件下工作。

最佳答案

您不能使用查询参数将表达式插入语法中。参数不仅仅是字符串插值。如果是,那么使用它们就没有任何好处,因为您已经可以在 PHP 中轻松地进行字符串插值。

查询参数的全部要点是该值与服务器上的查询相结合, SQL 语法被解析之后,所以插入任何新语法都为时已晚,例如一个表达式。

查询参数始终被视为单个标量值。您不能将参数用于:

  • 表标识符
  • 列标识符
  • SQL关键字
  • 表达式
  • 值列表

正如其他人所解释的,在这种情况下,您无论如何都不需要使用查询参数。直接在查询中使用文字表达式 log + 1 是安全的。没有不受信任的内容(来自用户或其他来源)被插入到查询中,因此没有 SQL 注入(inject)的风险。

关于php - 使用带有 MySQL 查询变量的 PDO 准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54814223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com