1
votes

Création d'une requête à l'aide d'une boucle pour la clause WHERE

J'essaie de créer une requête MySQL en utilisant une boucle pour la clause where. J'ai une solution, mais je pense qu'il devrait y avoir une meilleure solution. Mon code est le suivant

echo rtrim($query," OR");

Dans ce cas, la requête se termine par "OU", ce qui la rend invalide. La solution que j'ai est de le couper en utilisant

$query = 'SELECT * FROM `t1` WHERE';
$names = ['John','Steve','Robert'];

foreach($names as $name){
    $query .= " `name` = '$name` OR";
}

echo $query;

Je pense qu'il devrait y avoir une manière plus propre de le faire. Des suggestions?


1 commentaires

il y a plusieurs approches. une façon aurait la partie statique du SQL comme ... WHERE 1 = 0 , puis ajouterait à plusieurs reprises OR name = 'foo' (avec un espace de début). Méfiez-vous de l'incorporation de valeurs potentiellement dangereuses dans le texte SQL et de l'ouverture de la vulnérabilité d'injection SQL. Dans ce cas, nous avons un tableau statique, donc il n'y a aucun risque. Dans le cas plus général, où nous ne savons pas que le contenu du tableau est "sûr" pour être inclus dans SQL, nous utiliserions une instruction préparée avec des espaces réservés de liaison, ou à l'exception de cela, échapper correctement aux valeurs comme la fonction C mysql_real_escape_string.


3 Réponses :


1
votes

Vous pouvez pousser les tests vers un tableau puis les imploser avec OR:

$query = 'SELECT * FROM `t1` WHERE';
$names = ['John','Steve','Robert'];

$tests = array();
foreach($names as $name){
    $tests[] = "`name` = '$name'";
}
$query .= implode(' OR ', $tests);

Démo sur 3v4l.org


0 commentaires

1
votes

Je fais ce que vous faites dans mes applications, mais faites attention aux clauses WHERE plus compliquées à l'avenir.

Par exemple, si votre tableau est vide, vous devez omettre "WHERE" p>

$names = ['John','Steve','Robert'];
foreach ($names as &$name) $name = "'$name'";
unset($name);
$query = 'SELECT * FROM `t1` WHERE `name` IN (' . implode(', ', $names) . ') ';

si votre clause where aura AND vous devez faire attention à ce que AND a une priorité plus élevée que OU et pour utiliser les crochets appropriés ()

Dans l'exemple de code que vous avez fourni, vous pouvez également le faire pour éviter rtrim p >

$query = 'SELECT * FROM `t1`';
if ($names) $query .= " WHERE";


0 commentaires

3
votes

Vous pouvez corriger votre requête en utilisant where in et rejoindre . Dans votre cas, cela devrait être:

$query = 'SELECT * FROM `t1` WHERE name IN (\'' . join($names,'\',\'') . '\')';

Remarque: la jointure est un alias pour imploser. Cela aide la lisibilité du code. Soyez prudent avec l'injection SQL. Vous voudrez peut-être valider l'entrée ou utiliser PDO.


1 commentaires

J'ai aimé la façon dont vous avez ajouté ' autour de chaque nom