Параметры привязки для предложения WHERE IN с PDO - PullRequest
13 голосов
/ 12 августа 2011

Мой код:

$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, но когда я пропускаю параметризацию и просто добавляю саму переменную на свое место, я получаю точный счет. Что здесь происходит?

Ответы [ 3 ]

11 голосов
/ 12 августа 2011

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

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

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

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

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

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

7 голосов
/ 02 октября 2014

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

$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);
0 голосов
/ 06 сентября 2016

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

https://stackoverflow.com/a/39353278/1834212

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...