2014-01-22 5 views
2

Ошибка с MySql queay. Я ищу сопоставление шаблонов в трех полях, и я попытался использовать скобки для разделения каждого подобного шаблона. Вместо того, чтобы возвращать правильное количество строк, он возвращает все строки в результате.Mysql Где и как

Вот запрос

mysql_query("select * from contacts where contact_name like '%$contact_name%' or bus_name like '%$busname%' or contact_email like '%$contact_email%'"); 

Если я искать CONTACT_NAME как Ким или busname как someword и CONTACT_EMAIL как ANYWORD она должна возвращать только 1 результат.

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

Спасибо за любую помощь

+0

Вы могли бы показать, что представляют собой данные в вашей таблице, и фактический пример с реальными значениями? –

+0

** SQL-инъекция риска впереди! ** Пожалуйста, прочитайте о подготовленных заявлениях. – Barranka

+0

Привет. Не уверен, что вы имеете в виду. Данные в таблице содержат имя человека в столбце 1, название его компании в столбце 2 и их адрес электронной почты в столбце 3 :) – Patdundee

ответ

1

Давайте рассмотрим ваш запрос:

select * 
from contacts 
where 
    contact_name like '%contact_name%'  -- Condition 1 
    or bus_name like '%bus_name%'   -- Condition 2 
    or contact_email like '%contact_email%' -- Condition 3 

Давайте посмотрим, как это оценивается для любой строки:

c1 | c2 | c3 | row_returned 
----+----+----+-------------- 
    T | T | T | Yes 
    T | T | F | Yes 
    T | F | T | Yes 
    T | F | F | Yes 
    F | T | T | Yes 
    F | T | F | Yes 
    F | F | T | Yes 
    F | F | F | No 

рассмотрим теперь, что произойдет если вы используете and вместо or:

c1 | c2 | c3 | row_returned 
----+----+----+-------------- 
    T | T | T | Yes 
    T | T | F | No 
    T | F | T | No 
    T | F | F | No 
    F | T | T | No 
    F | T | F | No 
    F | F | T | No 
    F | F | F | No 

Мне кажется, что вам нужно использовать and вместо or.


Что касается моего комментария о SQL инъекций, я имею в виду, что путь ваш запрос пишется есть открытая дверь для некоторых изгоев код для вставки и повредить данные. Представьте себе, что переменная contact_name присваивается что-то вроде этого:

contact_name = "'; drop table contacts; --" 

Это было бы плохо.

Пожалуйста, проверьте this link (а также this, если вы хотите немного рассмеяться о том, что может сделать SQL-инъекция).

+0

Я разрешаю пользователю искать совпадение в любом из трех полей, где поиск похож, если он ошибочно. поэтому, если в любом из полей есть совпадение, это приведет к результату. Если я использую, и тогда он должен быть совпадением во всех трех полях. Я думаю, может быть, моя проблема заключается в том, что в представленных полях, если поле осталось пустым, MySql не нравится. Поэтому я думаю, мне нужно немного изменить вопрос. Я отредактирую исходный вопрос :) – Patdundee

+1

Затем вам нужно сделать какой-нибудь умный код для проверки каждого условия отдельно или использовать 'UNION' в вашем SQL-запросе. – Barranka

4

Ваш инстинкт верен, что пробелы заставят ваше утверждение возвращать все строки.

Если человек представляет пустую форму, то SQL, которая выполняется на самом деле:

select * from contacts where contact_name like '%%' or bus_name like '%%' or contact_email like '%%'" 

Так, очевидно, что будет возвращать все строки.

Решение: сначала необходимо проверить, что какая-либо из ваших переменных имеет значение, и если у вас нет хотя бы одной переменной с непустым/допустимым значением, вы должны вернуть ошибку.

И Я СИЛЬНО ЭХО плакаты, которые заявили, что существуют серьезные риски инъекций SQL без дезинфекции вашего кода !!!

Смежные вопросы