PDO绑定未知数量的参数?

时间:2011-05-20 12:03:16

标签: php pdo

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

如果在运行时之前参数的数量未知,该怎么办?我唯一能想到的就是构建一个sql字符串,以便根据需要制作尽可能多的参数占位符。

4 个答案:

答案 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)前面添加它们。

这只是因为试图调试使用问号并且失败的东西。问题结果发生在其他地方(由于循环遍历数组以绑定值并且使用对变量的引用而遇到问题,这在数组的每次迭代中都发生了变化 - 因此在每个迭代中都有相同的值绑定位置),但认为这可能对某人有用。