【问题标题】:PDO Mysql Syntax error 1064 [closed]PDO Mysql 语法错误 1064 [关闭]
【发布时间】:2011-07-21 13:52:39
【问题描述】:

我运行以下代码:

$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();

我得到:

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

它只发生在这个特定的查询中。其他一切正常。

顺便说一句:我知道我为“代码内”值准备语句可能看起来很愚蠢。但这只是一个例子。事实上,这些值取决于页码,但这并不重要——这个查询也给出了同样的错误。


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

【问题讨论】:

    标签: php mysql pdo mysql-error-1064


    【解决方案1】:

    这似乎是 php bug :PDO 忽略 PARAM_INT 常量并使用 $limit 和 $limitvalue 变量作为字符串。绑定时在查询中引用。

    尝试使用:

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

    强制变量类型为int。

    【讨论】:

    • 感谢您的回答。现在可以了。但是还有一个问题 - 为什么第二个参数 ($limit) 在没有 int 转换的情况下工作正常?我的意思是,如果我的 SQL 查询类似于 LIMIT X, Y,为什么只有 X 需要您提到的转换(因为 Y 可以正常工作)?它是指错误吗:)?
    • 我不知道。一定要喜欢那些虫子:p。
    • 这会导致错误。 PDOStatement::bindParam() 的参数 2 通过引用传递。 $limitvalue 和 $limit 的值必须转换为整数并存储在变量中(可以是相同的变量),然后传递这些变量。 php.net/manual/en/pdostatement.bindparam.php
    【解决方案2】:

    我认为sql中limit的第一个参数不能为NULL。如果您只想要前 10 条记录,请使用 LIMIT 10。

    【讨论】:

    • 它不是 NULL - 在代码中,$limitvalue = 0
    • 我也认为可能是问题所在。我已将其更改为 1,但仍然出现此错误。所以不,在这里没关系。
    猜你喜欢
    • 2011-12-16
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2016-03-10
    • 2015-04-25
    • 1970-01-01
    • 2012-10-22
    相关资源
    最近更新 更多