【问题标题】:How to filter a result set using the query string in PHP / MySQL?如何使用 PHP / MySQL 中的查询字符串过滤结果集?
【发布时间】:2009-06-08 11:48:14
【问题描述】:

我正在构建一个类似于last.fm/events的活动页面

用户可以通过查询字符串中传递的参数按日期、类别等过滤事件

我的问题是,构建代码(查询、循环)以允许这些不同的查询类型并可能将它们组合起来的最佳方式是什么(例如,按日期过滤类别)

我正在寻找有关如何制作此类页面(可以使用查询字符串过滤的结果集)的实际示例/参考。

【问题讨论】:

    标签: php mysql filter query-string


    【解决方案1】:

    构建自定义数据库查询的常见模式:

    $sql  = 'SELECT * FROM foo ';
    $sql .= 'WHERE 1 ';
    
    if (array_key_exists('category', $_GET)) {
        $sql .= sprintf('AND category_id = %d ', intval($_GET["category"]));
    }
    
    if (array_key_exists('date', $_GET)) {
        $sql .= sprintf('AND date = "%s" ', mysql_real_escape_string($_GET["date"]));
    }
    
    // and so on...
    

    或者,使用 PDO:

    $params = array();
    
    $sql  = 'SELECT * FROM foo ';
    $sql .= 'WHERE 1 ';
    
    if (array_key_exists('category', $_GET)) {
        $sql .= 'AND category_id = ? ';
        $params[] = $_GET["category"];
    }
    
    if (array_key_exists('date', $_GET)) {
        $sql .= 'AND date = ? ';
        $params[] = $_GET["date"];
    }
    
    // and so on...
    
    $stmt = $db->prepare($sql);
    $stmt->execute($params);
    

    如果您需要对数据库结果进行额外过滤,只需使用循环将数据复制到目标数组和continue,只要遇到应该从结果中省略的行。

    【讨论】:

      【解决方案2】:

      首先,如果您使用查询字符串中的数据来运行查询,您需要使用准备好的语句/存储过程来确保安全。另外,因为 MySQL 5.1.17 查询缓存适用于准备好的语句。

      可以像 PHP 中的普通查询一样构建准备好的语句,将特定查询所需的查询的各个部分连接在一起。

      为了避免不得不在中间放置“AND”的烦恼,您可以将每个语句分配给要使用的事物数组,然后将它们内爆:

      if(use_date) $sql_where[] = "date = ?";
      if(use_category) $sql_where[] = "category = ?";
      $sql = $sql . implode(" AND ", $sql_where);
      

      重复该过程(或同时执行)以插入查询所需的数据字段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-13
        • 2011-10-05
        • 2017-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多