Перевірте наступне:
$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.
Зверніть увагу, у мене є потрійна перевірка та кількість "?" відповідають кількості ідентифікаторів.
The $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 для відповіді № 1Відповідаючи на це, щоб вилучити його з відкритих списків запитань. Не видаляти, оскільки я не хочу отримувати заборону.
Додаток, який я використовую, розширює PDO і додає функцію для автоматичного розширення заповнювача в реченні IN (наприклад IN (:ids)
). Виявляється, це зламається, якщо ви зробите це так, як я зазначив у своєму питанні.
-2 для відповіді № 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);