За последние 24 часа нас посетили 18223 программиста и 1700 роботов. Сейчас ищет 1491 программист ...

Делаю запрос в БД не существующих данных через OR а получаю положительный результат. Почему?

Тема в разделе "MySQL", создана пользователем victort, 6 янв 2018.

Метки:
  1. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    Здравствуйте, разъясните пожалуйста. Так получилось что в разных формах дизайнер назвал одну и туже переменную по разному. Поэтому я решил воспользоваться комбинацией ИЛИ (OR) чтоб ему не переделывать. Вот какой запрос был создан и отправлен на обработку
    SELECT * FROM `tablica` WHERE `name`='' OR `nami`='' OR `name`='primer' OR `nami`='primer'
    Вот почему первые параметры пустые name и nami берутся из первой формы но в данном запросе они не участвовали а участвовали переменные со второго запроса. в итоге при анализе данного запроса мне выдается что все 4 параметра равно NULL но я получаю список из БД аж 64 строки. Каким образом это происходит если все 4 параметра не верны. Я конечно запрос сейчас упрощу чтоб участвовало только два первых параметра но хочу понять логику. В БД данной таблице пустых строк нет. И данного искомого параметра в столбцах таблицы тоже нет. Почему я делаю проверку одного и того же значения в разных столбцах - потому что в одном столбце пишется значение в единственном числе а во втором во множественном (ягода, ягоды).
     
  2. karmay

    karmay Активный пользователь

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    Если в корабль не вкрутили винт, он потом может утонуть, дизайнер ошибся, пусть переделывает, дабы не тянуть за собой вереницу проблем...
    Я почему-то подумал, что если это форма, можно добавить скрытое поле
    А по запросу, хотелось бы конкретики, в операторах существует направленность, если запрос выполняется, значит в итоге он дает true, возможно интерпритатор читает NULL OR NULL и выдает true. размышляйте.
     
  3. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    Ну почему при выдаче NULL OR NULL он дает NULL а если запись выполняется как NULL OR NULL OR NULL OR NULL то это TRUE. Вот что меня удивило. Поэтому и решил узнать из-за чего такое может быть.
     
  4. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    Помогите пожалуйста сделать правильный запрос при таком обращение SELECT * FROM `tabl` WHERE `name` = '' OR `nami` = '' к БД MySQL я всеравно получаю часть списка из таблицы. Нужно проверить полученное значение есть оно в данных столбцах или нет. Если я данный параметр опускаю то есть получается строка вида что я представил выше то MySQL мне всеравно отдает часть списка. Как я писал в данных столбцах хранятся записи вида (ягода, ягоды).
     
  5. karmay

    karmay Активный пользователь

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    поразмышляйте еще, на сам запрос посмотрите и поразмышляйте, мне кажется его нужно немного подправить, и в БД еще раз загляните, структура там какая
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
  7. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    А че тут размышлять запретил в таком случае отправлять данный запрос в БД и все. Хотя разобраться охота но сроки поджимают. У меня была проблема с MySQL при обработке марок машин получилось так что марка автомобила ГАЗ и марка автомобиля ВАЗ для mysql одно и тоже. Пришлось дополнительное поле вводить чтоб в запросе были различия.
    А структура у данной таблицы простая есть три колонки id (индификатор и ключ) name (varchar) - содержит слова в единственном числе и nami (varchar) - содержит слова во множественном числе. Если пользователь пишет запрос скажем ищу "ягоды" то благодаря полю nami мы получаем индификатор id и выдаем уже по данному id нужный список. Или скажем он написал "ягода" то в этом случае срабатывает поле name и опять по полученному id выдаем список. Вот я и попробовал сделать запрос структурой УСЛОВИЕ = ИЛИ УСЛОВИЕ =. В моем случае получается запрос мне говорит при анализе что УСЛОВИЕ равно NULL т.е. не найдено в обоих случаях. Но при этом часть данных он все же дает на вывод возникает вопрос по какой логике он выбрал из 235 записей 64 как соответствующие истине если в данных записях нет соответствующих значений что стоят в запросе - они не пустые.
     
  8. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    Все вопрос закрыт. Ну а чтоб такая запись не срабатывала можно написать SQL запрос: SELECT * FROM `tab` WHERE (`name` = '' AND `name` != '') OR (`nami` = '' AND `nami` != '') В первый параметр попадает значение из запроса а второй параметр говорит что данный запрос не должен быть пустым.