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

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

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

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

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

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

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

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

 $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); 

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

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

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