Подтвердить что ты не робот

PDO связывает неизвестное количество параметров?

$statement = $db->prepare('SELECT blah FROM blah_table WHERE blahID IN (:a, :b, :c)');

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

4b9b3361

Ответ 1

Вы можете построить строку "IN (...)" динамически:

$in_string = '(';
foreach ( $array_of_parameters as $parameter ) {
    $in_string .= ':' . chr($i + 97) . ','; // Get the ASCII character
}
$in_string = substr($in_string, 0, -1) . ')';

$statement = $db->prepare("SELECT blah FROM blah_table WHERE blahID IN ($in_string)");

Ответ 2

Не очень взломанный, петли являются частью языка для циклического перебора числа раз.


$values = array('val1', 'val2');
$sql = 'SELECT * FROM Table Where column IN(';
$params = array();
foreach ($values as $val)
{
    $params[] = '?';
    $binds[] = $val;
}
$prep = $db->prepare($sql . join(', ', $params) . ')');
$i = 0;
foreach($binds as $bind){
   $prep->bindValue(++$i, $bind);
}
$prep->execute();

Прокрутите каждое значение, которое необходимо связать, создайте массив объектов привязки, которые вы зацикливаете после добавления SQL.

Ответ 3

Еще один более короткий способ сделать это.

$values = array(1, 2, 3, 4);
$sql = "SELECT * 
          FROM table
         WHERE column IN (" . join(',', array_map(function() { return '?'; }, $values)) . ")";
$db->prepare($sql);
$db->execute($values);

Ответ 4

Способ сделать это без явного цикла, но с указанием определенных маркеров, а не вопросительных знаков.

$values_array = array(1, 3, 5, 7, 11);
$sql = "SELECT * 
          FROM table
         WHERE column IN (" . implode(",", array_map(function($in){return ':a'.$in;}, range(1, count($values)))) . ")";
$prep = $db->prepare($sql);
$i = 1;
foreach($values_array as $key=>$value)
{
   $prep->bindValue(':a'.$i++, $values_array[$key]);
}

Это использует диапазон для генерации массива чисел от 1 до количества элементов в массиве, затем array_map, чтобы изменить эти числа, чтобы добавить их с помощью: и символа (в данном случае просто a).

Только это произошло из-за попытки отладки чего-то, что использовало вопросительные знаки и не срабатывало. Проблема оказалась в другом месте (из-за того, что цикл привязывался к массиву для привязки значений и имел проблемы с привязкой, используя ссылку на переменную, которая была изменена на каждой итерации массива - следовательно, приземление с одинаковым значением в каждом из привязать позиции), но подумал, что это может быть полезно кому-то.