web-dev-qa-db-fra.com

Mysql où id est dans le tableau

J'ai une chaîne d'identifiants comme 1,2,3,4,5 et je veux pouvoir lister toutes les lignes dans mysql où l'ID est contenu dans cette liste.

J'ai supposé que le moyen le plus simple serait de transformer la chaîne en un tableau puis de faire correspondre ($ array) mais cela ne fonctionne pas pour moi - pas d'erreurs, etc., mais il ne renvoie aucune ligne:

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

Si je fais un var_dump de $ array j'obtiens:

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

Une idée où je me trompe?

18
bhttoan
$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."')");
39
Crayon Violent

Votre requête se traduit par:

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

Ou quelque chose à cet effet.

Essayez plutôt d'utiliser des requêtes préparées, quelque chose comme:

$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 
   // ...
}
7
qwertynl

Changement

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

À:

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

array_map renvoie un tableau, pas une chaîne. Vous devez convertir le tableau en une chaîne séparée par des virgules afin de l'utiliser dans la clause WHERE.

2
Darius