2010-07-03 216 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 " 

运行查询