从具有联接表的POST数组创建MySQL搜索查询

时间:2019-01-28 17:16:42

标签: php mysql search

我正在使用一些可选搜索条件为场地网站构建搜索功能。我从一个基本查询开始,然后根据提交的参数对其进行修改。

这是我的数据库结构示例:

场地

id | title
----------
1  | First venue
2  | Second venue

类型

id | type
---------
1  | Barn
2  | Hotel
3  | Castle

地点类型

venue_id | type_id
------------------
1        | 1
1        | 2
1        | 3

开始的MySQL查询是:

SELECT * FROM venues 
WHERE visible = 1 
$query 
ORDER BY title ASC

下面是一个示例,说明如何为一个简单的选项修改$ query变量:

if(isset($_POST['region']))
    {
      $query .= " AND region_id = " . $mysqli->real_escape_string($_POST['region']);
    }

现在,我遇到的问题是提交“ type”选项时如何处理,该选项包含多个值:

<select multiple name="type[]">

我开始尝试创建另一个修饰符查询,但确实很难知道如何处理这一部分,如何采用POST数组并连接相关表。

任何帮助,不胜感激!

1 个答案:

答案 0 :(得分:0)

只是一个想法,如何实现

<?php
$sql = [
    "SELECT * FROM `venues` AS `v`",
    "INNER JOIN `venues_types` AS `vt` ON vt.venues_id=v.type_id",
    "INNER JOIN `types` AS `t` ON vt.type_id=t.id",
];

$where = ["v.visible=1"];

if (isset($_POST['region'])) {
    $where[] = "region_id = " . $mysqli->real_escape_string($_POST['region']);
}

if (!empty($_POST['type']) && is_array($_POST['type'])) {
    $where[] = "type_id IN (" .
        implode(
            ",",
            array_map(
                function ($itm) {
                    return (int)$itm;
                },
                $_POST['type']
            )
        ) . ")";
}
$sql[] = "WHERE " . implode(" AND ", $where);
$sql[] = "ORDER BY v.title ASC";

$sqlAsTxt = implode(" ", $sql);
echo $sqlAsTxt;
?>