У меня есть поле формы, которое возвращает строку с разделителями-запятыми, которые я хочу передать в операцию 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);