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

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

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

Solutions Collecting From Web of "PDO связывает неизвестное количество параметров?"

Строку «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)"); 

Не очень хаки, петли – часть языка для циклического перебора числа раз.

 $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.

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

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

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

 $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).

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