2012-01-05 56 views
1

確定一個適當的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%'(等)

+1

'NOT IN'不會得到部分匹配 – 2012-01-05 18:08:55

回答

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

似乎迄今爲止所有的回覆都提到了同樣的安置方式,所以我只是回答最初回答的人,但這仍然是針對所有人的:我最初確實有這樣,它確實返回了結果,但是,我想那就是我遇到部分匹配問題的原因,因爲它仍然返回包含我不想返回的用戶代理的匹配項。什麼是正確的方式來做我需要的部分匹配? – 2012-01-05 18:34:42

+1

是的,這是正確的,它可能是部分匹配的問題。不在列表中直接匹配,因此只會返回直接匹配。因此,您可以將NOT IN用於直接匹配,再加上更一般的LIKE子句。例如:'WHERE w.user_agent NOT IN($ sql_exclude)&& w.ip NOT IN($ sql_exclude)&& w.user_agent NOT LIKE'%google%''爲更通用的排除對谷歌。如果更容易,您也可以嘗試使所有字符串符合直接匹配。 – 2012-01-05 18:45:21

+0

好吧,所以我已經放棄了不在,我試圖不喜歡。仍然有麻煩。新的$ sql_exclude字符串如下所示:''%googlebot%'OR'%crawl%'OR'%spider%'OR'%bluehost%'OR'%amazonaws%'OR'%msnbot%'OR'%surphace-scout %'OR'%scoutjet%''查詢看起來像:'$ sql =「SELECT w。* FROM {bad_behavior_log} w WHERE w.user_agent NOT LIKE($ sql_exclude)AND w.ip NOT LIKE($ sql_exclude)」 。 tablesort_sql($ header);'它仍然返回包含我不想要的匹配的結果? @paulbailey – 2012-01-05 22:34:38

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列表中也不起作用。