$statement = $db->prepare('SELECT blah FROM blah_table WHERE blahID IN (:a, :b, :c)');
如果在运行时之前参数的数量未知,该怎么办?我唯一能想到的就是构建一个sql字符串,以便根据需要制作尽可能多的参数占位符。
答案 0 :(得分:11)
并非真正的hacky,循环是循环可变次数的语言的一部分。
$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后循环。
答案 1 :(得分:4)
您可以动态构建“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 :(得分:2)
另一种更短的方式。
$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);
答案 3 :(得分:0)
一种没有显式循环但是给出特定标记而不是问号的方法。
$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)前面添加它们。
这只是因为试图调试使用问号并且失败的东西。问题结果发生在其他地方(由于循环遍历数组以绑定值并且使用对变量的引用而遇到问题,这在数组的每次迭代中都发生了变化 - 因此在每个迭代中都有相同的值绑定位置),但认为这可能对某人有用。