mysql - and - where 1 1 oracle español
"Donde 1=1" declaración (10)
Además de todas las otras respuestas, es una técnica simple para ataques de inyección SQL . Si agrega una instrucción OR where 1=1
a algún SQL, devolverá todos los resultados debido a la veracidad inherente de la expresión.
Posible duplicado:
¿Por qué alguien usaría WHERE 1 = 1 AND <condiciones> en una cláusula SQL?
Vi a algunas personas usar una declaración para consultar una tabla en una base de datos MySQL como la siguiente:
select * from car_table where 1=1 and value="TOYOTA"
Pero, ¿qué significa 1=1
aquí?
Es solo una expresión siempre verdadera. Algunas personas lo usan como una solución alternativa.
Tienen una declaración estática como:
select * from car_table where 1=1
Entonces ahora pueden agregar algo a la cláusula where con
and someother filter
Hice esto cuando necesito aplicar los filtros dinámicamente.
como, mientras estoy programando, no sé cuántos filtros aplicará el usuario (fld1 = val1 y fld2 = val2 y ...)
entonces, para repetir la declaración "y fld = val" empiezo con "1 = 1".
por lo tanto, no necesito recortar el primero "y" en la declaración.
La consulta encuentra todas las filas para las cuales 1 es igual a 1 y el valor es igual a ''TOYOTA''. Entonces, en este caso, es inútil, pero si omite una instrucción WHERE, puede ser una buena idea usar WHERE 1 = 1 para recordarle que eligió NO usar una cláusula WHERE.
La mayoría de las veces el desarrollador usa este tipo de consulta si está desarrollando una aplicación tipo query builder o construyendo alguna consulta SQL compleja, por lo que junto con la instrucción select string agrega una cláusula condicional Donde 1 = 1, y en el programa no necesita agregar ningún control para eso.
Por lo general, es cuando las personas crean sentencias de SQL.
Cuando agrega and value = "Toyota"
, no tiene que preocuparse por si hay una condición antes o simplemente DONDE. El optimizador debe ignorarlo
Sin magia, solo practico
Código de ejemplo:
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"
De lo contrario, tendrías que tener un complicado conjunto de lógica:
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 la consulta se está generando dinámicamente, es probable que el autor original no desee considerar un conjunto vacío de condiciones, por lo que termina con algo como esto:
sql = "select * from car_table where 1=1"
for each condition in condition_set
sql = sql + " and " + condition.field + " = " + condition.value
end
el 1 = 1 donde la condición siempre es verdadera porque siempre 1 es igual a 1, por lo que esta afirmación siempre será verdadera. Si bien no significa nada a veces. pero otras veces los desarrolladores usan esto cuando la condición where se genera dinámicamente.
por ejemplo, veamos este código
<?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";
?>
entonces en el ejemplo anterior si $ _REQUEST [''cond''] no es " age " la consulta devolverá el error mysql porque no hay nada después de la condición where.
la consulta será select * from some_table where y that is error
para solucionar este problema (al menos en este ejemplo inseguro) usamos
<?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";
?>
así que ahora si $ _REQUEST [''cond''] no tiene la edad, el $ wherecond será 1 = 1 para que la consulta no tenga un error de mysql.
la consulta será select * from some_table donde 1 = 1 y eso evitará el error mysql
Espero que entiendas cuando usamos 1 = 1, mientras que ten en cuenta que el ejemplo anterior no es un ejemplo del mundo real y solo para mostrarte la idea.
el uso de esto viene en consultas complejas cuando se pasan condiciones dinámicamente. Puede concatenar condiciones usando una cadena "Y". Luego, en lugar de contar la cantidad de condiciones que está ingresando, coloca un "DÓNDE 1 = 1" al final de su instrucción stock SQL y arroje las condiciones concatenadas.
no es necesario usar 1 = 1, puede usar 0 = 0 2 = 2,3 = 3,5 = 5 25 = 25 ......
select * from car_table where 0=0 and value="TOYOTA"
aquí también obtendrá el mismo resultado como 1 = 1 condición
porque todos estos casos son siempre expresión verdadera
1=1 is alias for true
1=1
siempre será verdadero, por lo que el value="TOYOTA"
bit value="TOYOTA"
es el más importante.
Obtienes esto en algunos escenarios, incluyendo:
SQL generado: es más fácil crear un enunciado where
declarar si no tiene que resolver si está agregando la primera condición o no, por lo que a menudo se pone 1=1
al principio, y todas las demás condiciones pueden se adjuntará con un And
Depuración: a veces se ve a las personas colocarse en un 1=1
en la parte superior de una condición where ya que les permite cortar libremente y cambiar el resto de las condiciones al depurar una consulta. p.ej
select * from car_table
where 1=1
--and value="TOYOTA"
AND color="BLUE"
--AND wheels=4
Hay que decir que no es particularmente una buena práctica y normalmente no debería ocurrir en el código de producción. Incluso puede que no ayude mucho a la optimización de la consulta.