Утверждение «где 1 = 1»

178

Возможный дубликат:
Почему кто-то использует WHERE 1 = 1 AND <conditions> в предложении SQL?

Я видел, как некоторые люди использовали оператор для запроса таблицы в базе данных MySQL, как показано ниже:

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

Но что означает 1=1?

  • 8
    Обратите внимание, что в MySQL, просто WHERE 1 and ... будет работать ...
  • 6
    это псевдоним для true
Показать ещё 5 комментариев
Теги:
database

10 ответов

298
Лучший ответ

Обычно, когда люди создают инструкции SQL.

Когда вы добавляете and value = "Toyota", вам не нужно беспокоиться о том, есть ли условие раньше или просто ГДЕ. Оптимизатор должен игнорировать его

Без магии, просто практично


Пример кода:

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"

В противном случае вам придется иметь сложный набор логик:

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;
  • 2
    Потрясающие. Теперь я могу строить свои сложные запросы со строками, а не массивами;). Я, однако, хотел проверить с помощью запроса EXPLAIN, вызвало ли оно «Использование где». На самом деле это не так.
  • 73
    Хотя более опытные программисты будут делать что-то вроде " and ".Join(conditions) для генерации оператора where ... или использовать O / RM ...
Показать ещё 1 комментарий
45

Если этот запрос строится динамически, оригинальный автор, вероятно, не хочет рассматривать пустой набор условий, поэтому заканчивается примерно так:

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

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

end
  • 27
    ИМО это просто плохое кодирование. Лично я сохраняю все условия в массиве, затем склеиваю их вместе с "И".
  • 3
    Я считаю, что это больше похоже на " AND "
Показать ещё 3 комментария
37

1=1 всегда будет истинным, поэтому бит value="TOYOTA" является важным.

Вы получаете это в нескольких сценариях, включая:

Сгенерированный SQL: проще создать сгенерированный сложный оператор where, если вам не нужно работать, если вы добавляете первое условие или нет, поэтому часто ставится 1=1 в начале, и все остальные условия могут быть добавлены с помощью And

Отладка: иногда вы видите, что люди помещают 1=1 в верхнюю часть условия where, поскольку он позволяет им свободно нарезать и изменять остальные условия при отладке запроса. например.

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

Следует сказать, что это не особенно хорошая практика и обычно не должно происходить в производственном коде. Это может даже не помочь оптимизировать запрос.

30

Как и все другие ответы, это простой метод для атак SQL-инъекций. Если вы добавите инструкцию OR where 1=1 к некоторому SQL, тогда она вернет все результаты из-за присущей правдоподобности выражения.

  • 0
    Я не вижу, как это связано с вопросом. добавление 'OR 1 = 1' (я полагаю, что OR, где была опечатка) через SQLi вернет все результаты, независимо от того, есть ли у вас "где 1 = 1 и cond1" или просто "где cond1".
  • 4
    Вопрос был «что означает 1=1 », и я просто подумал, что это будет полезный пример, чтобы показать, как его можно использовать.
Показать ещё 3 комментария
12

Его просто всегда истинное выражение. Некоторые люди используют это как обход.

У них есть статический оператор вроде:

select * from car_table where 1=1

Итак, теперь они могут добавить что-то в предложение where с помощью

and someother filter
4

Большинство разработчиков времени используют этот тип запроса, если он разрабатывает приложение типа построителя запроса или создает сложный SQL-запрос, поэтому вместе с строкой оператора select добавьте условное предложение Где 1 = 1, а в программе нет необходимости добавлять любая проверка для него.

4

1 = 1, где условие всегда истинно, потому что всегда 1 равно 1, поэтому это утверждение всегда будет истинным. Хотя иногда это ничего не значит. но в других случаях разработчики используют это, когда условие where генерируется динамически.

например, см. этот код

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

поэтому в приведенном выше примере, если $_ REQUEST ['cond'] не " age", запрос возвращает mysql-ошибку, потому что после условия where нет ничего,

запрос будет выбрать * из some_table, где, и это ошибка

чтобы исправить эту проблему (по крайней мере, в этом небезопасном примере), мы используем

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

Итак, теперь, если $_ REQUEST ['cond'] не age, $wherecond будет 1 = 1, поэтому запрос не будет иметь возврат ошибки mysql.

запрос будет выбрать * из some_table, где 1 = 1, и чтобы избежать ошибки mysql

надеюсь, что вы поймете, когда мы используем 1 = 1, но обратите внимание, что приведенный выше пример не является примером реального мира, и он просто должен показать вам эту идею.

  • 2
    Как ваши примеры являются проблемой безопасности? Внедрение SQL невозможно. Проблема безопасности заключается в том, чтобы использовать $cond (без преобразования его в целое число), чтобы указать минимальный возраст в запросе, и проверить, действительно ли isset($_REQUEST['cond']) действительно истинно (в противном случае используется 1 = 1 ). ,
2

Запрос находит все строки, для которых 1 равно 1, а значение равно "TOYOTA". Поэтому в этом случае это бесполезно, но если вы опускаете инструкцию WHERE, может быть хорошей идеей использовать WHERE 1 = 1, чтобы напомнить вам, что вы выбрали НЕ использовать предложение WHERE.

1

использование этого происходит в сложных запросах при динамическом прохождении условий, вы можете конкатенировать условия с помощью строки "AND". Затем, вместо подсчета количества условий, в которых вы проходите, вы помещаете "WHERE 1 = 1" в конец вашего предложения SQL SQL и выполняете конкатенированные условия.

нет необходимости использовать 1 = 1, вы можете использовать 0 = 0 2 = 2,3 = 3,5 = 5 25 = 25......

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

здесь вы также получите тот же результат, что и условие 1 = 1

потому что все эти случаи всегда являются истинным выражением

1=1 is alias for true
0

Я сделал это, когда мне нужно применять фильтры динамически.
например, при кодировании я dunno, сколько пользователей фильтра будет применяться (fld1 = val1 и fld2 = val2 и...)
поэтому, чтобы повторить утверждение "и fld = val" я начинаем с "1 = 1".
следовательно, мне не нужно обрезать первые "и" в заявлении.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню