php筛选实现
筛选功能的基本实现
在PHP中实现筛选功能通常涉及接收用户输入、构建查询条件以及执行数据库查询。使用$_GET或$_POST接收用户提交的筛选参数。
$category = isset($_GET['category']) ? $_GET['category'] : '';
$price_min = isset($_GET['price_min']) ? floatval($_GET['price_min']) : 0;
动态构建SQL查询
根据筛选参数动态构建SQL查询语句,注意使用预处理语句防止SQL注入。使用WHERE子句组合多个条件。
$sql = "SELECT * FROM products WHERE 1=1";
$params = array();
if (!empty($category)) {
$sql .= " AND category = ?";
$params[] = $category;
}
if ($price_min > 0) {
$sql .= " AND price >= ?";
$params[] = $price_min;
}
使用预处理语句执行查询
通过PDO或MySQLi执行预处理查询,确保安全性。绑定参数时注意数据类型匹配。
$stmt = $pdo->prepare($sql);
foreach ($params as $key => $value) {
$stmt->bindValue($key + 1, $value);
}
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
多条件组合筛选
实现多条件组合筛选时需要处理各参数间的逻辑关系。使用AND或OR连接不同条件,根据业务需求调整。
if (!empty($_GET['keywords'])) {
$keywords = explode(' ', $_GET['keywords']);
$sql .= " AND (";
foreach ($keywords as $i => $word) {
if ($i > 0) $sql .= " OR ";
$sql .= "name LIKE ?";
$params[] = "%$word%";
}
$sql .= ")";
}
分页与筛选结合
当数据量较大时,筛选功能通常需要与分页结合。计算总记录数和分页参数,修改SQL添加LIMIT子句。
$page = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1;
$per_page = 10;
$offset = ($page - 1) * $per_page;
$count_sql = "SELECT COUNT(*) FROM ($sql) AS total";
$stmt = $pdo->prepare($count_sql);
// 绑定参数...
$total = $stmt->fetchColumn();
$sql .= " LIMIT $offset, $per_page";
前端与后端交互
前端表单应包含所有筛选字段,使用method="get"便于用户分享筛选结果。为每个筛选字段设置合适的name属性。
<form method="get" action="products.php">
<input type="text" name="keywords" placeholder="搜索商品">
<select name="category">
<option value="">所有分类</option>
<!-- 动态生成分类选项 -->
</select>
<input type="number" name="price_min" placeholder="最低价格">
<button type="submit">筛选</button>
</form>
性能优化建议
对频繁使用的筛选条件建立数据库索引,避免全表扫描。对于复杂查询可以考虑使用缓存机制。
ALTER TABLE products ADD INDEX idx_category (category);
ALTER TABLE products ADD INDEX idx_price (price);
日期范围筛选实现
处理日期范围筛选时需要确保格式一致,使用数据库支持的日期函数进行比较。

if (!empty($_GET['start_date'])) {
$sql .= " AND created_at >= ?";
$params[] = date('Y-m-d 00:00:00', strtotime($_GET['start_date']));
}
if (!empty($_GET['end_date'])) {
$sql .= " AND created_at <= ?";
$params[] = date('Y-m-d 23:59:59', strtotime($_GET['end_date']));
}






