【问题标题】:Using PDO Prepared Statements With MySQL Query Variable使用带有 MySQL 查询变量的 PDO 准备语句
【发布时间】:2019-02-21 18:50:22
【问题描述】:

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

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

【问题讨论】:

  • 查询在你使用height + 1的地方执行,高度应该是多少?使用单引号将其传递给不是您想要的更新的文字字符串。
  • 你需要UPDATE users SET log = height + ?$stml->execute(['1']);
  • 高度应该是db表中高度的前一个值,sql就是这样工作的
  • 另外,你有一个错字:$stmt vs $stml
  • 这篇文章毫无意义。如果您需要height + 1 那么为什么您的代码显示log + 1

标签: php mysql pdo


【解决方案1】:

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

查询参数的全部意义在于该值与服务器上的查询相结合, SQL语法已被解析后,因此您插入任何新语法都为时已晚,例如一个表达式。

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

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

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

【讨论】:

    【解决方案2】:

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

    UPDATE users SET log = log + 1
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多