pdo-将占位符Map到合并数组

hgc7kmma  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(342)

这来自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();

查询中的占位符如何Map到合并的 $params 阵列?名字是什么 foo , bar , baz 用作 $params 数组并将其Map到占位符?

yshpjwxd

yshpjwxd1#

不。 $params 会有数字键。从手册(我的重点):
如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个值。但是,如果数组包含数字键,则后面的值将不会覆盖原始值,而是附加在后面。
你的论点 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]);

相关问题