PHP PDO MySQL IN (?,?,? - PullRequest
       34

PHP PDO MySQL IN (?,?,?

4 голосов
/ 12 мая 2010

Я хочу написать оператор 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));

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

1 Ответ

6 голосов
/ 12 мая 2010

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

$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 - ничто не могло гарантировать, что все значения массива будут невинными целыми числами.

...