2014-03-28 111 views
0

所以我正在構建一個搜索腳本並且要傳遞兩個變量,但首先我要確保SQL QUERY是正確的,因此我現在對這個變量進行了硬編碼。所以我的變量是此SQL IF語句有什麼問題?

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

是能否通過對查詢,它看起來像這樣過去了:

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

,然後運行查詢時,我得到這個消息:

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 

但對我來說,查詢看起來是正確的,我在這裏錯過了什麼?

在此先感謝。

+5

發佈完整的查詢 –

+0

編輯。請參閱上文。 – JLA

+1

您在查詢中使用過'WHERE' –

回答

2

你不能在那裏WHERE兩次。您似乎也試圖以兩種不同的方式過濾省份的價值觀。基於這樣的假設$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"; 
+0

有些東西與你的內在語法有關。當我回應出來時,我得到'「。implode(,$省)。」'。我會在等待你的評論時嘗試修復它,但是你可能會讓我失望。 – JLA

+0

@JLA對我來說看起來很好。你有沒有做過與字符串引用相關的內容?如果你錯過了那一行的某個地方,你可能會得到一個單引號。 –

+0

我已經仔細檢查了這一點,沒有檢索到任何結果。 – JLA

-1

最後部分更改爲:

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

這實際上是錯誤的。單引號必須存在於字符串值周圍。該字符串不是問題所在。 –

+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')