代码之家  ›  专栏  ›  技术社区  ›  meleyal

如何在PHP/MySQL中使用查询字符串过滤结果集?

  •  1
  • meleyal  · 技术社区  · 16 年前

    last.fm/events

    我的问题是,如何最好地组织代码(查询、循环)以允许这些不同的查询类型,并可能将它们组合在一起(例如按日期过滤 类别)

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

    2 回复  |  直到 16 年前
        1
  •  5
  •   Emil H    16 年前

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

    $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
  •  0
  •   Emil H    14 年前

    首先,如果你使用查询字符串中的数据来运行查询,为了安全起见,你需要使用预处理语句/存储过程。另外,自MySQL 5.1.17以来,查询缓存适用于预处理语句。

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

    为了避免将“AND”置于两者之间的麻烦,你可以将每个语句分配给一组要使用的东西,然后内爆它们:

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

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