用PHP搜索mySQL,使用WHERE通配符还是IF语句?

时间:2010-07-03 11:33:56

标签: php sql search wildcard if-statement

我让用户按城市搜索我的数据库中的数据。 我的查询如下:

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

我希望用户能够搜索“所有城市”,所以如果$ city =='所有城市',我想删除WHERE语句;或者使用通配符作为匹配数据库中所有城市的WHERE语句。

我以前有一个在两个查询之间切换的IF语句,但我想添加更多过滤器,如国家/所有国家/地区,zipcode /所有zipcodes等,所以我宁愿保留一个动态SQL查询。

4 个答案:

答案 0 :(得分: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");

答案 1 :(得分:0)

一种方式是案例陈述:

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

如果用户正在搜索“所有城市”,则会将WHERE语句转换为:

WHERE City = City

总是如此(至少对于非零城市;))

P.S。确保使用只读MySQL帐户运行这些查询。用户可以在$city参数中输入有趣的内容!

答案 2 :(得分:0)

你可以尝试

WHERE City like '$city'

并允许用户输入通配符,如果您认为他们可以使用它。

答案 3 :(得分: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 " 

运行查询