2010-07-03 218 views
1

我讓用戶按城市搜索我的數據庫中的數據。 我的查詢是這樣的:用PHP搜索mySQL,使用WHERE通配符或IF語句?

$results = mysql_query("SELECT * FROM mydb WHERE City='".$city."' LIMIT 10");

我希望用戶能夠搜索到「所有城市」,所以我想要麼刪除WHERE語句,如果$城市==「所有城市」;或者使用通配符來匹配db中所有城市的WHERE語句。

我曾經有一個在兩個查詢之間切換的IF語句,但我想添加更多的過濾器,如國家/所有國家,郵編/所有郵編等,所以我寧願保留一個動態SQL查詢。

+0

強制性警告關於採取'從用戶輸入$ city':http://xkcd.com/327/ – egrunin 2010-07-03 18:34:57

回答

2

那麼,你仍然可以只有一個查詢和動態生成where子句,因爲這樣的:

$where = ''; 

// conditional statements (if/else, switch) for populating the where clause 
$where .= " WHERE City = '{$city}'"; 
$where .= " AND Country = '{$country}'"; 

$results = mysql_query("SELECT * FROM mydb{$where} LIMIT 10"); 
+0

非常好,正是我在找的! – 2010-07-03 16:49:13

0

的一種方式將是一個case語句:

WHERE City = case when '$city' = 'All cities' then City else '$city' end 

如果用戶搜索「所有城市」,這原來的WHERE語句爲:

WHERE City = City 

這始終是真實的(在至少非空城市;))

PS確保您使用只讀的MySQL帳戶運行這些查詢。用戶可以輸入有趣的東西到$city參數!

+0

關於你最後的評論:阻止有趣的東西只是使用準備好的語句或適當的轉義功能。當然,一個只讀的MySQL帳戶也不會傷害任何一方。 – 2010-07-03 12:14:05

0

你可以嘗試

WHERE City like '$city' 

,並允許用戶輸入通配符,如果你認爲他們會到它。

0

雖然不是PHP程序員,這個僞可能會提供一個選項...有條件打造出你的where子句。另外,我會用參數化查詢來代替直接構建字符串來防止SQL注入攻擊。

cYourSQL = "select * from YourTable where " 

cAndRequired = "" 

if city is NOT "all cities" 
    cYourSQL = cYourSQL + cAndRequired + " city = 'YourParameterValueProvided' " 
    cAndRequired = " AND " 
endif 

現在,隨時添加您的國家選擇

cYourSQL = cYourSQL + cAndRequired + " country = 'YourCountryValue' LIMIT 10 " 

運行查詢