2013-11-25 11 views
6

Ho una stringa di ID come 1,2,3,4,5 e voglio essere in grado di elencare tutte le righe in mysql in cui l'ID è contenuto in quell'elenco.Mysql in cui l'id è nell'array

ho assunto il modo più semplice sarebbe quella di trasformare la stringa in un array e poi corrispondere a ($ array), ma non funziona per me - nessun errore, ecc, ma non restituisce alcuna riga:

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

Se faccio un var_dump di $ array ottengo:

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

Hai idea di dove sto strizzando?

+0

Le stringhe o i numeri interi Ids? –

risposta

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

Grazie, questo ha funzionato a meraviglia – bhttoan

+1

@bhttoan potrebbe aver funzionato bene, ma è soggetto a vulnerabilità ... – qwertynl

+0

Come così? Ho mostrato una vista MOLTO semplificata e spogliata del codice (compresa la query stessa) per evitare di inserire troppo codice non necessario, ma sono felice che il contenuto dell'array sia sterilizzato e sicuro. – bhttoan

6

Vostri criteri si traduce in:

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

o qualcosa in tal effetto.

Provare a utilizzare query preparate, invece, qualcosa di simile:

$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

Change

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

A:

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

array_map restituisce una matrice, non è una stringa. È necessario convertire l'array in una stringa separata da virgole per poter utilizzare la clausola WHERE.

+0

Quindi questo si limita a tornare nella stringa originale ... Qual è il punto? – qwertynl

+0

Credo che sia quello che ha richiesto. – Darius

+0

Questo sembra lo stesso risultato finale della mia risposta scelta, ma in una riga piuttosto che in due, quindi non sono sicuro del perché del downvote? FYI @Darius non ho downvotato questo – bhttoan

Problemi correlati