Mysql NOT IN子句的内爆PHP整数数组

时间:2011-06-15 03:31:07

标签: php mysql mysql-error-1064

我一直在尝试将PHP整数数组用于使用NOT IN子句的MySQL查询,但是尽管没有错误,它似乎总是返回我想要过滤掉的结果。

示例:

$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 个答案:

答案 0 :(得分:6)

问题是块的开头和结尾有两个IN。它们导致整个implode数组变为以逗号分隔的字符串。

答案 1 :(得分:3)

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

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

"1,2,3,4" 一个字符串,而不是几个值。摆脱"引号。

答案 2 :(得分: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中用于性能的单引号被推迟!)