首頁 >後端開發 >php教程 >如何正確使用 PDO 的 IN 子句與陣列:位置佔位符與命名佔位符?

如何正確使用 PDO 的 IN 子句與陣列:位置佔位符與命名佔位符?

DDD
DDD原創
2024-12-28 01:37:09367瀏覽

How to Correctly Use PDO's IN Clause with Arrays: Positional vs. Named Placeholders?

將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 ($in_values)");
$my_result->execute();
$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 (1) 中第一個元素的項目。

PDO 以不同的方式處理這些場景。要解決此問題,請動態建立一個帶有佔位符的字串,並將其插入到查詢中,同時照常綁定數組值。對於位置佔位符:

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

對於命名佔位符,需要更複雜的方法,因為您需要建立命名佔位符的序列,例如:id0,:id1,:id2.

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

$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 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