【问题标题】:MySQL Error 1064 Using LIMIT ClauseMySQL 错误 1064 使用 LIMIT 子句
【发布时间】:2013-09-10 15:01:13
【问题描述】:

我在通过 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;DR;为什么我的预处理语句在使用 LIMIT 子句时会失败并出现 1064 错误?

【问题讨论】:

  • 因为到目前为止,LIMIT 的值还不允许参数化,除非您使用一些用户定义的类,例如 safemysql
  • 有意思,所以我这里的解决方案是手动验证限制值,直接放到查询中?您应该将此作为答案发布,因为我相信许多其他人不知道 LIMIT 无法参数化!
  • 无论如何,LIMIT 的值是整数,因此很容易验证 (int)$var
  • @491243 对,我使用intval() 函数——但前提相同。谢谢!

标签: php mysql pdo prepared-statement


【解决方案1】:

我认为这可能是重复 PDO Mysql Syntax error 1064

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

【讨论】:

  • 要添加到您的答案中 491243 所说的,PHP 的 PDO 不支持使用“?”参数化查询以及传入execute 方法的值数组。
【解决方案2】:

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

【讨论】:

  • 这不是之前的回答所说的吗?
猜你喜欢
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 2011-02-11
  • 2015-07-03
  • 1970-01-01
  • 2011-04-17
  • 2011-05-16
  • 2010-09-19
相关资源
最近更新 更多