PDO 允許您執行包含具有值數組的 IN 子句的 SQL 語句。雖然此方法適用於字串連接 (implode()),但在使用佔位符時可能會導致問題。
識別問題
以下程式碼使用佔位符,不會傳回所有預期的項目:
$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)); $my_results = $my_result->fetchAll();
此程式碼僅傳回所有預期的項目:
此程式碼只傳回所有預期的項目:
此程式碼只傳回所有預期的項目:
$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();
此程式碼只回傳my_value 等於的項目$in_array 中的第一個元素(1),而不是其他元素(2 和3)。
位置佔位符的解決方案$ids = [1,2,3]; $in = ""; $i = 0; foreach ($ids as $item) { $key = ":id" . $i++; $in .= ($in ? "," : "") . $key; // :id0,:id1,:id2 $in_params[$key] = $item; // collecting values into a key-value array } $sql = "SELECT * FROM table WHERE foo=:foo AND id IN ($in) AND bar=:bar"; $stm = $db->prepare($sql); $stm->execute(array_merge(["foo" => "foo", "bar" => "bar"], $in_params)); // merge two arrays $data = $stm->fetchAll();PDO 需要動態建立具有佔位符的字串並將其插入查詢中,同時像往常一樣綁定數組值。對於位置佔位符,此解決方案有效:命名佔位符解決方案命名佔位符的方法涉及創建一系列佔位符符(例如:id0、 :id1, :id2) 並將值收集到鍵值數組中。以下是一個範例:透過遵循這些解決方案,您可以成功地將 PDO 與包含值陣列的 IN 子句結合使用。
以上是如何在 PHP 中正確使用 PDO 與 IN 子句和陣列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!