我在使用带有参数的准备好的语句时遇到问题,请参阅下文。
如果这是一个愚蠢的错误,我提前道歉。
错误:
Failed to run query (Project List) - SQLSTATE[42000]: Syntax error or access violation: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0,8'' at line 1
代码:
$limit = ($pagenum - 1) * $page_rows . "," . $page_rows;
print_r($limit); // Prints 0,8 as expected
$query = "SELECT * FROM projects INNER JOIN users ON projects.companyid = users.companyid ORDER BY projects.projectid DESC LIMIT :limit";
$query_params = array (
':limit' => $limit
);
try {
$stmt = $db->prepare($query);
$stmt->execute($query_params);
}
catch (PDOException $ex) {
die("Failed to run query (Project List)" . " - " . $ex->getMessage());
}
到目前为止我尝试了什么:
- 将 SQL 限制添加为
$limit
字符串的一部分 - 重命名限制参数/变量以防万一(保留关键字等)
- 使用
LIMIT 0,8
在 SQLyog 中手动测试 SQL 查询 - 工作正常 - 通过直接传递 limit 变量来测试准备好的语句 - 工作正常
- 阅读所有提示的类似问题,至少在我的理解范围内没有发现类似问题。
最佳答案
您的 $limit 参数被作为一个参数转义,而它应该作为两个参数转义。您的 sql 当前看起来类似于“limit '0, 8';”它应该看起来像“limit 0, 8”;
要解决这个问题,您应该将限制参数一分为二。将 SQL 的末尾编辑为如下所示:
LIMIT :offset, :limit
你的参数列表看起来像:
$query_params = array (
':offset' => ($pagenum - 1) * $page_rows,
':limit' => $page_rows
);
正如 Smith 先生提到的,您还必须添加以下行:
$db->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
确保限制参数被正确处理为整数而不是字符串。
关于PHP PDO Prepared Statement参数导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25743953/