PHP PDO Prepared Statement参数导致错误

标签 php mysql pdo prepared-statement

我在使用带有参数的准备好的语句时遇到问题,请参阅下文。

如果这是一个愚蠢的错误,我提前道歉。

错误:

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/

相关文章:

php - 使用 PDO ODBC SQL Server 连接时定义编码?

php - fatal error : Call to undefined function bindParam()

php - 排除 Laravel 从模型结果附加值

php - Zend-Framework2。查询

mysql - 服务器是否为本地主机 :3306 an issue? phpMyAdmin

MySQL - 对 SELECT 结果进行 UNION

php - 为什么这个 PDO 语句会默默地失败?

php - 如何从 Controller 方法重定向到路由

php - 为什么本应该发布公司名称却发布 ID?

php - 如何压缩文件夹并使用php下载它?