Php 如何在多个MySQL表上执行大型查询?

Php 如何在多个MySQL表上执行大型查询?,php,mysql,Php,Mysql,我正在创建一个搜索过滤器功能,并将通过URL发送过滤器信息。我面临的问题是,由于它是一个过滤器,一些信息有时会出现,而有些则不会。这就产生了未定义变量的问题 过滤器的最大数量如下:search.php?cat=计算机&信用1=1&信用2=2&版本=5&星级=5。我还将根据GET变量集从多个SQL表中提取数据 为了运行查询,如何解释某些变量在特定时间未设置?我想我可以通过一堆if-else语句来解释每种情况,但这似乎是“脏代码”。您应该根据传递的过滤器值动态构建SQL语句。这可能意味着条件,但这确

我正在创建一个搜索过滤器功能,并将通过URL发送过滤器信息。我面临的问题是,由于它是一个过滤器,一些信息有时会出现,而有些则不会。这就产生了未定义变量的问题

过滤器的最大数量如下:search.php?cat=计算机&信用1=1&信用2=2&版本=5&星级=5。我还将根据GET变量集从多个SQL表中提取数据


为了运行查询,如何解释某些变量在特定时间未设置?我想我可以通过一堆if-else语句来解释每种情况,但这似乎是“脏代码”。

您应该根据传递的过滤器值动态构建SQL语句。这可能意味着条件,但这确实是优化数据库查询的最佳方法

它可能看起来像这样(示例使用mysqli,但对于使用预处理语句的任何类型的DB库,这应该是类似的):


您应该根据传递的筛选器值动态构建SQL语句。这可能意味着条件,但这确实是优化数据库查询的最佳方法

它可能看起来像这样(示例使用mysqli,但对于使用预处理语句的任何类型的DB库,这应该是类似的):


作为一种快速/简单的方法,您可以创建一个默认值数组,
array\u merge()
使用
$\u GET
作为一种快速/简单的方法,您可以创建一个默认值数组,
array\u merge()
使用
$\u GET
如何动态构建查询?我想不出一种方法可以创建未定义的变量。@Arun请参阅我的答案中添加的示例。谢谢Mike,非常感谢您在这个示例中花费的时间。您将如何动态构建查询?我想不出一种方法可以创建未定义的变量。@Arun请参阅我的答案中添加的示例。谢谢Mike,非常感谢您花时间在这个示例中。
$query = 'SELECT * FROM table'; // or specifically specify the fields you need in result set.
if (empty($_GET['cat']) && empty($_GET['credits1']) && empty($_GET['credits2']) && empty($_GET['rev']) && empty($_GET['stars'])) {
    // there are no search filters set so maybe you alert some sort of error
} else {
    $query .= ' WHERE ';
    $parameters = array();
    $at_least_one_where_set = false;
    if (!empty($_GET['cat'])) {
        if($at_least_one_where_set === true) {
            $query .= ' AND cat=?';
        } else {
            $query .= 'cat=?';
        }
        $at_least_one_where_set = true;
        $parameters[]['value'] = $_GET['cat'];
        $parameters[]['type'] = 's';
    }

    // do similar conditionals for each $_GET value you are interested in.

    // query the database    
    $mysqli = new mysqli('host', 'user', 'password', 'database');
    $stmt = $mysqli->stmt_init();
    $stmt->prepare($query);
    foreach ($parameters as $parameter) {
        $stmt->bind_param($parameter['type'], $parameter['value']);
    }
    $stmt->execute();

    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
        // do something with your result row
    }
}