Параметры привязки для предложения WHERE IN с PDO

Мой код:

$myArray = implode($myArray, ',');
$sth = $dbh->prepare('SELECT foo FROM bar WHERE ids IN (:ids)');
$sth->bindParam(':ids', $myArray);
$sth->execute();
$result = $sth->fetch();
echo $sth->rowCount();

Всегда показывает число в 1, но когда я пропускаю параметризацию и просто добавляю в нее переменную, я получаю точный счет. Что здесь происходит?

Ответ 1

Вы не можете привязать параметр для предложения IN так. Строка $myArray будет считаться только одним значением, например, если вы сделали это:

SELECT foo FROM bar WHERE ids IN ('1,2,3')

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

Вам нужно вручную вставить список IN в запрос, путь старой школы.

'SELECT foo FROM bar WHERE ids IN (' . $myArray .')'

К сожалению, нет другого пути. По крайней мере на данный момент.

Ответ 2

Я знаю, что этот вопрос старый, но это работает для меня:

$arrayOfValues = array(1,2,3,4,5);
$questionMarks = join(",", array_pad(array(), count($arrayOfValues), "?"));
$stmt = $dbh->prepare("update some_table set end_date = today where value_no in ($questionMarks)");
$stmt->execute($arrayOfValues);

Ответ 3

Почему вы не используете это решение?

fooobar.com/info/523017/...

Он анализирует массив значений, являющихся парами заполнителей связывания и его элементов, в случае IN вам просто нужно передать Array, а затем он проанализирует массив и изменит строку для вас, используя имена связывания генерируемые "на лету", а затем подают эти значения массива