PDO-将占位符映射到合并数组

时间:2018-07-22 11:16:32

标签: php mysql pdo

这来自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数组?

将名称foobarbaz用作$params数组的键并将其映射到占位符吗?

1 个答案:

答案 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]);