2014-03-28 3 views
0

그래서 두 개의 변수를 전달하기 위해 검색 스크립트와 meed를 만들었지 만 먼저 SQL QUery가 올바른지 확인하여 지금은 변수를 하드 코딩하고 있습니다.이 SQL IF 선언문의 문제점은 무엇입니까?

cannot run the query because: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE province IN ('Alberta','Ontario') ORDER BY surname LIMIT 0, 5' at line 1 
: 쿼리가 실행될 때, 나는이 메시지가 다음

$sql = "SELECT * FROM persons WHERE 1=1"; 



if ($firstname) 
$sql .= " AND firstname='" . mysqli_real_escape_string($mysqli,$firstname) . "'"; 

if ($surname) 
$sql .= " AND surname='" . mysqli_real_escape_string($mysqli,$surname) . "'"; 

if ($province) 
$sql .= " AND province='" . mysqli_real_escape_string($mysqli,$comma_separated) . "' WHERE province IN ($comma_separated)"; 

$sql .= " ORDER BY surname"; 

과 : 그래서 내 변수는이처럼 보이는 쿼리로 전달지고

$comma_separated = "'Alberta','Ontario'"; 

입니다

하지만 나에게 쿼리가 올바르게 보이는데, 여기서 내가 무엇을 놓치고 있습니까?

미리 감사드립니다. 당신은 두 번 거기에 WHERE을 가질 수 없습니다

if ($province) 
    $sql .= " AND province IN (" . mysqli_real_escape_string($mysqli,$comma_separated) . ")"; 
+5

은 전체 쿼리 –

+0

편집을 게시 할 수 있습니다. 상기 참조하십시오. – JLA

+1

쿼리에서'WHERE'를 두 번 사용했습니다. –

답변

2

:

+0

무언가가 implode에 대한 구문과 일치합니다. 내가 그것을 에코 할 때 나는 implode (, $ province)를 얻는다. ". 나는 당신의 코멘트를 기다리는 동안 그것을 고치려고 노력할 것이다. 그러나 당신은 펀치에 나를 때릴지도 모른다. – JLA

+0

@JLA 잘 보입니다. 문자열 인용과 관련된 내용과 다른 것을 했습니까? 만약 당신이 놓친다면 당신은 그 줄의 어딘가에 작은 따옴표를 넣었을 것입니다. –

+0

두 번 확인했는데 결과가 검색되지 않습니다. – JLA

-1
는에 마지막 부분을 변경

. 또한 지방 값을 두 가지 다른 방법으로 필터링하려고하는 것 같습니다. $province 항상 값 (단일 값이 주어진 경우에도)의 배열이 될 것이라는 가정을 바탕으로, 당신이 시도 할 수 있습니다 :

$sql = "SELECT * FROM persons WHERE 1=1"; 

if (!empty($firstname)) { 
    $sql .= " AND firstname='" . mysqli_real_escape_string($mysqli,$firstname) . "'"; 
} 

if (!empty($surname)) { 
    $sql .= " AND surname='" . mysqli_real_escape_string($mysqli,$surname) . "'"; 
} 

if (!empty($province)) { 
    array_walk($province, function($value, $key_not_used) use ($mysqli) { 
     return mysqli_real_escape_string($mysqli, $value); 
    }); 
    $sql .= " AND province IN ('" . implode(',', $province) . "')"; 
} 

$sql .= " ORDER BY surname"; 
+1

이것은 실제로 잘못되었습니다. 문자열 값 주위에 작은 따옴표가 있어야합니다 (MUST). 그 문자열은 문제가있는 곳이 아닙니다. –

+0

@MikeBrant 네 말이 맞아. 모르겠다 고 생각했는데 ... 고정 됐어. –

1

당신의 SQL은 두 WHERE 년대가 포함되어 있습니다.

SELECT * FROM persons WHERE 1=1 
         AND firstname='fn' 
         AND surname='sn' 
         AND province='p' 
         WHERE province IN ($comma_separated) 
         ORDER BY surname 

변경 마지막 비트가로 :

$sql .= " AND province='" . mysqli_real_escape_string($mysqli,$comma_separated) . "' AND province IN ($comma_separated)"; 

된다 :

AND province='p' 
AND province IN ('Alberta','Ontario') 
관련 문제