开发者

Imploded PHP integer array for Mysql NOT IN clause

开发者 https://www.devze.com 2023-03-13 13:17 出处:网络
I\'ve been trying to use a PHP integer array for a MySQL query that uses the NOT IN clause, but despite no errors it seems to always return the results I want filtered out.

I've been trying to use a PHP integer array for a MySQL query that uses the NOT IN clause, but despite no errors it seems to always return the results I want filtered out.

Example:

$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_erro开发者_运维百科r());

I'm pretty sure this is a logical syntax error.

What I've tested for:

I've made sure that $IDS is treated as an array. Also I have tested to see whether there are values stored within the array. I have also not quoted the integer array, but then I got a mysql syntax error for not having them.


The problem is the two in the beginning and the end of the IN block. They cause the entire implode array to become a comma-separated string.


Your actual query will look like this:

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

"1,2,3,4" is one string, not several values. Get rid of the " quotes.


You could try to use FIND_IN_SET rather than an IN clause.

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

Anyway in SQL you are required to use single quotes for strings, not double quotes. That works with MySQL, but not for all configurations. Also gets more readable if you do it the other way round. (Single quotes in PHP for performance is retarded advise!)

0

精彩评论

暂无评论...
验证码 换一张
取 消