这来自phpDelusions.net:
“如果查询中还有其他占位符,则可以使用
array_merge()
函数将所有变量连接到单个数组中,并以数组的形式添加其他变量,并按照它们在您的列表中出现的顺序查询:”
$arr = [1,2,3];
$in = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE foo=? AND column IN ($in) AND bar=? AND baz=?";
$stm = $db->prepare($sql);
$params = array_merge([$foo], $arr, [$bar, $baz]);
$stm->execute($params);
$data = $stm->fetchAll();
查询中的占位符如何映射到合并的$params
数组?
foo
,bar
,baz
用作$params
数组的键并将其映射到占位符吗?
答案 0 :(得分:0)
不。 $params
将具有数字键。来自the manual(重点是我):
如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个。 但是,如果数组包含数字键,则后面的值将不会覆盖原始值,而是将其附加。
您用于array_merge()
的参数没有字符串键:
$params = array_merge(
[$foo], // [0 => $foo]
$arr, // [0 => 1, 1 => 2, 2 => 3]
[$bar, $baz] // [0 => $bar, 1 => $baz]
);
由于这些是数字键,因此将附加值,并且$params
最终将看起来像这样:
Array
(
[0] => $foo
[1] => 1
[2] => 2
[3] => 3
[4] => $bar
[5] => $baz
];
这些值将按该顺序传递到查询中的占位符,因此,如果在查询条件周围移动,还需要更改array_merge()
以确保值的顺序相同。
例如,如果您移动bar=?
条件并将查询更改为:
SELECT * FROM table WHERE foo=? AND bar=? AND column IN ($in) AND baz=?
然后,您还必须移动$bar
的值,并将array_merge()
更改为:
$params = array_merge([$foo, $bar], $arr, [$baz]);