You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 18:27:04