我正在尝试使用 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/