使用NOT IN和PHP数组形成正确的SQL查询时遇到一些问题


Having some trouble forming a proper SQL query using NOT IN and PHP array

好吧,我还没有受过SQL方面的太多训练,我想做的是,我有一系列搜索引擎机器人程序和IP(或部分IP),我想将它们排除在SQL结果中。

该数组已经为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.'

查询检查数据库中的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"一词,并且数组术语只是"谷歌"时,SQL查询会自动找到部分匹配吗?(也适用于部分IP)。

更新:为了彻底起见,万一以后有人读到这篇文章,我用两件事解决了我的问题:

1) 出于某种原因,我不确定这是否是我的主机设置(Bluehost),我需要将比较运算符(not LIKE)的所有搜索字符串转换为大写,或者它会任意匹配一些,而不匹配一些混合大小写搜索。

2) SQL变量周围的括号也导致查询阻塞。即($sql_exclude)应该只是$sql_eexclude。

这是我的最后一个正在工作的查询字符串:$sql="从{bad_behavior_log}w中选择w.*,其中w.user_agent不喜欢$sql_exclude_agents和w.ip不喜欢$sql_exclude_ips"。tablesort_sql($header);

这些变量中的字符串如下所示:$sql_exclude_agents="'%".inburde("%'AND w.user_agent NOT LIKE'%",$exclude_agents)。"%'";

(变成)不喜欢"%GOOGLE%"和w.user_agent不喜欢"%IAHOOCACHESYSTEM%",w.user_aagent不喜欢"%SRSSGRAFFITI%"和w.user_agent不像"%BITLYBOT%"(等等)

如果使用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)

您需要交换NOT IN子句。它应该是CCD_ 4。

区分大小写取决于数据库的配置方式。

查询不会进行部分匹配,只进行精确匹配(大小写问题除外)。要在SQL中进行部分匹配,需要使用LIKE%通配符。这在IN/NOT IN列表中也不起作用。

   $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);