我建立类似的活动页面last.fm/events如何使用PHP/MySQL中的查询字符串过滤结果集?
用户可以过滤按日期,类别等事件,这些参数在查询字符串
我的问题是过去了,什么是构建最好的方式你代码(查询,环路),以允许这些不同的查询类型,并有可能(按日期和类如过滤)
我在寻找如何使这种类型的网页的实际例子/引用它们组合(一个可以使用查询字符串过滤的结果集)。
我建立类似的活动页面last.fm/events如何使用PHP/MySQL中的查询字符串过滤结果集?
用户可以过滤按日期,类别等事件,这些参数在查询字符串
我的问题是过去了,什么是构建最好的方式你代码(查询,环路),以允许这些不同的查询类型,并有可能(按日期和类如过滤)
我在寻找如何使这种类型的网页的实际例子/引用它们组合(一个可以使用查询字符串过滤的结果集)。
用于构建自定义数据库查询的常见模式:
$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
。
首先,如果您使用查询字符串中的数据来运行查询,您将希望使用预准备语句/存储过程来实现安全性。另外,因为MySQL 5.1.17查询缓存与预处理语句一起工作。
准备好的语句可以像PHP中的普通查询一样建立起来,将查询所需的各个部分连接在一起。
为了避免不得不把“AND的插图中,你可以每个语句分配到的事物的阵列使用,然后爆他们的烦恼:
if(use_date) $sql_where[] = "date = ?";
if(use_category) $sql_where[] = "category = ?";
$sql = $sql . implode(" AND ", $sql_where);
重复的程序(或相同做时间)来插入查询所需的数据字段。