2013-11-25 13 views
6

Ich habe eine Zeichenfolge von IDs 1,2,3,4,5 und ich möchte in der Lage sein, alle Zeilen in MySQL aufzulisten, wo die ID in dieser Liste enthalten ist.Mysql, wo ID ist in Array

Ich nahm an der einfachste Weg, um die Zeichenfolge in ein Array und dann passen in ($ array) zu drehen wäre aber für mich nicht funktioniert - keine Fehler usw., aber es gibt keine Zeilen zurück:

$string="1,2,3,4,5"; 
$array=array_map('intval', explode(',', $string)); 
$query=mysqli_query($conn, "SELECT name FROM users WHERE id IN ('".$array."')"); 

Wenn ich ein var_dump von $ array erhalte ich:

array(5) { 
    [0]=> int(1) 
    [1]=> int(2) 
    [2]=> int(3) 
    [3]=> int(4) 
    [4]=> int(5) 
} 

Jede Idee, wo ich bin zu vermasseln?

+0

Sind die Ids Zeichenfolgen oder Ganzzahlen? –

Antwort

17
$string="1,2,3,4,5"; 
$array=array_map('intval', explode(',', $string)); 
$array = implode("','",$array); 
$query=mysqli_query($conn, "SELECT name FROM users WHERE id IN ('".$array."')"); 
+0

Danke, das funktionierte ein Leckerbissen – bhttoan

+1

@bhttoan könnte es gut funktioniert haben, aber es unterliegt Sicherheitslücken ... – qwertynl

+0

Wie so? Ich zeigte eine SEHR vereinfachte und abgespeckte Ansicht des Codes (einschließlich der eigentlichen Abfrage selbst), um zu viel unnötigen Code zu vermeiden, aber ich bin froh, dass der Array-Inhalt sterilisiert und sicher ist. – bhttoan

6

Ihre Anfrage übersetzt:

SELECT name FROM users WHERE id IN ('Array'); 

oder etwas in diesem beeinflussen.

Versuchen Sie es mit vorbereitete Abfragen statt, so etwas wie:

$numbers = explode(',', $string); 
$prepare = array_map(function(){ return '?'; }, $numbers); 
$statement = mysqli_prepare($link , "SELECT name FROM users WHERE id IN ('".implode(',', $prepare)."')"); 
if($statement) { 
    $ints = array_map(function(){ return 'i'; }, $numbers); 
    call_user_func_array("mysqli_stmt_bind_param", array_merge(
     array($statement, implode('', $ints)), $numbers 
    )); 
    $results = mysqli_stmt_execute($statement); 
    // do something with results 
    // ... 
} 
1

ändern

$array=array_map('intval', explode(',', $string)); 

An:

$array= implode(',', array_map('intval', explode(',', $string))); 

array_map ein Array zurückgibt, kein String. Sie müssen das Array in eine durch Kommas getrennte Zeichenfolge konvertieren, um sie in der WHERE-Klausel zu verwenden.

+0

Dann wird es einfach wieder in die ursprüngliche Zeichenkette umgewandelt ... Was ist der Sinn? – qwertynl

+0

Ich glaube, das hat er verlangt. – Darius

+0

Dies sieht aus wie das gleiche Endergebnis wie meine gewählte Antwort, aber in einer Zeile statt zwei, also nicht sicher, warum der Downvote? FYI @Darius Ich habe diese – bhttoan