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!