確定一個適當的SQL查詢,我不太接受教育的SQL還和我想要做的是,我有搜索引擎機器人和IP(或部分IP的數組),我想排除從SQL結果中返回的結果。遇到一些麻煩形成使用NOT 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.'
對DB中的IP和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也是如此)。
更新: 出於完整性着想,萬一有人後來讀取此,我解決我的問題有兩件事情:
1)出於某種原因,不知道這是否是我的主機的設定(BlueHost的),我需要將我的比較運算符(不是LIKE)的所有搜索字符串轉換爲大寫字母,否則它會隨意匹配一些字符串,而不匹配一些混合大小寫搜索。
2)圍繞我的SQL變量的括號也導致查詢嗆。即($ sql_exclude)應該只是$ sql_exclude。
這是我最後的工作查詢字符串: $ sql =「SELECT w。* FROM {bad_behavior_log} w WHERE w.user_agent NOT LIKE $ sql_exclude_agents AND w.ip NOT LIKE $ sql_exclude_ips」。 tablesort_sql($頭);
,並在這些變量中的字符串是這樣的: $ sql_exclude_agents = 「 '( 」AND w.user_agent NOT LIKE '%$ exclude_agents 「%。」;%「 破滅%」)'。'
(變成) NOT LIKE '%GOOGLE%' AND NOT w.user_agent LIKE '%YAHOOCACHESYSTEM%' AND NOT w.user_agent LIKE '%RSSGRAFFITI%' AND NOT w.user_agent LIKE '%BITLYBOT%'(等)
'NOT IN'不會得到部分匹配 – 2012-01-05 18:08:55