Wie verwenden Sie IN-Klauseln mit mysqli Prepared Statements [Duplikat]
Frage
Diese Frage bereits eine Antwort hier:
Ich bin einigen alten Code auf die neue msqli Schnittstelle mit Prepared Statements bewegen, ich habe Probleme mit SQL-Anweisungen, die IN-Klausel enthalten. Ich würde dies nur normalerweise tun:
$ids = '123,535,345,567,878'
$sql = "SELECT * FROM table WHERE id IN ($ids)";
$res = mysql_query($sql);
Konvertieren dieser mysqli und vorbereitete Anweisungen habe ich eine Reihe von Lösungen versucht:
$ids = '123,535,345,567,878'
$ids = implode($ids,',');
$result = $msqli->prepare("SELECT foo,blar FROM table WHERE id IN (?));
$result->bind_param("i", $ids);
$result->execute();
Die oben versagt und die Anzahl der Elemente in dem Array zu berechnen und in dem SQL-Zeichenfolge Anzahl von Fragezeichen zu verändern und für jedes Element im Array Aufruf bind_parm schlägt ebenfalls fehl. Nur unter Verwendung der durch Komma getrennte Zeichenfolge schlägt ebenfalls fehl.
ich keine gute Dokumentation in Google auf diese finden kann, so wie haben Sie das Problem gelöst?
Lösung
Sehen Sie sich die Antwort auf eine ähnliche Frage, die hier gefragt wurde vor (zweites Codebeispiel):
ich habe, wie verwende ich jedes in einer mySQL-Abfrage (in pHP)?
Es läuft darauf hinaus:
- Erstellen Sie die SQL-Zeichenfolge mit der richtigen Menge von Fragezeichen
- Verwendung
call_user_func_array()
Array an den Query-String zu binden
Andere Tipps
Es ist nicht möglich, eine Liste mit variabler Länge auf eine einzige gebundene Variable zu binden.
Und falls Sie sind die Zeichenfolge $ids
zu binden, am Ende werden Sie tatsächlich mit:
SELECT foo,blar FROM table WHERE id IN ('123,535,345,567,878')
(Beachten Sie die Anführungszeichen um die Liste der IDs).
Erstellen Sie Ihre eigene Abfrage mit der richtigen Anzahl von Fragezeichen und gebundene Parameter tatsächlich gearbeitet haben sollten - Sie, dass erneut versuchen müssen, können und berichten über die tatsächlichen Fehler
.Alternativ kann diese eine jener Gelegenheiten sein kann, wo es leider notwendig ist Ihre eigene SQL-Hand-Handwerk und nicht gebunden Parameter verwenden.
dachte ich, der Punkt der vorbereiteten Anweisungen so in dieser Situation war man konnte einfach tun:
$stmt = $this->mysqli->prepare("UPDATE radcheck SET attribute = ?, value = ? WHERE username = ? AND attribute LIKE 'CS-Total-Octets%'");
foreach ($usernames as $username)
{
$stmt->bind_param('sss', $bandwidth_types[$bandwidth_type], $bandwidth_bytes, $username);
$stmt->execute();
}
$stmt->close();