PDO zeichnet sich durch die Ausführung von Anweisungen mit IN-Klauseln aus, wenn Arrays für ihre Werte verwendet werden, wie im folgenden Code dargestellt:
$in_array = [1, 2, 3]; $in_values = implode(',', $in_array); $my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (?)"); $my_result->execute([$in_values]); $my_results = $my_result->fetchAll();
Der folgende Code zeigt jedoch unerwartetes Verhalten:
$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();
Anstelle von Dieser Code gibt alle Elemente zurück, deren my_value mit Werten in $in_array übereinstimmt. Dieser Code gibt nur das Element zurück, dessen my_value mit dem ersten Element in $in_array übereinstimmt.
PDO ist nicht dafür gerüstet, solche Szenarien effektiv zu bewältigen. Um Arrays in IN-Klauseln zu verwenden, müssen wir dynamisch eine Zeichenfolge mit Platzhaltern generieren und diese in die Abfrage einfügen. Bei Positionsplatzhaltern lautet die Lösung wie folgt:
$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 Fälle mit mehreren Platzhaltern sollten Sie die Nutzung von array_merge() in Betracht ziehen. Zum Beispiel:
$arr = [1, 2, 3]; $in = str_repeat('?,', count($arr) - 1) . '?'; $sql = "SELECT * FROM table WHERE foo=? AND column IN ($in) AND bar=? AND baz=?"; $stm = $db->prepare($sql); $params = array_merge([$foo], $arr, [$bar, $baz]); $stm->execute($params); $data = $stm->fetchAll();
In Szenarien mit benannten Platzhaltern ist der Prozess komplizierter, da er die Generierung einer Folge von Platzhaltern beinhaltet, zum Beispiel :id0, :id1, :id2.
$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 id IN ($in)"; $stm = $db->prepare($sql); $stm->execute(array_merge($params, $in_params)); $data = $stm->fetchAll();
Glücklicherweise erfordern benannte Platzhalter keine strenge Reihenfolge, sodass Arrays in beliebigen Arrays zusammengeführt werden können Reihenfolge.
Das obige ist der detaillierte Inhalt vonWie kann ich die IN-Klausel von PDO effektiv mit Arrays in PHP verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!