当使用数组作为其值时,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中文网其他相关文章!