Heim >Backend-Entwicklung >PHP-Tutorial >Wie binde ich Array-Werte mithilfe von PDO ordnungsgemäß an eine MySQL IN-Anweisung?

Wie binde ich Array-Werte mithilfe von PDO ordnungsgemäß an eine MySQL IN-Anweisung?

Susan Sarandon
Susan SarandonOriginal
2024-12-04 22:27:11583Durchsuche

How to Properly Bind Array Values to a MySQL IN Statement Using PDO?

PDO-Bindungswerte für MySQL IN-Anweisung

Sie haben ein Problem, wenn Sie PDO verwenden, um ein Array von Werten an ein MySQL IN zu binden Stellungnahme. Ihr Ziel besteht darin, die Abfrage wie folgt auszuführen:

SELECT users.id
FROM users
JOIN products
ON products.user_id = users.id
WHERE products IN (1,2,3,4,5,6,7,8)

PDO wandelt jedoch die gebundenen Werte in eine durch Kommas getrennte Zeichenfolge um, was zu der folgenden fehlerhaften Abfrage führt:

SELECT users.id
FROM users
JOIN products
ON products.user_id = users.id
WHERE products IN ('1,2,3,4,5,6,7,8')

Sie haben versucht, die durch Kommas getrennte Zeichenfolge mithilfe einer benutzerdefinierten Funktion innerhalb der Abfrage selbst aufzuteilen, dies ist jedoch nicht optimal Lösung.

Lösung 1: Manuelles Erstellen der Abfrage

Wie in einer vorherigen Frage vorgeschlagen, können Sie die Abfrage manuell erstellen, indem Sie die Platzhalter für jeden IN-Klauselwert verketten. Zum Beispiel:

$products = array(1,2,3,4,5,6,7,8);
$placeholders = array_fill(0, count($products), '?');
$sql = "SELECT users.id
FROM users
JOIN products
ON products.user_id = users.id
WHERE products IN (" . implode(',', $placeholders) . ")";
$stmt = $pdo->prepare($sql);
$stmt->execute($products);

Lösung 2: Verwenden von find_in_set()

Sie können die Funktion find_in_set() verwenden, um einen Wert mit einer durch Kommas getrennten Zeichenfolge abzugleichen. Dieser Ansatz kann jedoch bei großen Datensätzen zu Leistungsproblemen führen, da jeder Wert in der Tabelle in einen Zeichentyp konvertiert werden muss.

$products = array(1,2,3,4,5,6,7,8);
$sql = "SELECT users.id
FROM users
JOIN products
ON products.user_id = users.id
WHERE find_in_set(cast(products.id as char), '" . implode(',', $products) . "') > 0";
$stmt = $pdo->prepare($sql);
$stmt->execute();

Lösung 3: Erstellen einer benutzerdefinierten Funktion

Die beste Lösung besteht darin, eine benutzerdefinierte Funktion (UDF) zu erstellen, die die durch Kommas getrennte Zeichenfolge aufteilt. Dies ist eine relativ komplexe Lösung, bietet jedoch die beste Leistung für IN-Klauseln mit Listen variabler Größe.

Anweisungen zum Erstellen der UDF finden Sie unter dem bereitgestellten Link.

Das obige ist der detaillierte Inhalt vonWie binde ich Array-Werte mithilfe von PDO ordnungsgemäß an eine MySQL IN-Anweisung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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