簡體   English   中英

PHP語法幫​​助

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM