我有一个相对较小的搜索表单,我希望人们用它来搜索我的SQL数据库。
我之前完成此任务的唯一方法是使用十亿个嵌套if语句。有更好的方法吗?
我正在解析我的URL查询字符串,所以我的变量是:
$city
$bedrooms
$elementaryschool
如果我只是尝试尝试:
$sql = "SELECT * FROM $table_name WHERE ";
if(isset($city)) {
$sql .= " `City` LIKE " . $city;
}
if(isset($bedrooms)) {
$sql .= " AND `Bedrooms` >= " . $bedrooms;
}
if(isset($elementaryschool)) {
$sql .= " AND `ElementarySchool` = " . $elementaryschool;
}
然后当$ city未设置时遇到问题,因为我的查询最终以" SELECT * FROM $ table_name WHERE AND Bedrooms
> = $ bedroom"
这不会完全奏效。我有什么选择?
如果我在查询中包含所有参数,我完全理解如何操作,这似乎是以前所有问题都要求的。但是,如果并非所有字段都具有值,我该怎么做呢?我总共有12个可用的字段用于搜索,它们只能搜索1个或全部12个。
正如我之前提到的,我能够找到的所有问题都提到了一个静态SQL查询,而不是具有不同数量参数的查询。
答案 0 :(得分:0)
我会选择:
$sql = "SELECT * FROM $table_name";
$where = array();
$params = array();
然后:
if(isset($city)) {
$where[] = "City LIKE ?";
$params[] = $city;
}
if(isset($bedrooms)) {
$where[] = "Bedrooms >= ?";
$params[] = $bedrooms;
}
if(isset($elementaryschool)) {
$where[] = "ElementarySchool = ?";
$params[] = $elementaryschool;
}
最后:
if(!empty($where)) {
$sql .= "WHERE " . implode(" AND ", $where);
}
$result = $db->prepare($sql)->execute($params);
请注意,在这里,由于我不知道您使用的是哪种数据库层/抽象,$db
表示数据库连接,prepare()
用于创建预准备语句,execute()
1}}运行它,就像使用PDO一样;这也可以防止SQL注入。