2009-04-21 12 views
12

Ich habe einige alte Code mit vorgefertigten Anweisungen auf die neue msqli-Schnittstelle übertragen, ich habe Probleme mit SQL-Anweisungen, die die IN-Klausel enthalten. Ich würde dies nur normalerweise tun:Wie verwenden Sie IN-Klauseln mit mysqli vorbereiteten Anweisungen

$ids = '123,535,345,567,878' 
$sql = "SELECT * FROM table WHERE id IN ($ids)"; 
$res = mysql_query($sql); 

diese Umwandlung in 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 ausfällt und die Berechnung der Anzahl der Elemente in dem Array und Ändern Die Anzahl der Fragezeichen in der SQL-Zeichenfolge und das Aufrufen von bind_parm für jedes Element im Array schlägt ebenfalls fehl. Die Verwendung der durch Komma getrennten Zeichenfolge schlägt ebenfalls fehl.

Ich kann keine gute Dokumentation in Google finden, also wie haben Sie das Problem gelöst?

+0

Mögliche Duplikat [? PreparedStatement IN-Klausel Alternativen] (https://stackoverflow.com/questions/178479/preparedstatement -in-clause-alternatives) – bfavaretto

Antwort

6

Blick auf die Antwort auf eine ähnliche Frage, die hier vor (zweite Codebeispiel) gefragt wurde:

I have an array of integers, how do I use each one in a mysql query (in php)?

Es läuft darauf hinaus:

  • die SQL-Zeichenfolge erstellen mit der richtige Menge an Fragezeichen
  • Verwenden Sie call_user_func_array(), um Ihr Array an die Abfragezeichenfolge
zu binden
+0

all_user_func_array() hat den Trick gemacht Danke –

9

Es ist nicht möglich, eine Liste variabler Länge an eine einzelne gebundene Variable zu binden.

Und falls Sie die Zeichenfolge binden, waren $ids Sie tatsächlich am Ende folgendes haben:

SELECT foo,blar FROM table WHERE id IN ('123,535,345,567,878') 

(Man beachte die Anführungszeichen um die Liste der IDs).

Das Erstellen einer eigenen Abfrage mit der richtigen Anzahl von Fragezeichen und gebundenen Parametern sollte tatsächlich funktionieren - Sie müssen dies möglicherweise erneut versuchen und über den tatsächlichen Fehler berichten.

Alternativ kann dies eine der Gelegenheiten sein, bei denen es leider notwendig ist, Ihr eigenes SQL manuell zu erstellen und keine gebundenen Parameter zu verwenden.

-1

Ich dachte, 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(); 
+0

Ihre Antwort ist eher wie eine Frage, die ich glaube. Das Problem wird auch sein, dass in IN-Anweisungen mehrere Werte als eine Zeichenkette ausgegeben werden. –

Verwandte Themen