web-dev-qa-db-fra.com

"où 1 = 1" déclaration

Duplicate possible:
Pourquoi quelqu'un utiliserait WHERE 1 = 1 AND <conditions> dans une clause SQL?

J'ai vu certaines personnes utiliser une instruction pour interroger une table dans une base de données MySQL comme suit:

select * from car_table where 1=1 and value="TOYOTA"

Mais qu'est-ce que 1=1 signifie ici?

194
Mellon

C'est généralement lorsque les gens construisent des instructions SQL.

Lorsque vous ajoutez and value = "Toyota" vous n'avez pas à vous soucier de savoir s'il y a une condition avant ou juste où. L'optimiseur devrait l'ignorer

Pas de magie, juste pratique


Exemple de code:

commandText = "select * from car_table where 1=1";

if (modelYear <> 0)     commandText += " and year="+modelYear
if (manufacturer <> "") commandText += " and value="+QuotedStr(manufacturer)
if (color <> "")        commandText += " and color="+QuotedStr(color)
if (california)         commandText += " and hasCatalytic=1"

Sinon, il vous faudrait un ensemble de logique compliqué:

commandText = "select * from car_table"
whereClause = "";
if (modelYear <> 0)
{
   if (whereClause <> "") 
      whereClause = whereClause + " and ";
   commandText += "year="+modelYear;
}
if (manufacturer <> "")
{    
   if (whereClause <> "") 
      whereClause = whereClause + " and ";
   commandText += "value="+QuotedStr(manufacturer)
}
if (color <> "")
{
   if (whereClause <> "") 
      whereClause = whereClause + " and ";
   commandText += "color="+QuotedStr(color)
}
if (california)
{
   if (whereClause <> "") 
      whereClause = whereClause + " and ";
   commandText += "hasCatalytic=1"
}

if (whereClause <> "")
   commandText = commandText + "WHERE "+whereClause;
311
gbn

Si cette requête est créée de manière dynamique, l'auteur d'origine ne souhaitant probablement pas prendre en compte un ensemble de conditions vide, il se termine par quelque chose comme ceci:

sql = "select * from car_table where 1=1"
for each condition in condition_set

    sql = sql + " and " + condition.field + " = " + condition.value

end
49
Rubens Farias

1=1 sera toujours vrai, donc le value="TOYOTA" bit est l'important.

Vous obtenez cela dans quelques scénarios, notamment:

Génération SQL: Il est plus facile de créer une instruction générant une complexe where si vous n'avez pas à déterminer si vous ajoutez ou non la première condition, si souvent un 1=1 est mis au début, et toutes les autres conditions peuvent être ajoutées avec un And

Débogage: Parfois, vous voyez des gens mettre un 1=1 en haut de la condition where, car cela leur permet de découper librement et de modifier le reste des conditions lors du débogage d'une requête. par exemple.

select * from car_table
where 1=1
--and value="TOYOTA"
AND color="BLUE"
--AND wheels=4

Il faut dire que ce n'est pas particulièrement une bonne pratique et ne devrait normalement pas se produire dans le code de production. Cela n’aide peut-être même pas beaucoup l’optimisation de la requête.

37
Jon Egerton

En plus de toutes les autres réponses, c’est une technique simple pour attaques par injection SQL . Si vous ajoutez un OR where 1=1 déclaration à un SQL alors il va renvoyer tous les résultats en raison de la véracité inhérente de l’expression.

31
Jeff Foster

C'est juste une expression toujours vraie. Certaines personnes l'utilisent comme solution de contournement.

Ils ont une déclaration statique comme:

select * from car_table where 1=1

Donc, ils peuvent maintenant ajouter quelque chose à la clause where avec

and someother filter
14
Udo Held

le 1 = 1 où la condition est toujours vraie parce que toujours 1 est égal à 1, cette déclaration sera donc toujours vraie. Bien que cela ne veuille rien parfois. mais à d'autres moments, les développeurs l'utilisent lorsque la condition where est générée dynamiquement.

par exemple permet de voir ce code

<?php
//not that this is just example
//do not use it like that in real environment because it security issue.
$cond = $_REQUEST['cond'];
if ($cond == "age"){
 $wherecond = " age > 18";
}         
$query = "select * from some_table where $wherecond";
?>

ainsi, dans l'exemple ci-dessus, si $ _ REQUEST ['cond'] n'est pas "age", la requête retournera une erreur mysql car il n'y a rien après la condition where.

la requête sera sélectionnez * de some_table où et c'est l'erreur

pour résoudre ce problème (au moins dans cet exemple non sécurisé), nous utilisons

<?php
//not that this is just example
//do not use it like that in real environment because it security issue.
$cond = $_REQUEST['cond'];
if ($cond == "age"){
 $wherecond = " age > 18";
} else {
 $wherecond = " 1=1";
}        
$query = "select * from some_table where $wherecond";
?>

donc maintenant si $ _ REQUEST ['cond'] n'est pas age, la $ seconde sera 1 = 1, de sorte que la requête n'aura pas de retour d'erreur mysql.

la requête sera sélectionnez * de some_table où 1 = 1 et évitez l'erreur mysql

j'espère que vous comprenez quand nous utilisons 1 = 1 tout en notant que l'exemple ci-dessus n'est pas un exemple du monde réel et qu'il vous montre simplement l'idée.

4
Mohammed Shannaq

La plupart du temps, le développeur utilise ce type de requête s’il développe une application de type constructeur de requêtes ou construit une requête SQL complexe. Ainsi, avec la chaîne d’instruction select, ajoutez une clause conditionnelle Où 1 = 1, et il n’est pas nécessaire d’ajouter de vérification pour il.

4
Farhan Alam

La requête recherche toutes les lignes pour lesquelles 1 est égal à 1 et la valeur est égale à 'TOYOTA'. Donc, dans ce cas, cela ne sert à rien, mais si vous omettez une instruction WHERE, il peut être judicieux d'utiliser WHERE 1 = 1 pour vous rappeler que vous avez choisi de ne PAS utiliser de clause WHERE.

2
toon81

son utilisation est utilisée dans des requêtes complexes lors du passage dynamique de conditions. Vous pouvez concaténer des conditions à l'aide d'une chaîne "AND". Ensuite, au lieu de compter le nombre de conditions que vous spécifiez, placez un "WHERE 1 = 1" à la fin de votre instruction SQL stock et ajoutez les conditions concaténées.

pas besoin d'utiliser 1 = 1, vous pouvez utiliser 0 = 0 2 = 2,3 = 3,5 = 5 25 = 25 ......

select * from car_table where 0=0 and value="TOYOTA" 

ici aussi vous obtiendrez le même résultat comme 1 = 1 condition

parce que tous ces cas est toujours vraie expression

1=1 is alias for true
1
Nighil

je l'ai fait quand j'ai besoin d'appliquer les filtres de manière dynamique.
like, lors du codage, je ne sais pas combien de filtres seront appliqués par l'utilisateur (fld1 = val1 et fld2 = val2 et ...)
donc, pour répéter la déclaration "et fld = val", je commence par "1 = 1".
Par conséquent, je n'ai pas besoin de couper le premier "et" dans la déclaration.

0
BobbyGoks