Передача значений в MySQL IN в подготовленном заявлении PDO?

У меня есть поле формы, которое возвращает строку с разделителями-запятыми, которые я хочу передать в операцию IN IN PHP PDO MySQL, но для операции IN требуется, чтобы значения были разделены запятыми (в отличие от моей строки с разделителями) ,

Как мне это сделать?

$values = $_POST['values']; # '10,5,4,3' (string) $query = "SELECT * FROM table WHERE id IN (:values)"; $data = array( ':values' => $values ); 

Вы не можете передавать несколько значений в одном заполнителе. Вам нужно будет ввести другой заполнитель для каждого значения, которое должно быть передано в IN () . Поскольку вы не знаете, сколько их будет, используйте ? вместо названных параметров.

 $values = explode(',', $values) ; $placeholders = rtrim(str_repeat('?, ', count($values)), ', ') ; $query = "SELECT * FROM table WHERE id IN ($placeholders)"; $stm = $db->prepare($query) ; $stm->execute($values) ; 

Только PDO не может привязывать массивы к :parameter Для этого вам нужна вспомогательная функция.

Также в вашем примере буквальная строка '10,5,4,3' будет приниматься как одно значение. Связывание параметров превратит его в .. id IN ('10,5,4,3') а не в сравнение списка.

Обходным путем в вашем случае будет отказ от использования динамического SQL и экранирования.

 $values = preg_replace('/[^\d,]/', "", $_POST['values']); $query = "SELECT * FROM table WHERE id IN ($values)"; 

Я лично использую функцию wrapper / helper, которая имеет специальный синтаксис для массивов (но на самом деле у вас на самом деле нет этого, поэтому это будет двойное обходное решение):

 db("SELECT * FROM table WHERE id IN (??)", explode(",",$values)); 

Хитрость заключается в том, чтобы признать, что $values – это совокупность отдельных значений, и задайте этот вопрос с учетом этого. Это проще сделать, если вы используете ? заполнители вместо именных заполнителей. Например, вы можете сделать что-то вроде следующего:

 $values = explode(',', $_POST['values']); //array(10,5,4,3) $placeholder_string = implode(',', array_fill(0, count($values), '?')); // string '?,?,?,?' $query = "SELECT * FROM table WHERE id IN ($placeholder_string)"; $statement = $db->prepare($query); $statement->execute($values);