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

过滤器的最大数量将如下所示:search.php? cat = Computers&credits1 = 1&credits2 = 2&rev = 5&stars = 5。我还将基于GET变量集从多个SQL表中提取数据。

如何计算某些时间未设置的变量以运行查询?我认为我可以通过针对每种情况的一堆if else语句来做到这一点,但这似乎是“肮脏的代码”。

最佳答案

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

它可能看起来像这样(示例使用mysqli,但是对于使用预备语句的任何种类的数据库库来说,这应该相似):

$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
    }
}

关于php - 如何在多个MySQL表上执行大型查询?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13995578/

10-16 15:13
查看更多