php实现分类搜索
PHP实现分类搜索的方法
分类搜索通常涉及数据库查询和前端筛选功能。以下是实现分类搜索的几种常见方法:
数据库表设计
创建分类表和关联表是基础。分类表存储分类信息,关联表建立分类与内容的关联关系。
分类表示例结构:
CREATE TABLE categories (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
parent_id INT DEFAULT NULL
);
内容表示例结构:
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
description TEXT,
price DECIMAL(10,2)
);
关联表示例结构:

CREATE TABLE product_categories (
product_id INT,
category_id INT,
PRIMARY KEY (product_id, category_id)
);
基础分类查询
通过SQL查询获取分类下的内容:
$categoryId = $_GET['category_id'] ?? null;
if ($categoryId) {
$stmt = $pdo->prepare("
SELECT p.*
FROM products p
JOIN product_categories pc ON p.id = pc.product_id
WHERE pc.category_id = ?
");
$stmt->execute([$categoryId]);
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
多级分类查询
处理父子分类关系时,可以使用递归查询:
function getCategoryTree($parentId = null) {
global $pdo;
$stmt = $pdo->prepare("SELECT * FROM categories WHERE parent_id = ?");
$stmt->execute([$parentId]);
$categories = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($categories as &$category) {
$category['children'] = getCategoryTree($category['id']);
}
return $categories;
}
多条件筛选
结合多个分类条件进行筛选:

$selectedCategories = $_GET['categories'] ?? [];
if (!empty($selectedCategories)) {
$placeholders = implode(',', array_fill(0, count($selectedCategories), '?'));
$sql = "SELECT DISTINCT p.*
FROM products p
JOIN product_categories pc ON p.id = pc.product_id
WHERE pc.category_id IN ($placeholders)";
$stmt = $pdo->prepare($sql);
$stmt->execute($selectedCategories);
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
前端实现
HTML部分实现分类选择表单:
<form method="GET" action="search.php">
<fieldset>
<legend>分类筛选</legend>
<?php foreach ($categories as $category): ?>
<label>
<input type="checkbox" name="categories[]" value="<?= $category['id'] ?>">
<?= htmlspecialchars($category['name']) ?>
</label>
<?php endforeach; ?>
</fieldset>
<button type="submit">筛选</button>
</form>
性能优化
对于大型分类系统,可以考虑以下优化措施:
- 使用缓存机制存储分类树
- 为关联字段添加索引
- 考虑使用预计算的路径枚举方法存储分类层级关系
使用框架实现
在Laravel等框架中,可以利用Eloquent关系简化实现:
// 模型关系定义
class Product extends Model {
public function categories() {
return $this->belongsToMany(Category::class);
}
}
class Category extends Model {
public function products() {
return $this->belongsToMany(Product::class);
}
}
// 控制器查询
$products = Product::whereHas('categories', function($query) {
$query->whereIn('id', request('categories', []));
})->get();
以上方法可根据具体项目需求进行组合和调整,实现灵活的分类搜索功能。






