2014-12-23 94 views
1

特殊字符在我的數據庫,我有這樣的話:PHP的MySQL查詢中排

mysql> select * from link; 
+------------------------+-------+ 
| album     | id | 
+------------------------+-------+ 
| Kakki_Sattai   | 1 | 
| pk (2014)    | 2 | 
| Kakki Sattai   | 3 | 
| pk      | 4 | 
+------------------------+-------+ 

$query = $_GET['query']; 
$query = htmlspecialchars($query); 
$query = mysql_real_escape_string($query); 

$raw_results = mysql_query("SELECT * FROM link WHERE (`album` LIKE '%".$query."%')"); 

如果我使用:

If query = pk  // Result: pk, pk (2014)    --- Workig Fine 
If query = Kakki // Result: Kakki Sattai , Kakki_Sattai --- Workig Fine 

但是如果我使用:

If query = pk 2014   // Result: No Result  ---(i want both result) 
If query = Kakki Sattai // Result: Kakki Sattai ---(Another result Not show)  

如何我可以跳過在mysql表中有特殊字符嗎?

+0

'LIKE'語句不分裂的話,並尋找他們每個人。您可能想要手動完成。通過查詢'pk 2014',你找不到'pk(2014)'。 –

+0

好的。那我怎麼能找到兩者呢? – Higginslpert

+0

就像@Hephaestus說的那樣。或者你可以使用分裂和分離的子句。 –

回答

2

你可以替換空格$query%所以他們會匹配任何:

$query = str_replace(' ', '%', $query); 

但是,如果查詢Sattai Kakki它仍然不會匹配任何東西,因爲訂單是從價值觀不同在桌子裏。

+0

謝謝你正常工作 – Higginslpert

1

如果您不介意對查詢字符串進行一些預處理,則可以用'%'字符替換它們中的空白符。

因此,例如,將「pk 2014」改爲「pk%2014」,將「Kakki Sattai」改爲「Kakki%Sattai」。

編輯:@Taha Paksu說得很好。僅僅將'%'插入到「pk 2014」中將不會得到包含「pk」的兩行行。爲此,您還必須將查詢字符串以空格分隔,並將其他LIKE子句分解到查詢中,以檢查查詢字符串中的空格之間發現的一個或多個離散字。

但是,您可能需要花一些時間分析在實施解決方案之前,您希望進行匹配的寬容或限制。例如,如果您對查詢字符串中的每個離散單詞(例如,將初始查詢添加了子句'OR專輯LIKE'%pk%'或專輯LIKE'%2014%'')或其他LIKE測試,請在專輯名稱中將所有其他記錄與「2014」一起放入專輯名稱中,這可能不需要。

+0

謝謝你正常工作 – Higginslpert

+0

不知道通配符也可以用於這種情況......!謝謝+1 –

0

您可以使用查詢拆分這樣的:

$query = $_GET['query']; 
$query = htmlspecialchars($query); 
$query = mysql_real_escape_string($query); 
$query = implode('\' or `album` LIKE \'',explode(' ',$query)); 
$raw_results = mysql_query("SELECT * FROM link WHERE (`album` LIKE '%".$query."%')");