首页 >后端开发 >php教程 >为什么 PDO 的 IN 子句不能使用数组参数,如何修复?

为什么 PDO 的 IN 子句不能使用数组参数,如何修复?

DDD
DDD原创
2024-12-26 14:17:09791浏览

Why Doesn't PDO's IN Clause Work with Array Parameters, and How Can I Fix It?

将 PDO 与 IN 子句数组结合使用

当使用 PDO 执行带有 IN 子句(该子句使用数组作为其值)的语句时,您可以可能会遇到意想不到的行为。本文解释了为什么特定方法不起作用并提供了替代解决方案。

示例:

$in_array = 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 子句一起使用,则以下代码将不会:

$in_array = 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(array(':in_values' => $in_values));
$my_results = $my_result->fetchAll();

说明:

PDO 难以处理 IN 子句数组。相反,您需要创建一个带有占位符的字符串并将其插入查询中,以通常的方式绑定数组值。

替代方案:

使用位置占位符

动态创建一个带有占位符的字符串并将其插入到查询:

$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();

使用命名占位符

您可以使用 array_merge() 函数将所有变量连接到单个数组中,包括命名占位符:

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

$ids = [1, 2, 3];
$in = "";
$i = 0; // Using an external counter because actual array keys could be dangerous
foreach ($ids as $item) {
    $key = ":id" . $i++;
    $in .= ($in ? "," : "") . $key; // :id0,:id1,:id2
    $in_params[$key] = $item; // Collecting values into a key-value array
}

$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