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

问题描述 投票:1回答:2

我试图使用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 mysql pdo
2个回答
2
投票

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

查询参数的重点在于,在解析SQL语法之后,该值与服务器上的查询相结合,因此您插入任何新语法(如表达式)为时已晚。

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

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

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


2
投票

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

UPDATE users SET log = log + 1

如果使用prepare语句,则必须查询列获取当前值,然后在第二个查询中执行更新并向其添加1。

© www.soinside.com 2019 - 2024. All rights reserved.