【问题标题】:PHP PDO error when using placeholders in the LIMIT clause of a MySQL query [duplicate]在 MySQL 查询的 LIMIT 子句中使用占位符时出现 PHP PDO 错误 [重复]
【发布时间】:2015-08-04 01:33:15
【问题描述】:
$sql = "SELECT sql_calc_found_rows * FROM members".
       " ORDER BY username LIMIT :startRow, :numRows";

try {
    $st = $conn->prepare($sql);
    $st->bindParam(":startRow", $startRow, PDO::PARAM_INT);
    $st->bindParam(":numRows", $numRows, PDO::PARAM_INT);
    $st->execute();
} catch (PDOException $e) {
    die("Query failed: " . $e->getMessage());
}

这里出现错误:

查询失败:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在第 1 行的“5”附近使用的正确语法。

LIMIT :startRow, :numRows:numRows 中有问题。

$st->bindParam$st->bindValue 我都试过了,都不行。

【问题讨论】:

  • 你可以尝试删除:startRow, :numRows之间的空白
  • 选择 sql_calc_found_rows * FROM ??这是什么?
  • Jens,我试过了,但它不起作用。它只在 :numRows 中显示问题。
  • 错误是因为 $order 请输入静态值进行测试。休息一切看起来都很完美
  • $order 的 Danyal 值是“用户名”,而 sql_calc_found_rows 是我猜想检索表中行数的 sql 函数

标签: php mysql pdo


【解决方案1】:

我认为问题出在 TBL_MEMBERS 我想这是一个视图(子选择)。 因此,例如,如果您有产品表并且想要执行以下语句:

select sql_calc_found_rows * from select id, code, name, slug, info from products order by code

您将收到以下错误:

SQL 错误 (1064):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 1 行的“从产品订单中选择 ID、代码、名称、slug、信息”附近使用正确的语法

但如果您将查询更改为:

select sql_calc_found_rows * from (select id, code, name, slug, info from products) v order by code

这会起作用。

总结一下, TBL_MEMBERS 是一个视图,应该放在括号中并给出别名(我的示例别名是'v')

【讨论】:

  • TBL_MEMBERS 是一个定义。 define("TBL_MEMBERS","members");我不认为这是问题。
【解决方案2】:

我建议查看 PDO 实际生成的 SQL 查询文本。你可以在 MySQL 的general query log 的帮助下做到这一点。

很可能,$startRow 和/或$numRows 的正式类型是字符串,而不是整数,因此生成的查询类似于LIMIT '0', '5'(语法错误)而不是LIMIT 0, 5(正确)。

问题是,即使使用PDO::PARAM_INT,当参数的形式类型不是整数时(is_int 返回false),PDO 也会将其包装在引号中。因此,您必须在绑定参数之前将参数转换为整数(例如使用intval):

$st->bindParam(":startRow", intval(trim($startRow)), PDO::PARAM_INT);
$st->bindParam(":numRows", intval(trim($numRows)), PDO::PARAM_INT);

【讨论】:

    【解决方案3】:

    我解决了。我输入了:numRows 占位符。

    $numRows=(int)$numRows;
    $sql = 'SELECT sql_calc_found_rows * FROM ' . 
        TBL_MEMBERS .'ORDER BY'.  $order .'LIMIT :startRow,:numRows';
        try {
            $st = $conn->prepare($sql);
            $st->bindValue(":startRow", $startRow, PDO::PARAM_INT);
            $st->bindValue(":numRows", $numRows, PDO::PARAM_INT);
            $st->execute();
        ...
    

    它奏效了。我还注意到应该使用' 而不是"

    【讨论】:

      猜你喜欢
      • 2012-05-23
      • 1970-01-01
      • 2012-07-29
      • 2023-01-22
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      相关资源
      最近更新 更多