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

URL别名如果要不加内容编辑文章不成功,如何处理

我们注意到 article_edit.php 中处理 slug 的逻辑与 article_add.php 不一致:当 slug 为空时,article_edit.php 只调用了 createSlug($title),而没有检查唯一性。此外,如果用户编辑时将 slug 留空,应该重新生成(并且避免与当前文章之外的 slug 冲突)。因此,需要将 article_edit.php 中生成 slug 的代码修改为与添加文章一致(包括唯一性检查,但要排除当前文章自身)。

修改 article_edit.php 中对应的处理代码(位于 if (empty($slug)) { ... } 部分),将其替换为:

php
if (empty($slug)) {
    // 如果标题也空,则使用临时标题
    $tempTitle = $title ?: '未命名文章';
    $slug = preg_replace('/[^a-zA-Z0-9\s]/', '', $tempTitle);
    $slug = strtolower(trim(preg_replace('/\s+/', '-', $slug)));
    if (empty($slug)) $slug = 'post';
    // 唯一性检查,排除当前文章自身
    $original = $slug;
    $count = 1;
    while (true) {
        $exists = $db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id]);
        if (!$exists) break;
        $slug = $original . '-' . $count++;
    }
}

注意:需要确保 $id 已经在前面定义(当前文章 ID)。如果 $slug 不为空,还要额外检查是否与其他文章重复(除了自身),如果重复可以追加数字。但为了简化,可保持现有逻辑(因为编辑时用户可能手动输入,重复时会导致数据库错误,所以最好也做唯一性检查)。因此更完整的编辑逻辑应如下:

php
if (empty($slug)) {
    // 自动生成
    $tempTitle = $title ?: '未命名文章';
    $slug = preg_replace('/[^a-zA-Z0-9\s]/', '', $tempTitle);
    $slug = strtolower(trim(preg_replace('/\s+/', '-', $slug)));
    if (empty($slug)) $slug = 'post';
    $original = $slug;
    $count = 1;
    while ($db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id])) {
        $slug = $original . '-' . $count++;
    }
} else {
    // 用户输入了 slug,也要检查唯一性(排除当前文章)
    $originalSlug = $slug;
    $count = 1;
    while ($db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id])) {
        $slug = $originalSlug . '-' . $count++;
    }
}

但用户输入时可能希望使用自定义 slug,如果重复自动添加后缀可能改变用户意图。更好的做法是:如果重复则给出错误提示,让用户手动修改。不过从用户体验角度,简单自动添加后缀也可以接受。根据您之前添加文章的做法(唯一性检查并添加数字后缀),建议在编辑时也采用相同策略。

因此,将 article_edit.php 中处理 slug 的整个代码段替换为:

php
if (empty($slug)) {
    // 自动生成
    $tempTitle = $title ?: '未命名文章';
    $slug = preg_replace('/[^a-zA-Z0-9\s]/', '', $tempTitle);
    $slug = strtolower(trim(preg_replace('/\s+/', '-', $slug)));
    if (empty($slug)) $slug = 'post';
    $original = $slug;
    $count = 1;
    while ($db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id])) {
        $slug = $original . '-' . $count++;
    }
} else {
    // 用户手动输入,也需检查唯一性(排除当前文章)
    $originalSlug = $slug;
    $count = 1;
    while ($db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id])) {
        $slug = $originalSlug . '-' . $count++;
    }
}

注意:createSlug 函数已存在,但它的实现与您手动写的正则可能略有不同,为了统一,建议都使用相同的生成逻辑,直接使用 createSlug($title) 而不是重复写正则。不过您当前已经在 article_add.php 中使用了正则,为了保持一致,可以继续使用正则方法。另外,createSlug 函数可能没有唯一性检查,因此最好统一使用上述代码。

请根据您的喜好选择一致的方法。我推荐使用 createSlug($title) 生成基础 slug,再附加唯一性检查,这样代码更简洁。下面是修改后的示例:

php
if (empty($slug)) {
    $slug = createSlug($title);
    if (empty($slug)) $slug = 'post';
    $original = $slug;
    $count = 1;
    while ($db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id])) {
        $slug = $original . '-' . $count++;
    }
} else {
    // 用户手动输入,也需检查唯一性(排除当前文章)
    $originalSlug = $slug;
    $count = 1;
    while ($db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id])) {
        $slug = $originalSlug . '-' . $count++;
    }
}

注意:createSlug 函数已在 functions.php 中定义,可直接使用。同时确保 $id 已经定义。

最终,将 article_edit.php 中的 if (empty($slug)) { ... } 部分替换为上述代码即可。

完成修改后,测试编辑文章时留空 slug 或输入重复 slug 的情况。

您的观察非常准确:article_edit.php 中的 slug 处理逻辑确实不如 article_add.php 严谨,当用户留空时仅调用了 createSlug 而未做唯一性检查,且编辑时未排除自身记录可能导致冲突。为了保持一致性和健壮性,建议将 article_edit.php 中的 slug 处理部分修改为与添加文章相同的逻辑(包括唯一性检查,并排除当前文章自身)。

以下是修改后的 article_edit.php 中处理 slug 的代码段(请替换原来的 if (empty($slug)) { ... } 部分):

php
if (empty($slug)) {
    // 自动生成:使用标题或默认值
    $tempTitle = $title ?: '未命名文章';
    $slug = preg_replace('/[^a-zA-Z0-9\s]/', '', $tempTitle);
    $slug = strtolower(trim(preg_replace('/\s+/', '-', $slug)));
    if (empty($slug)) $slug = 'post';
    // 唯一性检查,排除当前文章
    $original = $slug;
    $count = 1;
    while ($db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id])) {
        $slug = $original . '-' . $count++;
    }
} else {
    // 用户手动输入,也要检查唯一性(排除自身),避免重复
    $originalSlug = $slug;
    $count = 1;
    while ($db->fetch("SELECT id FROM article WHERE slug = ? AND id != ?", [$slug, $id])) {
        $slug = $originalSlug . '-' . $count++;
    }
}

注意:

  • 需要确保 $id 已经在前面定义(您的代码中已有 $id 从 GET 参数获取)。

  • 如果希望使用已有的 createSlug 函数,可将自动生成部分改为 $slug = createSlug($title);,但该函数内部未做唯一性检查,仍需后续循环处理。

  • 用户手动输入的 slug 如果重复,会自动追加数字后缀,这可能导致用户预期之外的修改。如果您希望提示错误而不是自动修改,可以改为给出错误信息并让用户重新输入。但考虑到易用性,当前自动后缀方案与添加文章行为一致,可以接受。

修改完成后,测试编辑文章时:

  • 留空 slug → 自动生成并确保唯一。

  • 输入已存在的 slug(其他文章) → 自动加数字后缀,避免冲突。

  • 输入当前文章已有的 slug → 不会改变(因为查询条件 id != ? 会排除自身)。

发表评论 (0)

留下你的足迹

验证码 点击图片刷新