我试图使用PHP PDO增加表中的行,我已经提出了这个查询
UPDATE users SET log = ?
我试图根据日志的每一列上的先前值进行更新
所以,如果我的桌子早些时候是这样的话
+----+------+------+-----------+--------+
| id | name | age | eye_color | log |
+----+------+------+-----------+--------+
| 21 | OLa | 19 | black | 1 |
| 22 | OLa | 19 | Green | 2 |
| 23 | OLa | 19 | Grey | 3 |
+----+------+------+-----------+--------+
我期待得到这个结果
+----+------+------+-----------+--------+
| id | name | age | eye_color | log |
+----+------+------+-----------+--------+
| 21 | OLa | 19 | black | 2 |
| 22 | OLa | 19 | Green | 3 |
| 23 | OLa | 19 | Grey | 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语法之后,该值与服务器上的查询相结合,因此您插入任何新语法(如表达式)为时已晚。
查询参数始终被视为单个标量值。您不能使用参数:
正如其他人所解释的那样,在这种情况下,您无需使用查询参数。直接在查询中使用文字表达式log + 1
是安全的。没有不受信任的内容(来自用户或其他来源)插入到查询中,因此不存在SQL注入的风险。
由于您没有从用户那里获取信息,并且要将1加到列中,因此您可以安全地执行常规查询。
UPDATE users SET log = log + 1
如果使用prepare语句,则必须查询列获取当前值,然后在第二个查询中执行更新并向其添加1。