Heim > Backend-Entwicklung > PHP-Tutorial > Warum funktioniert die IN-Klausel von PDO nicht mit Array-Parametern und wie kann ich das Problem beheben?

Warum funktioniert die IN-Klausel von PDO nicht mit Array-Parametern und wie kann ich das Problem beheben?

DDD
Freigeben: 2024-12-26 14:17:09
Original
788 Leute haben es durchsucht

Why Doesn't PDO's IN Clause Work with Array Parameters, and How Can I Fix It?

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();
Nach dem Login kopieren

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();
Nach dem Login kopieren

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();
Nach dem Login kopieren

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();
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage