Heim > Backend-Entwicklung > PHP-Tutorial > Wie verwende ich die IN-Klausel von PDO korrekt mit Arrays: Positions- oder benannte Platzhalter?

Wie verwende ich die IN-Klausel von PDO korrekt mit Arrays: Positions- oder benannte Platzhalter?

DDD
Freigeben: 2024-12-28 01:37:09
Original
397 Leute haben es durchsucht

How to Correctly Use PDO's IN Clause with Arrays: Positional vs. Named Placeholders?

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

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

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

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

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!

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