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?
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;
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
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.
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.
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
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.
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.
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.
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
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.