«Où 1 = 1» déclaration

Duplication possible:
Pourquoi quelqu’un utiliserait-il WHERE 1 = 1 AND dans une clause SQL?

J’ai vu certaines personnes utiliser une déclaration pour interroger une table dans une firebase database MySQL comme suit:

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

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

C’est généralement quand les gens construisent des instructions SQL.

Lorsque vous ajoutez and value = "Toyota" vous n’avez pas à vous soucier de savoir s’il existe une condition avant ou tout simplement WHERE. 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, vous devriez avoir une logique compliquée:

 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; 

Si cette requête est construite dynamicment, l’auteur original ne veut probablement pas considérer un ensemble de conditions vide, donc 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 

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

Vous obtenez cela dans quelques scénarios, y compris:

SQL généré: Il est plus facile de créer une instruction where complexe si vous n’avez pas besoin de déterminer si vous ajoutez la première condition ou non, si souvent un 1=1 est placé au début, et toutes les autres conditions peuvent être annexé avec un And

Débogage: Parfois, vous voyez des personnes placer 1=1 en haut d’une condition where car cela leur permet de couper et de modifier librement les autres 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 une bonne pratique et qu’il ne devrait normalement pas y avoir de code de production. Cela peut même ne pas aider à l’optimisation de la requête.

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

C’est juste une expression toujours vraie. Certaines personnes l’utilisent comme solution de rechange.

Ils ont une déclaration statique comme:

 select * from car_table where 1=1 

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

 and someother filter 

le 1 = 1 où la condition est toujours vraie car toujours 1 est égal à 1, cette instruction sera donc toujours vraie. Bien que cela ne signifie rien parfois. mais d’autres fois, les développeurs l’utilisent lorsque la condition where est générée dynamicment.

par exemple permet de voir ce code

  18"; } $query = "select * from some_table where $wherecond"; ?> 

Dans l’exemple ci-dessus, si $ _REQUEST [‘cond’] n’est pas ” age “, la requête retournera mysql error car il n’y a rien après la condition where.

la requête sera select * from some_table où et c’est une erreur

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

  18"; } else { $wherecond = " 1=1"; } $query = "select * from some_table where $wherecond"; ?> 

donc maintenant si le $ _REQUEST [‘cond’] n’est pas vieilli, le $ whereecond sera 1 = 1 donc la requête n’aura pas de retour d’erreur mysql.

la requête sera select * from some_table où 1 = 1 et qui évite l’erreur mysql

J’espère que vous comprendrez quand nous utilisons 1 = 1 alors que nous notons que l’exemple ci-dessus n’est pas un exemple du monde réel et que c’est juste pour vous montrer l’idée.

La plupart du temps, le développeur utilise ce type de requête s’il développe une application de type générateur de requêtes ou génère une requête SQL complexe, de même que la chaîne select contient une clause conditionnelle Où 1 = 1, et dans le programme pas besoin d’append de vérification il.

La requête trouve toutes les lignes pour lesquelles 1 est égal à 1 et la valeur est égale à «TOYOTA». Donc, dans ce cas, c’est inutile, 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 une clause WHERE.

l’utilisation de ceci vient dans des requêtes complexes lors du passage dynamic de conditions, vous pouvez concaténer des conditions en utilisant une chaîne “AND”. Ensuite, au lieu de compter le nombre de conditions que vous transmettez, placez un “WHERE 1 = 1” à la fin de votre instruction SQL stock et installez 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 que 1 = 1 condition

parce que tous ces cas sont toujours l’expression vraie

 1=1 is alias for true 

Je l’ai fait quand j’ai besoin d’appliquer les filtres dynamicment.
comme, pendant le codage, je ne sais pas combien d’utilisateurs de filtres appliqueront (fld1 = val1 et fld2 = val2 et …)
donc, pour répéter l’instruction “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.