[英]Php Syntax Help
我正在使用搜索功能,四天前工作正常,現在返回此錯誤
您的SQL語法有誤; 檢查與您的MySQL服務器版本相對應的手冊,以在第1行的'AND state ='AZ'附近使用正確的語法
該行的正確語法是什么?
if($search_state !== "") {
$query .="AND state = '" . $search_state . " ' " ;
整個部分是:
$query = "SELECT id, name, contact, contact2, address1, address2, city, state, postalcode, country, location, workphone, fax, email, webaddress, region, rail, food, forest, metal, bulk, chem, general, paper FROM companies_new WHERE dummy = '' ORDER BY state ASC ";
if($search_co !== "") {
$query .= "AND name LIKE '%" . $search_co ."%' ";
}
if($search_first !== "") {
$query .= "AND contact LIKE '%" .$search_first."%' ";
}
if($search_last !== "") {
$query .= "AND contact LIKE '%" .$search_last."%' ";
}
if($search_city !== "") {
$query .="AND city = ' " . $search_city . " ' ";
}
if($search_state !== "") {
$query .="AND state = '" . $search_state . " ' " ;
}
您不能在ORDER BY
之后將WHERE
子句的AND
連詞放入。 您的ORDER BY
子句必須位於整個WHERE
子句之后。
WHERE部分在代碼中的AND之前,這是錯誤的。 這就是你想要的
$query = "SELECT id, name, contact, contact2, address1, address2, city, state, postalcode, country, location, workphone, fax, email, webaddress, region, rail, food, forest, metal, bulk, chem, general, paper FROM companies_new WHERE dummy = '' ";
if($search_co !== "") {
$query .= "AND name LIKE '%" . $search_co ."%' ";
}
...
$query .= " ORDER BY state ASC ";
另外,出於完整性考慮,您可以使代碼更易於閱讀:
$query .= "AND name LIKE '%$search_co%' ";
因為您的字符串用雙引號引起來
您需要將AND語句放在where之后和sort_by之前。 將sort_by移動到php的末尾(附加到查詢字符串),它應該可以工作。
嘗試這個:
$query = "SELECT id, name, contact, contact2, address1, address2, city, state, postalcode, country, location, workphone, fax, email, webaddress, region, rail, food, forest, metal, bulk, chem, general, paper FROM companies_new WHERE dummy = '' ";
if($search_co !== "") {
$query .= "AND name LIKE '%".$search_co."%' ";
}
if($search_first !== "") {
$query .= "AND contact LIKE '%".$search_first."%' ";
}
if($search_last !== "") {
$query .= "AND contact LIKE '%".$search_last."%' ";
}
if($search_city !== "") {
$query .= "AND city = '".$search_city."' ";
}
if($search_state !== "") {
$query .= "AND state = '". $search_state."' " ;
}
$query.= "ORDER BY state ASC"
正如其他人所說,您的order by
聲明order by
必須排在最后。 此外,查詢的city =
部分中的城市名稱周圍有空格。 盡管這是有效的SQL語法,但只會返回城市名稱被空格包圍的結果。 我猜那不是您想要的。
另外,您可能希望通過添加更多字段到您的order by
。 現在,它將按狀態排序,但是記錄將按狀態隨機返回。 也許像
$query.= "ORDER BY state, city, name, id"
最后,僅供參考,如果您不仔細清理搜索輸入,則此方法容易受到SQL注入的影響。
我認為這可能有效:
$query = "SELECT id, name, contact, contact2, address1, address2, city, state, postalcode, country, location, workphone, fax, email, webaddress, region, rail, food, forest, metal, bulk, chem, general, paper FROM companies_new ";
$conditions = array();
if(!empty($search_co)) {
$conditions[] = "name LIKE '%" . $search_co ."%' ";
}
if(!empty($search_first)) {
$conditions[] = "contact LIKE '%" .$search_first."%' ";
}
if(!empty($search_last)) {
$conditions[] = "contact LIKE '%" .$search_last."%' ";
}
if(!empty($search_city)) {
$conditions[] = "city = '" . $search_city . "' ";
}
if(!empty($search_state)) {
$conditions[] = "state = '" . $search_state . "' " ;
}
if (count($conditions) > 0) {
$query .= " WHERE " . implode(' AND ', $conditions);
}
$query .= " ORDER BY state ASC";
編輯:使用的原始版本為空,應該為空。 現在已修復。
編輯2:這還假設您已經使用mysql_real_escape_string或類似方法清理了變量。
注意,ORDER BY必須在WHERE子句之后。
implode接受一個數組並將其轉換為在元素之間具有指定字符串的字符串。 因此,鑒於:
$myArray = array('A', 'B', 'C');
你可以做
$myString = implode(' and ', $myArray);
這會將“ A,B和C”放入$myString
。
另外,您似乎在單引號和雙引號之間有空格,這將使查詢如下:AND state ='AZ'可能不是您想要的。 您還可以通過使用以下語法來避免PHP中的其他引號和串聯:
$query .= " AND state = '$search_state' ";
當然,我不得不提到,您應該清理輸入內容以防止SQL注入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.