用于Mysql NOT IN子句的PHP整数数组压缩

4
我将使用PHP整数数组作为MySQL查询的NOT IN子句,但尽管没有错误,似乎总是返回我想要过滤掉的结果。
示例:
$IDS = $_SESSION['Posts'];
$Select = 'SELECT * 
             FROM status 
            WHERE (W_ID = '.$ID.') 
              AND (ID NOT IN ("'.implode(',', $IDS).'")) 
         ORDER BY ID DESC 
            LIMIT '.$Begin.', '.$Number.'';

$Select = mysql_query($Select) OR DIE(mysql_error());

我很确定这是一个逻辑语法错误。
我测试过:
我确保$IDS被视为数组。同时,我已经测试了数组中是否存储了值。我也没有引用整数数组,但是没有引用它们,我得到了一个mysql语法错误。
3个回答

6
问题在于IN块开头和结尾的两个"符号。它们导致整个implode数组成为一个逗号分隔的字符串。

删除这些仍然会给我一个错误:您的SQL语法有误;请检查与您的MySQL服务器版本相对应的手册,以了解在第1行附近使用正确的语法。 - Trevor
SELECT * FROM status WHERE (W_ID=3) AND (ID NOT IN (3, 4, 5, 6)) ORDER BY ID DESC LIMIT 0, 20 -- 这是完全有效的 SQL。请发表您的吧。 - Michael
谢谢,我发现循环的第一轮初始值为空白,你的解决方案起作用了。 - Trevor
在输入值时,还要检查马里奥的答案。正如他所指出的那样,仅依赖于输入数据并不总是安全的。 - Michael

3

您实际的查询将如下所示:

ID NOT IN ("1,2,3,4")

"1,2,3,4"是一个字符串,而不是多个值。去掉"引号。"

我使用了相当长的时间,但发现了一些奇怪的行为。我使用了 WHERE NOT IN(1,2,34,65,78,87,90,105),它返回了类似于 10,15,25,60,87,90 的东西,所以它不能正常工作。 - Julian F. Weinert
你是如何移除它的? - Muhaimin CS

0
你可以尝试使用 FIND_IN_SET 而不是 IN 子句。
  $IDS = mysql_real_escape_string(implode(',', $IDS));
  $Select = "SELECT * FROM status WHERE (W_ID=$ID)
             AND (NOT FIND_IN_SET(ID, '$IDS'))
             ORDER BY ID DESC LIMIT $Begin, $Number";

无论如何,在SQL中,您必须使用单引号来表示字符串,而不是双引号。这适用于MySQL,但并非所有配置都适用。如果您采用相反的方式,代码会更易读。(在PHP中使用单引号以提高性能的建议是愚蠢的!)


1
用户744319使用的NOT IN是完全有效的。 - Michael
是的,它是有效的。甚至建议使用它。但这个更易于操作,并且对于 OP 来说似乎更合适。(也更容易确保安全性,不确定 ID 值的来源在哪里) - mario
抱歉,我指的是FIND_IN_SET。我同意你关于转义部分的观点。你应该在你的答案中提到这一点。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接