1

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

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

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

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

4

2 回答 2

5

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

$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无论何时遇到应该从结果中省略的行。

于 2009-06-08T12:00:14.007 回答
0

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

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

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

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

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

于 2009-06-08T12:06:26.223 回答