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