pdo计算硬编码IN子句作为需要参数

时间:2016-02-19 20:03:16

标签: php pdo

查看以下内容:

$idPlaceholders = implode(',', array_fill(0, count($ids), '?'));
$query = $db->prepare('
    SELECT *
    FROM sometable
    WHERE
      id IN(' . $idPlaceholders . ')
      AND status IN ("open", "reopened")
');
$query->execute($ids);

当我运行它时,我收到以下错误:

  

PHP警告:PDOStatement :: execute():SQLSTATE [HY093]:参数号无效:绑定变量数与令牌数不匹配

如果我删除了AND status IN (...)条款,它运行正常。我做错了什么?我认为PDO 会忽略硬编码值。

注意,我有三重检查和“?”的数量匹配id的数量。

$ids数组是一个索引数组(这里是var_dump):

array 3
    0 => int 23
    1 => int 45
    2 => int 67

呈现的查询如下所示:

SELECT *
FROM mytable
WHERE
  id IN (?,?,?)
  AND status IN ("open", "reopened")

2 个答案:

答案 0 :(得分:0)

回答这个问题,以便从打开的问题列表中删除它。不删除,因为我不想被禁止。

我正在使用的应用程序扩展了PDO并添加了一个功能来自动扩展IN子句中的占位符(例如IN (:ids))。事实证明,如果你按照我在问题中概述的方式进行操作就会中断。

答案 1 :(得分:-2)

你可以尝试一下吗?

$idPlaceholders = implode(',', array_fill(0, count($ids), '?'));
$query = $db->prepare('
SELECT *
FROM sometable
WHERE
  id IN(' . $idPlaceholders . ')
  AND status IN (?, ?)
');
$ids[]="open";
$ids[]="reopened";
$query->execute($ids);