例如,您不能在SQL语句的IN()子句中将多个值绑定到单个命名参数。
但是您可以使用问号参数标记使用多个值吗?还是每次数值数量更改时都必须prepare()
一个新语句?
SELECT * FROM `table` WHERE `column` IN(?)
如果允许的话,您如何使它工作?
编辑:前面提到的两个问题都与named变量有关,手册指出不能将其绑定到多个参数。我在问问号(匿名)变量。
这里有一些代码,我模拟了所需的结果:
<?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的魔术问题,但到目前为止效果很好。