Php 使用LIMIT子句时出现MySQL错误1064

Php 使用LIMIT子句时出现MySQL错误1064,php,mysql,pdo,prepared-statement,Php,Mysql,Pdo,Prepared Statement,我遇到了一个奇怪的问题,通过PDO准备的语句运行查询,我就是无法发现这个问题。手动运行查询时,它工作正常。以下是代码(为简洁起见,进行了简化): 从查询中删除限制?部分将按预期返回所有结果。相反,当尝试使用限制时,它通过5作为值,我得到以下错误: 您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以获取第5行“5”附近要使用的正确语法 准备后,PDO语句对象的转储显示: object(PDOStatement)[59] public 'queryString' => st

我遇到了一个奇怪的问题,通过PDO准备的语句运行查询,我就是无法发现这个问题。手动运行查询时,它工作正常。以下是代码(为简洁起见,进行了简化):

从查询中删除
限制?
部分将按预期返回所有结果。相反,当尝试使用限制时,它通过5作为值,我得到以下错误:

您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以获取第5行“5”附近要使用的正确语法

准备后,PDO语句对象的转储显示:

object(PDOStatement)[59]
    public 'queryString' => string 'SELECT * FROM mydb.Product
       WHERE ProductId >= ?
       AND IsApproved = 1
       AND IsPublic = 1
       LIMIT ?'
我曾尝试在查询的末尾加上分号,但这也会产生同样的错误。我是不是有脑胀气和明显的缺失



TL;博士为什么在使用带有1064错误的LIMIT子句时,我准备的语句失败了?

我认为这可能是重复的


解决方案是绑定limit参数,强制它为int而不是简单(int)转换的字符串。

只需将(int)放在limit值之前

,因为到目前为止,
limit
的值还不允许参数化,除非您使用一些用户定义的类,例如,因此,我的解决方案是手动验证限制值,并将其直接放入查询中?您应该将此作为答案发布,因为我相信许多其他人都不知道限制不能参数化!总之,
LIMIT
的值是整数,因此它们很容易验证
(int)$var
@491243对,我使用
intval()
函数——但前提相同。谢谢为了补充您的答案491243所说的内容,PHP的PDO不支持使用“?”和传递到
execute
方法的值数组来参数化查询。这不是前面的答案所说的吗?
object(PDOStatement)[59]
    public 'queryString' => string 'SELECT * FROM mydb.Product
       WHERE ProductId >= ?
       AND IsApproved = 1
       AND IsPublic = 1
       LIMIT ?'