2016-02-19 1 views
0

проверьте следующее: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 warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

Если удалить пункт AND status IN (...), он работает нормально. Я что-то не так? У меня создалось впечатление, что жестко закодированные значения игнорируются PDO.

Обратите внимание, что у меня есть тройной чек и число «?» соответствует количеству идентификаторов.

$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") 
+0

Можете ли вы показать sql как создается после того, как переменная '$ idPlaceholders 'подстроена? – Ray

+1

'var_dump ($ ids);' !! – Webinan

+0

Может возникнуть проблема с индексами в ваших $ ids. Покажи нам свалку, пожалуйста. Или попробуйте применить 'sort()' к ним перед 'execute()'. –

ответ

-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); 
+0

Это, скорее всего, будет работать, но это не отвечает на вопрос OP. Он также должен иметь возможность кодировать значения в свой запрос. –

0

Ответ на это, чтобы удалить его из открытых списков вопросов. Не удалять, поскольку я не хочу, чтобы меня запретили.

Приложение, которое я использую, расширяет PDO и добавляет функцию автоматического разворачивания заполнителя в предложении IN (например,). Оказывается, он ломается, если вы делаете это так, как я изложил в своем вопросе.