2012-02-24 32 views
3

我有查詢Select * from table1 where name like '%Whateveruserpassintextbox%'如何處理查詢中的%?

當用戶通過%在文本框中查詢時返回所有的表數據。

什麼是處理這種情況的正確方法?

+0

正確的方法是,以微薄的可能性解釋你想要什麼。只有在你知道之後,你才能實現它... – Konerak 2012-02-24 06:19:49

+0

有關SQL注入的任何想法? – 2012-02-24 06:20:37

+1

當用戶輸入%時,他只能得到與named中的%相匹配的數據。 – 2012-02-24 06:21:40

回答

4

試試做\%匹配一個「%」字符。閱讀更多關於MySql Docs

要測試通配符的文字實例,請在其前面加上轉義字符。如果您未指定ESCAPE字符,則假定爲「\」。

----------------------------------------- 
| String | Description    | 
----------------------------------------- 
| \%  | Matches one 「%」 character | 
| \_  | Matches one 「_」 character | 
----------------------------------------- 
4

一開始,像這樣的查詢被稱爲一個性能殺手。通常你應該這樣做是有問題的。

但是,如果用戶通過在%,你需要的東西,如逃吧:

select * from table1 
where name like '%50\% off sale%' 
escape "\"; 

我覺得\實際上是默認轉義字符,但我傾向於在情況明確指定其默認的可能不斷變化。

因此,基本上,你預先處理字符串與\%之前更換%你把它在兩端的兩個%標記之間。

您還應該通過像mysql_real_escape_string這樣的過濾器傳遞任何用戶輸入以防止SQL注入攻擊。在執行上述建議的預處理之前,請執行此操作,以便您的\%無意中變爲\\%

還有'%'「任意數目的字符」通配符,你也應該逃避'_'「一個字符」通配符,以免user_name也將匹配像usersname事情。

所以這個過程將是:從用戶

  • GET字符串。
  • 通過mysql_real_escape_string
  • 通過將%全部替換爲\%來進一步清理它。
  • 通過將_全部替換爲\_來進一步清理它。

只有這樣,你甚至開始想想,你可能要考慮使用字符串:-)

+0

表現殺手!你在這裏提到的好點 – Jayy 2012-02-24 06:26:35

0

希望這有助於

$search=$_POST['whatuserTypes']; 

if($search == '%') 
{ 
$query=("Select * from table1;"); 
} 
else 
{ 
    $query = sprintf("SELECT * FROM table1 WHERE name like '%s'", 
    mysql_real_escape_string($search)); 
}