如何使用PHP和MySQL实现试卷分类的动态创建与内容管理
实现方案
第一步:调整数据库表结构
现有单表结构会存在分类重复存储的冗余问题,建议拆分两张表实现分类的独立管理:
- 分类表
paper_categories,存储所有分类基础信息,核心加唯一约束避免重复分类
表结构参考:CREATE TABLE `paper_categories` ( `id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `cate_name` varchar(50) NOT NULL UNIQUE COMMENT '分类名称,唯一约束避免重复', `cate_slug` varchar(50) NOT NULL UNIQUE COMMENT '分类标识,用于前端类名/URL,如C++对应c_plus_plus', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - 原
Paperwithus试卷表新增分类关联字段,替换原直接存储分类名称的字段ALTER TABLE `Paperwithus` ADD COLUMN `cate_id` int UNSIGNED NOT NULL COMMENT '关联分类表ID', ADD FOREIGN KEY (`cate_id`) REFERENCES `paper_categories`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
第二步:实现试卷上传的后端逻辑
核心逻辑为优先判断分类是否存在,不存在则新增分类后再关联存储试卷,PHP代码参考(使用预处理语句避免SQL注入):
// 接收表单提交的参数 $cateName = trim($_POST['cate_name']); $paperName = $_POST['paper_name']; $paperFile = $_POST['paper_file']; // 试卷存储路径自行根据上传逻辑调整 // 初始化数据库连接,自行替换数据库配置 $pdo = new PDO('mysql:host=127.0.0.1;dbname=Our_Paper;charset=utf8mb4', 'db_user', 'db_pwd'); // 1. 查询分类是否存在 $checkStmt = $pdo->prepare("SELECT id FROM paper_categories WHERE cate_name = ?"); $checkStmt->execute([$cateName]); $existCate = $checkStmt->fetch(PDO::FETCH_ASSOC); $cateId = 0; if ($existCate) { // 分类已存在,直接取分类ID $cateId = $existCate['id']; } else { // 分类不存在,先插入新分类 $cateSlug = preg_replace('/[^a-zA-Z0-9]+/', '_', strtolower($cateName)); // 生成符合前端类名规则的标识 $insertCateStmt = $pdo->prepare("INSERT INTO paper_categories (cate_name, cate_slug) VALUES (?, ?)"); $insertCateStmt->execute([$cateName, $cateSlug]); $cateId = $pdo->lastInsertId(); } // 2. 插入试卷数据,关联对应分类ID $insertPaperStmt = $pdo->prepare("INSERT INTO Paperwithus (cate_id, paper_name, paper_file) VALUES (?, ?, ?)"); $insertPaperStmt->execute([$cateId, $paperName, $paperFile]);
第三步:前端动态渲染分类板块,无需硬编码
前端展示时先查询全部分类,循环生成对应分类板块,不需要写死每个分类的容器:
// 查询全部分类 $allCateStmt = $pdo->query("SELECT id, cate_name, cate_slug FROM paper_categories"); $allCates = $allCateStmt->fetchAll(PDO::FETCH_ASSOC); // 循环渲染每个分类板块 foreach ($allCates as $cate) { // 查询当前分类下的所有试卷 $paperStmt = $pdo->prepare("SELECT * FROM Paperwithus WHERE cate_id = ?"); $paperStmt->execute([$cate['id']]); $papers = $paperStmt->fetchAll(PDO::FETCH_ASSOC); ?> <!-- 动态生成分类容器,类名用分类标识,无需硬编码 --> <div class="<?php echo $cate['cate_slug']?>_section"> <h3><?php echo $cate['cate_name']?></h3> <ul> <?php foreach ($papers as $paper) {?> <li><?php echo $paper['paper_name']?></li> <?php }?> </ul> </div> <?php }
可选优化
如果担心管理员输入分类名称不规范导致同分类被识别为不同分类,可以在上传页面增加已存在分类的下拉提示,或者增加分类别名映射规则,减少输入误差。
内容的提问来源于stack exchange,提问作者user15959802
相关产品推荐
相关产品推荐

