PHP从URL查询创建MySQL查询

时间:2016-02-01 19:16:12

标签: php mysql parsing

我有一个相对较小的搜索表单,我希望人们用它来搜索我的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查询,而不是具有不同数量参数的查询。

1 个答案:

答案 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注入。