Передача значений операции MySQL IN в PDO подготовлена ​​инструкция? - PullRequest
4 голосов
/ 19 января 2011

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

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

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

Ответы [ 3 ]

9 голосов
/ 19 января 2011

Нельзя передавать несколько значений в одном заполнителе.Вам нужно будет ввести другой заполнитель для каждого значения, которое будет передано в 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) ;
0 голосов
/ 19 января 2011

Хитрость заключается в том, чтобы распознать, что $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);
0 голосов
/ 19 января 2011

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

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

db("SELECT * FROM table WHERE id IN (??)", explode(",",$values));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...