首页 > 后端开发 > php教程 > 如何在 PHP 中有效地将 PDO 的 IN 子句与数组结合使用?

如何在 PHP 中有效地将 PDO 的 IN 子句与数组结合使用?

Barbara Streisand
发布: 2024-12-19 19:45:19
原创
351 人浏览过

How Can I Effectively Use PDO's IN Clause with Arrays in PHP?

PHP - 将 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 (?)");
$my_result->execute([$in_values]);
$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 中的值匹配的所有项目,而是仅返回 my_value 与 $in_array 中的第一个项目匹配的项目。

未配备 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()。例如:

$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();
登录后复制

在具有命名占位符的场景中,该过程更加复杂,因为它涉及生成一系列占位符,例如:id0、:id1、:id2。

$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 id IN ($in)";
$stm = $db->prepare($sql);
$stm->execute(array_merge($params, $in_params));
$data = $stm->fetchAll();
登录后复制

幸运的是,命名占位符不需要严格的顺序,允许在任何位置合并数组序列。

以上是如何在 PHP 中有效地将 PDO 的 IN 子句与数组结合使用?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板