首页 >数据库 >mysql教程 >为什么使用字符串参数时,带有 LIMIT 的 MySQL 准备语句失败?

为什么使用字符串参数时,带有 LIMIT 的 MySQL 准备语句失败?

Susan Sarandon
Susan Sarandon原创
2024-12-06 15:01:11992浏览

Why Does My MySQL Prepared Statement with LIMIT Fail When Using String Parameters?

MySQL 上带有预准备语句的 LIMIT 关键字

问题:

在 MySQL 中使用带有 LIMIT 子句的预准备语句时,当参数传递为

SELECT id, content, date
FROM comment
WHERE post = ?
ORDER BY date DESC
LIMIT ?, ?
$comments = $db->prepare($query);
$comments->execute(array($post, $min, $max));

答案:

出现这个问题是因为 PDOStatement::execute() 方法将所有参数都视为字符串,导致无效SQL 语句。 MySQL 不会将字符串参数转换为数字,从而导致解析错误。

解决方案:

  • 绑定参数单独:
$comments->bindParam(1, $post, PDO::PARAM_STR);
$comments->bindParam(2, $min, PDO::PARAM_INT);
$comments->bindParam(3, $min, PDO::PARAM_INT);
  • 使用 sprintf() 硬编码数字参数:
$query = sprintf('SELECT id, content, date
    FROM comment
    WHERE post = ?
    ORDER BY date DESC
    LIMIT %d, %d', $min, $max);
  • 禁用模拟准备:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

以上是为什么使用字符串参数时,带有 LIMIT 的 MySQL 准备语句失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn