PDO mit IN-Klausel-Array verwenden
Wenn Sie PDO zum Ausführen einer Anweisung mit einer IN-Klausel verwenden, die ein Array für ihre Werte verwendet, können Sie kann auf unerwartetes Verhalten stoßen. Dieser Artikel erklärt, warum ein bestimmter Ansatz nicht funktioniert, und bietet alternative Lösungen.
Beispiel:
$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(); $my_results = $my_result->fetchAll();
Dieser Code funktioniert wie erwartet. Wenn Sie jedoch versuchen, benannte Parameter mit einer IN-Klausel zu verwenden, funktioniert der folgende Code nicht:
$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();
Erklärung:
PDO hat Schwierigkeiten mit der Verarbeitung von IN-Klauseln Arrays. Stattdessen müssen Sie eine Zeichenfolge mit Platzhaltern erstellen und diese in die Abfrage einfügen, um Array-Werte auf die übliche Weise zu binden.
Alternativen:
Verwendung von Positional Platzhalter
Erstellen Sie dynamisch eine Zeichenfolge mit Platzhaltern und fügen Sie sie in die ein Abfrage:
$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();
Verwendung benannter Platzhalter
Sie können die Funktion array_merge() verwenden, um alle Variablen in einem einzigen Array zusammenzufassen, einschließlich benannter Platzhalter:
// Other parameters that are going into query $params = ["foo" => "foo", "bar" => "bar"]; $ids = [1, 2, 3]; $in = ""; $i = 0; // Using an external counter because actual array keys could be dangerous 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($params, $in_params)); // Just merge two arrays $data = $stm->fetchAll();
Das obige ist der detaillierte Inhalt vonWarum funktioniert die IN-Klausel von PDO nicht mit Array-Parametern und wie kann ich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!