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

mel*_*yal 1 php mysql filter query-string

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

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

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

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

Emi*_*l H 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...
Run Code Online (Sandbox Code Playgroud)

或者,使用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);
Run Code Online (Sandbox Code Playgroud)

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