【问题标题】:Statement: UPDATE `blog_posts` SET `visit` = `visit` + 1 WHERE `id` = 14155 ORDER BY id LIMIT 1语句:UPDATE `blog_posts` SET `visit` = `visit` + 1 WHERE `id` = 14155 ORDER BY id LIMIT 1
【发布时间】:2016-12-22 23:28:57
【问题描述】:

我有这个 php 代码:

mysqli_query($link, 'UPDATE `blog_posts` SET `visit` = `visit` + 1 WHERE `id` = ' . $postid . ' ORDER BY id LIMIT 1');

在 mysqld.log 中

记录此错误如何解决问题?

[警告] 使用语句格式写入二进制日志的不安全语句,因为 BINLOG_FORMAT = STATEMENT。该语句是不安全的,因为它使用了 LIMIT 子句。这是不安全的,因为包含的行集无法预测。

声明:

UPDATE `blog_posts` SET `visit` = `visit` + 1 WHERE `id` = 14155 ORDER BY id LIMIT 1

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    正如错误所述,在update 语句中使用limit 子句是一种狡猾的做法,因为您无法准确预测哪些行会被更新。然而,在这里,你很幸运。假设id 列确实是一个唯一标识符,对其应用= 条件将最多返回一行,因此limit 1 子句只是多余的,您可以简单地丢弃它:

    mysqli_query
    ($link, 'UPDATE `blog_posts` SET `visit` = `visit` + 1 WHERE `id` = ' . $postid);
    

    必填事项:
    使用字符串操作来生成 SQL 语句是一种危险的做法,这可能会使您的代码容易受到 SQL 注入攻击。您应该考虑改用prepared statement

    【讨论】:

      猜你喜欢
      • 2021-12-04
      • 1970-01-01
      • 2014-07-23
      • 2020-05-22
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 2012-02-27
      • 2013-09-20
      相关资源
      最近更新 更多