web-dev-qa-db-fra.com

Comment utiliser un tableau php avec l'opérateur SQL IN?

J'ai et tableau avec deux valeurs et je veux l'utiliser avec l'opérateur SQL IN dans la requête de sélection.

Voici la structure de ma table

id comp_id
1   2
2   3
3   1

J'ai un tableau $arr qui a deux valeurs Array ( [0] => 1 [1] => 2 ) 

Je veux aller chercher l'enregistrement de comp_id 1 et comp_id 2. J'ai donc écrit la requête suivante.

SELECT * from table Where comp_id IN ($arr)

Mais cela ne retourne pas les résultats.

29
Ahmad

Comme vous le savez bien entiers pouvez simplement le faire ... 

$sql = "SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")";

(comme il n'arrête pas, quelques informations supplémentaires ...) 

Si vous utilisez des entrées chaînes _ (particulièrement non fiables), vous pouvez 

$sql = "SELECT * FROM table WHERE comp_id IN 
        ('".implode("','",array_map('mysql_real_escape_string', $arr))."')";

mais ne fait pas face à des valeurs comme NULL. Et ajoutera des guillemets aveuglément autour de valeurs numériques, ce qui fonctionne pas _ si vous utilisez le mode strict mysql. https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#idm140082377917056 ... C'est-à-dire, utilisez UNIQUEMENT si vous travaillez réellement avec des chaînes (comme VARCHAR), PAS colonnes numériques. 

Le Nécessaire appeler quelque chose comme mysql_real_escape_string est tel que tous les guillemets dans les chaînes sont correctement traités! (ainsi que d'empêcher les injections SQL!) 


... si vous voulez travailler avec des nombres 'non approuvés', vous pouvez utiliser intval ou floatval

$sql = "SELECT * FROM table WHERE comp_id IN (".implode(",",array_map('intval', $arr)).")";

pour désinfecter l'entrée. (pas de guillemets autour de l’entrée. 

56
barryhunter

vous devez convertir le tableau en chaîne séparée par des virgules:

$condition = implode(', ', $arr);

Et, en outre, vous voudrez peut-être d'abord échapper aux valeurs (si vous n'êtes pas sûr de l'entrée):

$condition = implode(', ', array_map('mysql_real_escape_string', $arr));
12
Aurimas

$ arr est un tableau php, sur le serveur SQL vous devez envoyer une chaîne qui sera analysée.

pour ce faire, vous pouvez utiliser la fonction http://php.net/implode

donc avant d'exécuter la requête, essayez

$arr = implode ( ', ', $arr);
5
mishu

Vous devez imploser votre tableau avec ',' virgule

$imploded_arr = implode(',', $arr);

SELECT * from table Where comp_id IN ($imploded_arr)
4
saba

vous ne pouvez passer que string à mysql en tant que requête, alors essayez ceci

mysql_query("SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")");
4
Chakradar Raju

Vous mélangez PHP et SQL - pour l'opérateur IN SQL, vous avez besoin d'un format tel que:

SELECT * from table WHERE comp_id IN (1,2)

Donc, pour obtenir cela dans PHP, vous devez faire quelque chose comme:

$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")"

Gardez à l'esprit que cela ne fonctionne que si le tableau comprend des entiers. Vous devez échapper à chaque élément s'il s'agit de chaînes.

3
Jon Cairns

Tous les gens ici proposent la même chose mais j'ai reçu un avertissement dans WordPress à cause d'une simple erreur. Vous devez ajouter des virgules à votre chaîne implodée. Pour être précis, quelque chose comme ça.

$query = "SELECT *FROM table Where comp_id IN ( '" . implode( "', '", $sanitized_brands ) . "' )";

En espérant que cela aide quelqu'un comme moi. :)

2
shazyriver

Vous avez besoin de quelque chose comme:

$sql = "SELECT * from table where comp_id in (".implode(',',$arr.")";
2
enygma

Vous devez réellement convertir votre $arr en chaîne. La manière la plus simple de faire ce que vous faites serait d'utiliser implode()

$query = 'SELECT * from table Where comp_id IN (' . implode(',', $arr) . ')';

À l'heure actuelle, si vous echo votre requête, vous verrez que plutôt que le tableau étant dans l'instruction IN, il s'agira simplement du mot "Tableau".

2
jprofitt

Vous devez convertir le tableau en chaîne à utiliser dans la requête:

$list = implode(',', $arr);

Ensuite, il peut être utilisé dans la clause IN:

SELECT * from table Where comp_id IN ($list)
2
MrCode

Selon la réponse de @barryhunter, qui ne fonctionne que sur un tableau contenant uniquement un entier:

$sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")";

J'ai fait quelques ajustements pour le faire fonctionner pour un tableau de chaînes:

$sql = "SELECT * from table Where comp_id IN ('".implode("','",$arr)."')";
2
Kelvin Barsana

Si votre tableau est constitué d'entiers:

$searchStringVar = implode(",",$nameIntAryVar);
$query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ($searchStringVar)";

Si votre tableau est constitué de chaînes:

$searchStringVar = implode("','",$nameStringAryVar);
$query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ('$searchStringVar')";
0
Sujay U N

Il existe certains risques d’injection SQL dans certaines des réponses précédentes. Cela pourrait aller si vous êtes absolument certain que $arr sera désinfecté (et que vous resterez ainsi). Mais si vous n'êtes pas complètement sûr, vous voudrez peut-être limiter ce risque en utilisant $stmt->bindValue. Voici une façon de le faire:

# PHP
$in_list = array();
for ($i = 0; $i < count($arr); $i++) {
    $key = 'in_param_' . i;
    $in_list[':' . $key] = array('id' => $arr[$i], 'param' => $key);
}
$keys = implode(', ', array_keys($in_list));

// Your SQL ...
$sql = "SELECT * FROM table where id IN ($keys)";


foreach ($in_list as $item) {
    $stmt->bindValue($item['param'], $item['id'], PDO::PARAM_INT);
}
$stmt = $this->getConnection()->prepare($sql)->execute();
0
Thomas - BeeDesk