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.
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.
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));
$ 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);
Vous devez imploser votre tableau avec ',' virgule
$imploded_arr = implode(',', $arr);
SELECT * from table Where comp_id IN ($imploded_arr)
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).")");
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.
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. :)
Vous avez besoin de quelque chose comme:
$sql = "SELECT * from table where comp_id in (".implode(',',$arr.")";
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".
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)
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)."')";
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')";
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();