2011-05-15 3 views
13

MySQL 문에서 2 개의 빈 변수를 검사하려고하는데 구문이 올바로 표시되는 것처럼 보일 수 있습니다. 여기에 내가 지금 가지고있는 것이있다. 그리고 그것은 나에게 오류를주고있다. 아무도 내가 제대로 할 수있는 방법을 말해 줄 수 있습니까?MySQL에서 빈 변수를 두 번 이상 사용하려면 어떻게해야합니까?

SELECT threads, userid, username, usergroupid 
    FROM " . TABLE_PREFIX . "user 
    WHERE 
    " . iif(!empty($exuserids), "AND userid NOT IN ($exuserids)") . " 
    " . iif(!empty($exgroups), "AND usergroupid NOT IN ($exgroups)") . " 
ORDER BY threads DESC 
    LIMIT 1 

답변

5

사용 :이있을 필요가

SELECT threads, userid, username, usergroupid 
    FROM " . TABLE_PREFIX . "user 
    WHERE 1 = 1 
    " . iif(!empty($exuserids), "AND userid NOT IN ($exuserids)") . " 
    " . iif(!empty($exgroups), "AND usergroupid NOT IN ($exgroups)") . " 
ORDER BY threads DESC 
    LIMIT 1 

절 "... AND"지정하기 전에 WHERE a - 치를 1 = 1가 밖으로 최적화됩니다. WHERE 절 연결을보다 쉽게하기 위해 동적 SQL에 사용되는 트릭입니다.

+0

그 트릭을했습니다. 고맙습니다. 나는 오늘 새로운 것을 배웠다. – Boofo

0

오류가 발생하는 것은 당연합니다. PHPkit 또는 다른 것을 사용하고 있습니까? iif 이렇게 말하지 않아도 위의 내용은 PHP로 작성되었으며 iif은 언어의 일부가 아니기 때문에.

이제 문을 귀중하게 컴파일하지 않아도됩니다. 배열에서 조건을 수집하고 AND로 내파하고 WHERE 조건이 비어 있지 않으면 추가하십시오.

마지막으로 쿼리에 변수가 있으면 SQL 주입 공격의 방법이됩니다.

+0

조건은 이미 설정 배열에 있습니다. 난 그냥 그들이 비어 있는지 확인하고 만약 그들이 0 이외의 아무것도 그들을 실행합니다. – Boofo

+0

iif는 vbulletin의 함수입니다. 'code' 함수 IIF ($ 발현 $ returntrue, $ returnfalse = '') { \t 창 ($ 식의 returntrue $ : $의 returnfalse); } – Boofo

관련 문제