2012-01-05 2 views
1

ok, я еще не слишком обучен SQL, но я хочу, чтобы у меня был массив поисковых роботов и IP-адресов (или частичных IP-адресов)), которые я хочу исключить из возвращаемых результатов SQL.Имея некоторые проблемы с формированием правильного SQL-запроса с использованием НЕ IN и PHP-массива

Массив уже правильно сформирован для запроса SQL и выглядит следующим образом (и хранится в $ sql_exclude):

'googlebot', 'crawl', 'spider', 'bluehost', 'amazonaws', 'msnbot', 'surphace-scout', 'scoutjet', 'facebook', 'tfbnw.net', 'digg', 'spinn3r', 'favsys.net', 'trendnet.org', '72.14.192.', '72.14.194.' 

проверяет, запросов в отношении как ф и user_agent столбцов в БД, чтобы увидеть если любой из них содержит какие-либо элементы в массиве, и если да, я не хочу, чтобы они возвращались в результатах.

Прямо сейчас, это запрос, который я пробовал, и делает для меня «смысл», но он ничего не возвращает. Может ли кто-нибудь указать, где ошибка?

$sql = "SELECT w.* FROM {bad_behavior_log} w WHERE ($sql_exclude) NOT IN w.user_agent AND ($sql_exclude) NOT IN w.ip " . tablesort_sql($header); 

Кроме того, поскольку пользовательские агенты являются смешанным случаем, это проблема? И/или когда пользовательский агент, с которым он проверяет, имеет в нем слово «GoogleBot», а термин массива - просто «google», будет ли SQL-запрос автоматически найти частичное совпадение? (для частичных IP-адресов).

Update: Ради тщательности, и в случае, если кто читает это позже, я решил мою проблему с 2-мя вещами:

1) По какой-то причине, не уверен, если это установка моего хозяина (в Bluehost), Мне нужно было преобразовать все строки поиска для моих операторов сравнения (НЕ НРАВИТСЯ) в верхний регистр, или он будет произвольно соответствовать некоторым и не соответствовать некоторым смешанным поисковым запросам.

2) Скобка вокруг моих переменных SQL также вызывала удушение запроса. т. е. ($ sql_exclude) должно быть всего $ sql_exclude.

Вот мой последний, работая, строка запроса: $ SQL = "SELECT * FROM ш {bad_behavior_log} ш ГДЕ НЕ w.user_agent как $ sql_exclude_agents И НЕ w.ip как $ sql_exclude_ips.". tablesort_sql ($ заголовка);

и строки в этих переменных выглядит следующим образом: $ sql_exclude_agents = " '("И НЕ w.user_agent LIKE '%, $ exclude_agents "%.";%" Взрываются%")'.'

(превращается) НЕ НРАВИТСЯ '% GOOGLE%' AND NOT w.user_agent LIKE '% YAHOOCACHESYSTEM%' AND NOT w.user_agent LIKE '% RSSGRAFFITI%' AND NOT w.user_agent LIKE '% BITLYBOT%' (и т. д.)

+1

'NOT IN' не получит частичное совпадение –

ответ

3

Вы используете NOT IN неправильно, формат должен быть column NOT IN ($sql_exclude), а не наоборот. То есть за ним должен следовать список элементов для проверки вместо того, чтобы продолжать его.

$sql = "SELECT w.* FROM {bad_behavior_log} w WHERE w.user_agent NOT IN ($sql_exclude) AND w.ip NOT IN ($sql_exclude) " . tablesort_sql($header)

+0

Кажется, все ответы на них упоминаются в одном и том же месте, поэтому я просто отвечаю на человека, который первым ответил, но это все еще адресовано всем: у меня изначально было это так, и это действительно возвращало результаты, однако, я предполагаю, что тогда я столкнулся с проблемой частичного сопоставления, потому что он все еще возвращал совпадения, содержащие агенты пользователя, которые я не хотел возвращать. Каков правильный способ делать то, что мне нужно, включая частичные совпадения? –

+1

Да, это правильно, вероятно, проблема с частичным совпадением. В списках NOT IN прямое совпадение так будет возвращать прямые совпадения. Таким образом, вы можете использовать комбинацию NOT IN для ваших прямых совпадений в сочетании с предложением LIKE для более общего. Например: 'WHERE w.user_agent NOT IN ($ sql_exclude) && w.ip NOT IN ($ sql_exclude) && w.user_agent НЕ НРАВИТСЯ '% google%' 'для более общего исключения против Google. Вы могли бы также попытаться согласовать все свои строки с прямыми совпадениями, если это проще. –

+0

Хорошо, поэтому я отказался от NOT IN и не пытаюсь НЕ НРАВИТСЯ. Все еще есть проблемы. Новая строка $ sql_exclude выглядит так: '% googlebot% 'ИЛИ'% crawl% 'ИЛИ'% spider% 'ИЛИ'% bluehost% 'ИЛИ'% amazonaws% 'OR'% msnbot% 'OR'% surphace-scout % 'OR'% scoutjet% ''И запрос выглядит так:' $ sql = "SELECT w. * FROM {bad_behavior_log} w WHERE w.user_agent НЕ НРАВИТСЯ ($ sql_exclude) И w.ip НЕ НРАВИТСЯ ($ sql_exclude)" , tablesort_sql ($ header); 'Он все еще возвращает результаты, содержащие совпадения, которые я не хочу? @paulbailey –

1
$sql = "SELECT w.* FROM {bad_behavior_log} w 
WHERE w.user_agent NOT IN ($sql_exclude) AND w.ip NOT IN ($sql_exclude) " . tablesort_sql($header); 
3

Вы должны поменять свои NOT IN положения вокруг. он должен быть column_name NOT IN (list_of_values).

Чувствительность к регистру зависит от конфигурации вашей базы данных.

Запрос не будет выполнять частичные совпадения, только точные (проблемы в сторону). Чтобы выполнить частичные совпадения в SQL, вам нужно будет использовать LIKE и шаблон %.Это не работает в списке IN/NOT IN.

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