2011-07-21 84 views
3

我运行下面的代码:PDO mysql的语法错误1064

$conn = new PDO(....); 
.... pdo attributes ... 

$limitvalue = 0; 
$limit = 10; 
$sql = $conn->prepare("SELECT * FROM table1 LIMIT ?, ?"); 
$sql->bindParam(1, $limitvalue, PDO::PARAM_INT); 
$sql->bindParam(2, $limit, PDO::PARAM_INT); 
$sql->execute(); 

,我也得到:

未捕获的异常 'PDOException' 有消息“SQLSTATE [42000]: 语法错误或访问冲突:1064您的SQL 语法中有错误;检查对应于你的MySQL服务器版本 的手册正确的语法使用近“NULL,10”位于第1' 行

它发生仅与此特定的查询。其他一切都可以。

顺便说一句:我知道它可能看起来很愚蠢,我做准备“代码内”值的语句。但这仅仅是一个例子。实际上,这些值取决于页码,但在这里并不重要 - 此查询也会给出相同的错误。


如果有人有兴趣,PHP的版本是:5.3.4RC2和MySQL的是:mysqlnd 5.0.7-dev的 - 091210 - $修订:304625 $

回答

4

这似乎是一个php bug:PDO忽略PARAM_INT常量,并使用$limit$limitvalue变量作为字符串。绑定时查询中引用了哪些内容。

尝试使用:

$sql->bindParam(1, (int)$limitvalue, PDO::PARAM_INT); 
$sql->bindParam(2, (int)$limit, PDO::PARAM_INT); 

要强制变量类型为int。

+1

感谢您的回答。它现在有效。但还有一个问题 - 为什么第二个参数($ limit)在没有int转换的情况下工作正常?我的意思是,如果我的SQL查询就像'LIMIT X,Y'那么为什么只有** X **需要你提到的转换(因为** Y **工作正常)?它是指错误:)? – Wysiwyf

+1

我不知道。喜欢那些臭虫:第。 – Arkh

+1

哈哈,无论如何,谢谢。 – Wysiwyf

-2

我不认为sql中限制的第一个参数可以是NULL。如果你只是想要前10条记录,然后使用限制10。

+1

它不是NULL - 在代码中,'$ limitvalue = 0' –

+0

我也认为这可能是问题所在。我已将其更改为1,但我仍然遇到此错误。所以不,这里没关系。 – Wysiwyf