PHP PDO编写语句IN()数组

时间:2014-02-13 19:02:33

标签: php pdo prepared-statement

来自the PHP Manual

  

您不能将多个值绑定到单个命名参数,例如,SQL语句的IN()子句。

但是你可以使用问号参数标记来使用多个值吗?或者,每当值的数量发生变化时,您是否需要prepare()一个新的语句?

SELECT * FROM `table` WHERE `column` IN(?)

如果允许这样做,你如何使其发挥作用?

编辑:前面提到的两个问题都是关于命名的变量,手册中说这些变量不能绑定到多个参数。我问的是问号(匿名)变量。

1 个答案:

答案 0 :(得分:1)

这是我用来模拟所需结果的一些代码:

<?php
function preprepare(&$query, &$data) {
    preg_match_all('/\?/', $query, $matches, PREG_OFFSET_CAPTURE);
    $num = count($matches[0]);
    for ($i = $num; $i;) {
        --$i;
        if (array_key_exists($i, $data) && is_array($data[$i])) {
            $query = substr_replace($query, implode(',', array_fill(0, count($data[$i]), '?')), $matches[0][$i][1], strlen($matches[0][$i][0]));
            array_splice($data, $i, 1, $data[$i]);
        }
    }
}

$query = 'SELECT * FROM `table` WHERE `col1` = ? AND `col2` IN(?) AND `col3` = ? AND `col4` IN(?)';
$data = array('foo', array(1, 2, 3), 'bar', array(4, 2));
preprepare($query, $data);
var_dump($query, $data);
?>

输出:

array (size=2)
  0 => string 'SELECT * FROM `table` WHERE `col1` = ? AND `col2` IN(?,?,?) AND `col3` = ? AND `col4` IN(?,?)' (length=93)
  1 => 
    array (size=7)
      0 => string 'foo' (length=3)
      1 => int 1
      2 => int 2
      3 => int 3
      4 => string 'bar' (length=3)
      5 => int 4
      6 => int 2

然后可以在普通的PDO预处理语句中使用查询和数据。我不知道它是否能解释所有PDO神奇的好处,但到目前为止效果还不错。