PHP 从 URL 查询创建 MySQL 查询


PHP to create MySQL query from URL query

我有一个相对较小的搜索表单,我希望人们用它来搜索我的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时,我遇到了一个问题,因为我的查询最终以"从 $table_name 中选择 * WHERE AND Bedrooms>= $bedrooms">

这并不完全有效。我有哪些选择?

如果我在查询中包含所有参数,我完全理解该怎么做,这似乎是所有以前的问题所问的。但是,当并非所有字段都有值时,我该怎么做呢?我总共有 12 个可能的字段可用于搜索,它们只能按 1 个或全部 12 个进行搜索。

正如我之前提到的,我能够找到的所有问题都是指提出一个静态SQL查询,而不是具有不同数量参数的查询。

我会选择:

$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()运行它,就像您使用PDO一样;这也防止SQL注入。