【发布时间】: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