2011-06-15 3 views
4

나는 NOT IN 절을 사용하는 MySQL 쿼리에 PHP 정수 배열을 사용하려고 시도했지만 오류가 없더라도 항상 필터링하려는 결과를 반환하는 것으로 보입니다.Mysql NOT IN 절에 대한 Imploded PHP 정수 배열

예 :

$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 구문 오류가 발생했습니다.

답변

6

문제는 블록의 시작과 끝에 두 개의 입니다. 그것들은 전체 implode 배열을 쉼표로 구분 된 문자열로 만듭니다.

+0

이들을 제거하면 여전히 오류가 발생합니다. SQL 구문에 오류가 있습니다. 올바른 구문을 보려면 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. ') ORDER BY ID DESC LIMIT 0, 20'on line 1 – Trevor

+0

SELECT * FROM status WHERE (W_ID = 3) AND (ID NOT IN (3) , 4, 5, 6)) 오더 별 ID DESC LIMIT 0, 20 -이 SQL은 완벽하게 유효합니다. 너의 포스트를 기쁘게 해달라. – Michael

+0

초기 값은 루프의 첫 번째 라운드에서 공백이었습니다. – Trevor

3

귀하의 실제 쿼리는 다음과 같이 표시됩니다

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

"1,2,3,4"하나의 문자열이 아니라 여러 값이다. " 따옴표를 제거하십시오.

+0

나는 이것을 오랫동안 사용해 왔지만 어떤 이상한 행동을 발견했다. 나는'101525608790'과 같은 것을 되 돌린'WHERE NOT IN (1,2,34,65,78,87,90,105)'을 사용했다. 그래서 제대로 작동하지 않는다. –

0

IN 절 대신 FIND_IN_SET을 사용해 볼 수 있습니다.

$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

'NOT IN' 사용자 744319가 사용하는 것이 완벽하게 유효합니다. – Michael

+0

예. 유효합니다. 심지어 좋습니다. 그러나이 방법은 작업하기가 쉽고 OP에 더 적합합니다. (ID 값의 출처가 확실하지 않은 경우에도 보안이 쉽습니다.) – mario

+0

죄송합니다. FIND_IN_SET을 (를) 말하고있었습니다. 탈출 부분에 대해 당신과 동의하십시오. 그 점을 대답에 언급해야합니다. – Michael