我们注意到 article_add.php 代码中,对 slug 的处理是:如果为空,则自动根据标题生成 slug。这段逻辑是正确的,理论上不会因为 slug 为空而导致添加失败。用户反馈“如果不加内容,添加不上文章”,可能是指在前端表单中,URL别名输入框被标记为 required 属性,导致空值提交时被浏览器拦截。
检查您的 article_add.php 中 HTML 表单部分,是否存在类似 <input type="text" name="slug" required> 这样的属性?如果有,请去掉 required,因为您已经允许自动生成。
如果前端没有 required,但仍无法添加,可能是数据库 slug 字段有 NOT NULL 约束且没有默认值,但您的代码中总是会生成一个值(即使标题为空,slug 也会被设为空字符串),应该不会出错。但为了安全,可以增加对空标题的处理:如果标题为空,slug 可以设为 'untitled' 或类似值。
建议您做以下调整:
在
article_add.php中,确保当$slug为空时,自动生成的值不为空。如果标题也空,可以设置默认 slug。检查数据库
article表slug字段结构,建议允许NULL或设置默认值'',且添加唯一索引时考虑空值问题(MySQL 允许多个空值,但空字符串视为重复)。所以最好确保每次生成的 slug 唯一。
您可以在自动生成后加上唯一性检查:
if (empty($slug)) { $slug = createSlug($title); // 避免重复 $original = $slug; $i = 1; while ($db->fetch("SELECT id FROM article WHERE slug = ?", [$slug])) { $slug = $original . '-' . $i++; } }
其中 createSlug 函数您可能未定义?您当前代码使用的是 preg_replace 方法,可以抽取成函数。
请确认以上修改是否能解决您的问题。如果还是无法添加,请提供具体的错误提示(页面提示什么?数据库报错?),以便进一步排查。
您在 article_add.php 中的代码逻辑是正确的:当 slug 为空时,会根据标题自动生成一个别名。按理说不会出现“不加内容添加不上”的问题。出现该问题的可能原因有:
HTML 表单中
slug输入框带有required属性,导致浏览器拦截空值提交。生成的
slug值可能违反数据库唯一约束(例如标题为空或生成重复的 slug)。前端 JavaScript 阻止了提交(例如自定义验证)。
由于您未提供 HTML 表单部分,我假设是第一种情况。请检查 article_add.php 中对应的 <input> 标签,去掉 required 属性:
<input type="text" name="slug" placeholder="留空自动生成">如果 slug 字段在数据库中是 NOT NULL 且没有默认值,空字符串也是允许的(除非您将空字符串视为重复值)。但为了更健壮,建议在自动生成时添加唯一性检查(避免重复),并且为标题为空的极端情况设置默认值:
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 = ?", [$slug])) { $slug = $original . '-' . $count++; } }
另外,您提到的“添加不上文章”有没有具体的报错信息(如浏览器的弹窗、页面上的错误提示)?如果有,请提供,以便精确定位。如果没有错误提示,只是页面无反应,很可能是前端 required 导致的浏览器校验拦截。
发表评论 (0)
留下你的足迹