记录技术成长,奔向未来!

分类管理模块中,slug字段出现重复或留空导致添加失败,如何处理

我们注意到分类管理模块中,slug字段也可能出现重复或留空导致添加失败的问题。目前代码中 createSlug($name) 仅生成简单的slug,未做唯一性检查,编辑时也未排除自身。需要类似文章管理的唯一性处理。

修改方案:

  • 新增/编辑时,如果slug为空,自动生成;

  • 生成后检查唯一性(排除当前自身),如果重复则追加数字后缀。

具体修改位置:在 if (empty($slug)) { $slug = createSlug($name); } 后添加唯一性检查循环。同时编辑时需传入当前ID(若有)用于排除。

下面是修改后的代码片段(替换原来的slug处理部分):

php
if (empty($slug)) {
    $slug = createSlug($name);
}
// 唯一性检查(添加时排除自身ID,编辑时排除当前ID)
$id_for_check = isset($_POST['id']) ? intval($_POST['id']) : 0;
$original_slug = $slug;
$counter = 1;
while ($db->fetch("SELECT id FROM category WHERE slug = ? AND id != ?", [$slug, $id_for_check])) {
    $slug = $original_slug . '-' . $counter++;
}

同时注意,在新增时 $id_for_check 为0,不影响查重;编辑时会排除自身。

请将此代码段放在 if (isset($_POST['id']) && !empty($_POST['id'])) 之前(即统一处理slug后,再执行插入或更新)。

另外,由于您已经在表单中设置了 placeholder="留空自动生成",前端未要求必填,后端自动处理即可。测试后应该可以正常添加/编辑分类,slug留空也能自动生成唯一值。

针对分类管理中 slug 字段留空导致无法添加或重复的问题,您需要对 category.php 进行类似文章管理的优化:自动生成唯一 slug,并在编辑时排除自身。以下是修改后的完整 PHP 代码部分(请将原有 category.php 中从 // 处理添加/编辑 到 // 获取所有分类 之间的代码替换为下面的内容)。

php
// 处理添加/编辑
$edit = null;
if (isset($_GET['edit']) && is_numeric($_GET['edit'])) {
    $edit = $db->fetch("SELECT * FROM category WHERE id = ?", [intval($_GET['edit'])]);
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = trim($_POST['name']);
    $slug = trim($_POST['slug']);
    $description = trim($_POST['description']);
    $sort_order = intval($_POST['sort_order']);
    
    if (empty($name)) {
        $error = "分类名称不能为空";
    } else {
        // 如果 slug 为空,自动生成
        if (empty($slug)) {
            $slug = createSlug($name);
            // 如果自动生成后仍为空(如全是特殊字符),则使用默认值
            if (empty($slug)) $slug = 'category';
        }
        
        // 唯一性检查(添加时排除自身ID 0,编辑时排除当前ID)
        $current_id = isset($_POST['id']) ? intval($_POST['id']) : 0;
        $original_slug = $slug;
        $counter = 1;
        while ($db->fetch("SELECT id FROM category WHERE slug = ? AND id != ?", [$slug, $current_id])) {
            $slug = $original_slug . '-' . $counter++;
        }
        
        if (isset($_POST['id']) && !empty($_POST['id'])) {
            // 编辑分类
            $db->query("UPDATE category SET name=?, slug=?, description=?, sort_order=? WHERE id=?", 
                [$name, $slug, $description, $sort_order, $current_id]);
            addAdminLog('编辑分类', "分类ID: {$current_id},名称:{$name}");
            header('Location: ?mod=category&msg=edit_success');
            exit;
        } else {
            // 新增分类
            $db->query("INSERT INTO category (name, slug, description, sort_order) VALUES (?, ?, ?, ?)",
                [$name, $slug, $description, $sort_order]);
            $newId = $db->lastInsertId();
            addAdminLog('添加分类', "分类ID: {$newId},名称:{$name}");
            header('Location: ?mod=category&msg=add_success');
            exit;
        }
    }
}

主要改进:

  1. 自动生成 slug:当用户留空时,调用 createSlug($name) 生成基础别名。

  2. 唯一性检查:通过循环追加数字后缀,确保 slug 唯一(新增时排除 ID 0,编辑时排除自身)。

  3. 兼容已有逻辑:保留 $edit 的获取和表单显示部分不变,仅修改了 POST 处理。

将此代码替换后,您测试分类管理:

  • 添加分类时 slug 留空 → 自动生成唯一别名。

  • 编辑分类时 slug 留空 → 重新生成唯一别名(可能改变原有别名,若希望保留原别名则需额外判断,但当前逻辑是合理的)。

  • 手动输入重复的 slug → 自动添加数字后缀避免冲突。

发表评论 (0)

留下你的足迹

验证码 点击图片刷新