2015-09-24 162 views
0

我在我的網站上有一個搜索欄,我在這個用戶的幫助下使用谷歌地點API自動完成服務可以插入城市,州,國家,地址,郵政編碼。 mysql數據庫是國家,州,城市,地址,郵編code.i我用mysql LIKE子句搜索records.My查詢:mysql LIKE無法正常工作或

$sql = "SELECT * 
     FROM location 
     WHERE ((country LIKE '%".$search."%') 
     OR (city LIKE '%".$search."%') 
     OR (state LIKE'%".$search."%') 
     OR (address LIKE'%".$search."%') 
     OR (zipcode LIKE'%".$search."%'))"; 

我試圖從搜索字符串,但沒有luck.if我插入刪除逗號只有國家或只有城市或只有州或唯一的地址或只有郵政編碼,然後它給出正確的結果,但是當我搜索地址,城市,州,國家或改變命令它不起作用請幫助我out.thanks提前。

+0

我認爲結束雙引號缺失。另外,我假設您知道LIKE區分大小寫。 – johnyTee

+0

今天早些時候看起來很像此問題:http://stackoverflow.com/questions/32757828/how-to-search-multiple-columns-in-database-with-one-searchbar – PaulF

+1

如果你的'$ search'字符串裏面有說法,'城市'和'zipcode',你會發現什麼?如果它是一個字符串,那麼它將不可能匹配任何東西。如果你將輸入保存爲單獨的字段,將它們與「類似」測試相匹配會更容易。即有'$ citySearch','$ stateSearch'等 –

回答

1

請注意空格和引號。試着這樣說:

$sql = "SELECT * 
      FROM location 
     WHERE country LIKE '%$search%' 
      OR city LIKE '%$search%' 
      OR state LIKE '%$search%' 
      OR address LIKE '%$search%' 
      OR zipcode LIKE '%$search%'"; 
0

您正試圖獲得與LIKE語句記錄,試圖串聯的字段是這樣的:

$sql = "SELECT * FROM location WHERE CONCAT(country, ' ', state, ' ',city, ' ', address, ' ', zip_code) like '%" . $search . "%'"; 

如果你想要更好的效果,你可以使用PHP函數爆炸是這樣的:

$words = explode(' ', $search); 
$i = 0; 
foreach($words as $p) { 
    if ($i == 0) { 
     $sql_aux = $sql_aux . "CONCAT(country, ' ', state, ' ',city, ' ', address, ' ', zip_code) like '%" . $p . "%'"; 
    } 
    elseif($i > 0) { 
     $sql_aux = $sql_aux . "and CONCAT(country, ' ', state, ' ',city, ' ', address, ' ', zip_code) like '%" . $p . "%'"; 
    } 
    $i++; 
} 
+0

感謝您的回覆,但它不適用於我。我搜索像美國伊利諾伊州Port Barrington,它給我那些地址相同但沒有相同地址的記錄不會來。但我關心的是那些誰屬於IL還是美國也都來了。 – arjun

+0

如果在SQL語句中使用它之前將逗號字符替換爲字符串$ search中的空格字符,它會起作用嗎? – nun3z

+0

不,它不工作。我已經這樣做了。 – arjun

0

這不是問題,你將能夠簡單地在SQL中解決。

重要提示:閱讀SQL注入。在任何情況下,都不應該通過直接連接變量來構建查詢。

你正在嘗試做的事情 - 如果你停下來看看它從數據庫的角度來看 - 是要求數據庫中讀取你的表的每一行,並尋找可能的匹配。

即使它起作用,除非您有一個非常小的數據集,否則它將無法正常工作,因爲必須爲每個查詢讀取整個表。

雖然你的比較是倒退的。

你可能真的不希望這樣評價:

city LIKE '%$string%' 
state LIKE '%$string%' 

'Houston' LIKE '%Houston, TX%' # false! 
'TX' LIKE '%Houston, TX%' # also false! 

當你考慮你的查詢要求服務器做,似乎很明顯,你的邏輯是行不通的。 LIKE的論點在任何意義上都是不可交換的。

什麼你實際上是試圖尋找更像這樣

'$string' LIKE CONCAT('%',city,'%') 
'$string' LIKE CONCAT('%',state,'%') 

'Houston, TX' LIKE '%Houston%' # true! 
'Houston, TX' LIKE '%TX%' # also true! 

實際上,你需要扭轉的比較,使查詢邏輯正確的。

但是,對於較大的數據集,邏輯正確性仍然會非常糟糕,因爲服務器需要做很多工作,而查詢優化器通常沒有可用的快捷方式。這是一種強力方法,基本上是最糟糕的方法。

正確的解決方案要複雜得多:您必須標記應用程序中的地址並創建智能查詢,這將是完全不同的查詢,具體取決於搜索框內容中找到的模式。一旦你確定你所相信的是,例如,一個狀態,你WHERE條款要具體,和左錨:

WHERE state LIKE CONCAT($parsed_state,'%') 

決不在LIKE參數的開始使用%如果能夠避免它。如果您希望具有合理的性能並可能利用色譜柱上的索引,則只能在最後使用它們。

令牌化自由格式地址,即使是「完整的」地址也是不小的壯舉。例如,請參閱How to parse freeform street/postal address out of text, and into components