PHP PDO MySQL IN (?,?,?

Я хочу написать инструкцию MySQL, например:

SELECT * FROM someTable WHERE someId IN (value1, value2, value3, ...) 

Трюк в том, что я не знаю заранее, сколько значений будет в IN ().

Очевидно, я знаю, что могу сгенерировать запрос на ходу с помощью строковых манипуляций, однако, поскольку это будет работать в цикле, мне было интересно, могу ли я сделать это с помощью PDO PreparedStatement.

Что-то вроде:

 $query = $PDO->prepare('SELECT * FROM someTable WHERE someId IN (:idList)'); $query->bindValue(':idList', implode(',', $idArray)); 

Это возможно?

Это невозможно, как вы пытаетесь это сделать. У вас должен быть отдельный заполнитель для каждого параметра, который вы хотите передать, все остальное будет игнорировать назначение параметров (которые отделяют код от данных).

 $ids = array(2, 4, 6, 8); // prepare a string that contains ":id_0,..,:id_n" and include it in the SQL $plist = ':id_'.implode(',:id_', array_keys($ids)); $sql = "SELECT * FROM someTable WHERE someId IN ($plist)"; // prepare & execute the actual statement $parms = array_combine(explode(",", $plist), $ids); $stmt = $PDO->prepare($sql); $rows = $stmt->execute($parms); 

Если вам удалось передать массив значений одному параметру во время связывания, вам будет разрешено изменять инструкцию SQL. Это было бы лазейкой для SQL-инъекции – ничто не могло гарантировать, что все значения массива были бы невинными целыми числами.

 $sql = 'SELECT * FROM someTABLE WHERE someID IN(:ids)'; $sth = $PDO->prepare($sql); $sth->execute(array(':ids' => implode(',', $idArray))); $rows = $sth->fetchAll();