3

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

// Query Parameters
$params = array( 1, 5 );

// Get Products
$query = "SELECT * FROM mydb.Product
          WHERE ProductId >= ?
            AND IsApproved = 1
            AND IsPublic = 1
          LIMIT ?";

// Get Database Instance
$dbh = App\App::getDatabase()->getInstance();

// Prepare Query
if( $stmt = $dbh->prepare($query) )
{
   if( $stmt->execute($params) )
   {
       // Return Records
   }
}

从查询中删除该LIMIT ?部分会按预期返回所有结果。相反,当尝试使用 LIMIT 并将5作为值传递时,我收到此错误:

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

准备后PDOStatement对象的转储显示:

object(PDOStatement)[59]
    public 'queryString' => string 'SELECT * FROM mydb.Product
       WHERE ProductId >= ?
       AND IsApproved = 1
       AND IsPublic = 1
       LIMIT ?'

我试过在查询的末尾加上一个分号,但这给出了同样的错误。我是否有脑胀气并且遗漏了一些明显的东西?


TL;博士; 为什么我的预处理语句在使用 LIMIT 子句时会失败并出现 1064 错误?

4

2 回答 2

3

我认为这可能是 PDO Mysql 语法错误 1064的重复

解决方案是绑定限制参数,强制它是一个 int 而不是具有简单 (int) 强制转换的字符串。

于 2013-09-10T15:09:20.610 回答
0

只需将 (int) 放在您的极限值之前

于 2016-07-01T16:59:28.670 回答