首頁 >後端開發 >php教程 >為什麼在使用具有佔位符數組的 IN 子句時 PDO 會傳回意外結果?

為什麼在使用具有佔位符數組的 IN 子句時 PDO 會傳回意外結果?

Barbara Streisand
Barbara Streisand原創
2024-12-21 08:31:13947瀏覽

Why Does PDO Return Unexpected Results When Using an IN Clause with an Array of Placeholders?

將 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(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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn