2009-10-22 102 views
-1

我工作的一個搜索功能,它是工作的罰款四天前,現在它的返回該錯誤PHP語法幫​​助

您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,在第1行'AND狀態='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 . " ' " ; 

} 

回答

7

你不能把AND連詞您WHERE子句的ORDER BY之後。您的ORDER BY條款必須在整個WHERE條款之後。

+1

他是對的:-) 您也可能在$ query。=「AND state ='」中有一些虛假空格(如「'」)。 $ search_state。 「'」; – DilbertDave 2009-10-22 15:23:17

+0

是的。這個更好,因爲它不會導致查詢拋出語法錯誤,它會讓它默默無聞地工作。 – chaos 2009-10-22 15:26:56

+0

真棒,非常感謝你! – 2009-10-22 16:45:03

0

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%' "; 

,因爲你的字符串是雙引號

0

你需要把在where之後和sort_by之前的AND語句。 將sort_by移動到php的末尾(追加到查詢字符串),它應該起作用。

0

試試這個:

$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語句來最後。此外,您在查詢的city =部分中的城市名稱周圍有空格。雖然這是有效的SQL語法,但它只會返回城市名稱被空格包圍的結果。我猜這不是你想要的。

此外,您可能需要添加更多的字段到您的order by。現在,它將按狀態排序,但是記錄會按照狀態隨機回來。也許像

$query.= "ORDER BY state, city, name, id" 

最後,僅供參考,如果你不仔細消毒搜索的投入,這種做法容易受到SQL注入。

0

我想這可能工作:

$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

+0

這真的有幫助的建議。謝謝。我在頁面上使用了這個腳本。 – 2009-10-22 17:18:41

0

此外,你似乎有單引號和雙引號之間的空格,這將使得這樣的查詢:AND state ='AZ'這可能不是你想要的。您也可以避開PHP的額外報價和級聯使用的語法如下:

$query .= " AND state = '$search_state' "; 

我當然不得不提的,你應該淨化你的輸入,以防止SQL注入。