php 实现分类
PHP 实现分类功能
数据库设计
创建分类表结构,通常包含id、name、parent_id等字段。示例SQL:
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
parent_id INT DEFAULT NULL,
FOREIGN KEY (parent_id) REFERENCES categories(id) ON DELETE CASCADE
);
递归查询分类
使用递归方法获取多级分类:
function getCategories($parentId = null) {
$categories = [];
$query = "SELECT * FROM categories WHERE parent_id " . ($parentId ? "= $parentId" : "IS NULL");
$result = mysqli_query($connection, $query);
while ($row = mysqli_fetch_assoc($result)) {
$row['children'] = getCategories($row['id']);
$categories[] = $row;
}
return $categories;
}
分类展示
前端循环显示分类:

function displayCategories($categories, $level = 0) {
foreach ($categories as $category) {
echo str_repeat(' ', $level * 4) . $category['name'] . "<br>";
if (!empty($category['children'])) {
displayCategories($category['children'], $level + 1);
}
}
}
分类管理
添加分类的PHP处理代码:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = $_POST['name'];
$parentId = $_POST['parent_id'] ?: null;
$stmt = $pdo->prepare("INSERT INTO categories (name, parent_id) VALUES (?, ?)");
$stmt->execute([$name, $parentId]);
header("Location: categories.php");
exit;
}
无限级分类优化
对于大型分类系统,考虑使用闭包表或嵌套集模型提高查询效率。闭包表示例:

CREATE TABLE category_path (
ancestor INT NOT NULL,
descendant INT NOT NULL,
depth INT NOT NULL,
PRIMARY KEY (ancestor, descendant),
FOREIGN KEY (ancestor) REFERENCES categories(id),
FOREIGN KEY (descendant) REFERENCES categories(id)
);
分类缓存
使用缓存减少数据库查询:
function getCachedCategories() {
$cacheKey = 'all_categories';
if (!$categories = apcu_fetch($cacheKey)) {
$categories = getCategories();
apcu_store($cacheKey, $categories, 3600);
}
return $categories;
}
分类验证
添加分类时的数据验证:
function validateCategory($name, $parentId) {
$errors = [];
if (empty($name)) {
$errors[] = '分类名称不能为空';
}
if ($parentId) {
$stmt = $pdo->prepare("SELECT id FROM categories WHERE id = ?");
$stmt->execute([$parentId]);
if (!$stmt->fetch()) {
$errors[] = '父分类不存在';
}
}
return $errors;
}






