当使用 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(array(':in_values' => $in_values));
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);
对于命名占位符:
// collect parameters for query $params = ["foo" => "foo", "bar" => "bar"]; // prepare IN clause placeholders and values $ids = [1,2,3]; $in = ""; $i = 0; foreach ($ids as $item) { $key = ":id" . $i++; $in .= ($in ? "," : "") . $key; $in_params[$key] = $item; } // construct query and execute $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));
以上是为什么在使用带有占位符数组的 IN 子句时 PDO 会返回意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!