首页 > 解决方案 > 使用带有 MySQL 查询变量的 PDO 准备语句

问题描述

我正在尝试使用 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']);

但我更喜欢我最初的方法,我正在处理一些限制。

标签: phpmysqlpdo

解决方案


由于您没有从用户那里获取信息,并且要将 1 与列相加,因此您可以安全地执行常规查询。

UPDATE users SET log = log + 1

如果您使用准备语句,则必须查询该列以获取当前值,然后在第二个查询中进行更新并为其添加 1。


推荐阅读