Могу ли я связать массив с условием IN ()? - PullRequest
536 голосов
/ 28 мая 2009

Мне любопытно узнать, возможно ли привязать массив значений к заполнителю с помощью PDO. Вариант использования здесь пытается передать массив значений для использования с условием IN().

Я бы хотел сделать что-то вроде этого:

<?php
$ids=array(1,2,3,7,8,9);
$db = new PDO(...);
$stmt = $db->prepare(
    'SELECT *
     FROM table
     WHERE id IN(:an_array)'
);
$stmt->bindParam('an_array',$ids);
$stmt->execute();
?>

И PDO должен связывать и заключать в кавычки все значения в массиве.

На данный момент я делаю:

<?php
$ids = array(1,2,3,7,8,9);
$db = new PDO(...);
foreach($ids as &$val)
    $val=$db->quote($val); //iterate through array and quote
$in = implode(',',$ids); //create comma separated list
$stmt = $db->prepare(
    'SELECT *
     FROM table
     WHERE id IN('.$in.')'
);
$stmt->execute();
?>

Что, безусловно, делает работу, но просто интересно, есть ли встроенное решение, которое мне не хватает?

Ответы [ 21 ]

0 голосов
/ 26 июня 2014

Я пошел еще дальше, чтобы приблизить ответ к первоначальному вопросу об использовании заполнителей для связывания параметров.

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

//builds placeholders to insert in IN()
foreach($array as $key=>$value) {
    $in_query = $in_query . ' :val_' . $key . ', ';
}

//gets rid of trailing comma and space
$in_query = substr($in_query, 0, -2);

$stmt = $db->prepare(
    "SELECT *
     WHERE id IN($in_query)";

//pind params for your placeholders.
foreach ($array as $key=>$value) {
    $stmt->bindParam(":val_" . $key, $array[$key])
}

$stmt->execute();
...