PDO mit IN-Klausel-Array verwenden
Bei der Verwendung von PDO für Datenbankoperationen kommt es häufig vor, dass Arrays in der IN-Klausel verwendet werden. Es ergeben sich jedoch Unterschiede im Ansatz für Positionsplatzhalter im Vergleich zu benannten Platzhaltern.
Positionsplatzhalter
Für Positionsplatzhalter zeigt das folgende Codefragment einen korrekten Ansatz:
$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();
Der folgende Code, der benannte Platzhalter verwendet, führt jedoch zu unerwarteten Ergebnissen Ergebnisse:
$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();
Dieser Code würde nur das Element zurückgeben, dessen my_value dem ersten Element in $in_array (1) entspricht.
Lösung
PDO geht mit diesen Szenarien unterschiedlich um. Um dieses Problem zu beheben, erstellen Sie dynamisch eine Zeichenfolge mit Platzhaltern und fügen Sie diese in die Abfrage ein, während Sie wie gewohnt Array-Werte binden. Für Positionsplatzhalter:
$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();
Für benannte Platzhalter ist ein komplexerer Ansatz erforderlich, da Sie eine Sequenz der benannten Platzhalter erstellen müssen, z. B. :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();
Dieser Ansatz ermöglicht das Zusammenführen von Arrays in beliebiger Reihenfolge, im Gegensatz zu Positionsplatzhaltern.
Das obige ist der detaillierte Inhalt vonWie verwende ich die IN-Klausel von PDO korrekt mit Arrays: Positions- oder benannte Platzhalter?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!