PDO ermöglicht Ihnen die Ausführung von SQL-Anweisungen, die eine IN-Klausel mit einem Array von Werten enthalten. Dieser Ansatz funktioniert zwar gut mit der Zeichenfolgenverkettung (implode()), kann jedoch bei der Verwendung von Platzhaltern zu Problemen führen.
Identifizieren des Problems
Der folgende Code, der verwendet Platzhalter, gibt nicht alle erwarteten Elemente zurück:
$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();
Dieser Code gibt nur das Element zurück, dessen my_value dem ersten Element im entspricht $in_array (1), nicht die anderen (2 und 3).
Lösung für Positionsplatzhalter
PDO erfordert die dynamische Erstellung einer Zeichenfolge mit Platzhaltern und deren Einfügen in die Abfrage beim Binden von Array-Werten wie gewohnt. Für Positionsplatzhalter funktioniert diese Lösung:
$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();
Lösung für benannte Platzhalter
Der Ansatz für benannte Platzhalter beinhaltet die Erstellung einer Folge von Platzhaltern (z. B. :id0, :id1, :id2) und Sammeln der Werte in einem Schlüsselwert-Array. Hier ist ein Beispiel:
$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();
Wenn Sie diese Lösungen befolgen, können Sie PDO erfolgreich mit einer IN-Klausel verwenden, die ein Array von Werten enthält.
Das obige ist der detaillierte Inhalt vonWie verwende ich PDO mit einer IN-Klausel und einem Array in PHP richtig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!