Мой код:
$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, а затем он будет анализировать массив и изменять строку для вас, используя имена связывания, сгенерированные на летать, а затем передавать эти значения массива