$statement = $db->prepare('SELECT blah FROM blah_table WHERE blahID IN (:a, :b, :c)');
Что, если количество параметров неизвестно до времени выполнения? Единственное, что я могу придумать, это хакерский тип построения строки sql, чтобы сделать столько же заполнителей параметров, сколько мне нужно.
Строку «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).
Только это произошло из-за попытки отладки чего-то, что использовало вопросительные знаки и не срабатывало. Проблема оказалась в другом месте (из-за того, что цикл привязывался к массиву для привязки значений и имел проблемы с привязкой, используя ссылку на переменную, которая была изменена на каждой итерации массива – следовательно, приземление с одинаковым значением в каждом из привязать позиции), но подумал, что это может быть полезно кому-то.