首页 >后端开发 >php教程 >如何正确使用 PDO 的 IN 子句与数组:位置占位符与命名占位符?

如何正确使用 PDO 的 IN 子句与数组:位置占位符与命名占位符?

DDD
DDD原创
2024-12-28 01:37:09389浏览

How to Correctly Use PDO's IN Clause with Arrays: Positional vs. Named Placeholders?

将 PDO 与 IN 子句数组一起使用

使用 PDO 进行数据库操作时,经常会遇到在 IN 子句中使用数组的情况。但是,位置占位符与命名占位符的方法存在差异。

位置占位符

对于位置占位符,以下代码片段演示了正确的方法:

$in_array = [1, 2, 3];
$in_values = implode(',', $in_array);
$my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN ($in_values)");
$my_result->execute();
$my_results = $my_result->fetchAll();

但是,以下使用命名占位符的代码会产生意外的结果结果:

$in_array = [1, 2, 3];
$in_values = implode(',', $in_array);
$my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (:in_values)");
$my_result->execute([':in_values' => $in_values]);
$my_results = $my_result->fetchAll();

此代码只会返回 my_value 等于 $in_array (1) 中第一个元素的项目。

解决方案

PDO 以不同的方式处理这些场景。要解决此问题,请动态创建一个带有占位符的字符串,并将其插入到查询中,同时照常绑定数组值。对于位置占位符:

$in = str_repeat('?,', count($in_array) - 1) . '?';
$sql = "SELECT * FROM my_table WHERE my_value IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($in_array);
$data = $stm->fetchAll();

对于命名占位符,需要更复杂的方法,因为您需要创建命名占位符的序列,例如:id0,:id1,:id2.

// other parameters that are going into query
$params = ["foo" => "foo", "bar" => "bar"];

$ids = [1,2,3];
$in = "";
$i = 0; 
foreach ($ids as $item)
{
    $key = ":id" . $i++;
    $in .= ($in ? "," : "") . $key; 
    $in_params[$key] = $item; 
}

$sql = "SELECT * FROM table WHERE foo=:foo AND id IN ($in) AND bar=:bar";
$stm = $db->prepare($sql);
$stm->execute(array_merge($params, $in_params)); // just merge two arrays
$data = $stm->fetchAll();

与位置占位符不同,此方法允许以任意顺序合并数组。

以上是如何正确使用 PDO 的 IN 子句与数组:位置占位符与命名占位符?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn