Laravel平台新增1-2词答案题型后题目记录无法存入数据库求助
Laravel题库功能提交异常排查
核心问题定位
1. 视图层表单字段重复提交冲突
当前所有题型对应的表单块都预渲染在同一个<form>标签内,哪怕通过jQuery把非选中题型的块设置为display:none,被隐藏的DOM输入元素依然会被浏览器收集并随表单一起提交。
- 每个题型块内都重复定义了同名字段:
question、a、b、c、d、answer,多块并存时,同名字段会出现值覆盖,最终提交到后端的参数可能被最后一个隐藏块的空值覆盖,直接触发控制器的必填校验失败,根本无法进入数据库写入流程。 - 早期仅配置2类题型时,字段覆盖逻辑未触发必填校验失败的阈值;新增第3、第4个题型块后,多值叠加的覆盖结果直接导致所有题型的提交都校验不通过。
2. 数据库写入逻辑未做空值兼容
模型中AddClass方法直接读取请求参数,未做存在性判断:
// 原写入逻辑片段 'a' => $data->a, 'b' => $data->b, 'question_img' => $data->question_img, 'question_video_link' => $data->question_video_link,
- 选中1-2词答案的题型时,表单中根本不存在
a/b/c/d、question_img等字段,直接读取会触发Undefined array key运行时错误,即使侥幸通过校验层,写入流程也会直接中断。
3. 校验规则存在细节缺陷
控制器的校验规则中,question_img未设置nullable标识:
// 原校验规则 'question_img' => 'image',
- 表单本身未设计题目图片上传的输入项,一旦请求中该字段传了空值、格式不匹配的值,就会触发校验失败。同时校验失败仅返回通用提示,未携带具体的错误信息,导致用户无法感知校验不通过的具体原因,直观感受就是“提交没反应、数据写不进去”。
针对性修复方案
1. 优化视图层提交逻辑,避免重复字段干扰
在题型切换的jQuery逻辑中,增加对非激活题型块的输入元素禁用操作——被disabled标记的表单元素不会被浏览器收集提交:
$(document).ready(function(){ // 初始化:隐藏所有题型块 $(".div_content").hide(); // 初始化当前选中题型块的输入启用状态 let initSelectVal = $("#select").val(); if(initSelectVal) { $('#' + initSelectVal).show().find('input, textarea').prop('disabled', false); } // 监听题型切换事件 $("#select").change(function(){ // 先禁用所有块的输入框 $('.div_content').find('input, textarea').prop('disabled', true); $('.div_content').hide(); // 启用当前选中块的输入框 let currentVal = $(this).val(); $('#' + currentVal).show().find('input, textarea').prop('disabled', false); }); });
2. 模型层写入逻辑增加空值兜底
读取请求参数时,使用input()方法对不存在的参数设置默认空值,避免触发运行时错误:
public static function AddClass($data) { $row = DB::table('questions')->insert([ 'quiz_id' => $data->input('quiz_id'), 'question_type_id' => $data->input('question_type_id'), 'question' => $data->input('question'), 'a' => $data->input('a', null), 'b' => $data->input('b', null), 'c' => $data->input('c', null), 'd' => $data->input('d', null), 'answer'=> $data->input('answer'), 'status' => 1, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), 'question_img'=> $data->input('question_img', null), 'question_video_link' => $data->input('question_video_link', null), ]); return $row; }
3. 调整控制器校验规则
给question_img校验项增加nullable标识,无文件上传时不触发校验;同时将具体的校验错误信息通过会话带回视图,方便排查问题:
$rules = [ 'quiz_id' => 'required', 'question_type_id' => 'required', 'question' => 'required|string|max:255', 'answer' => 'required', 'question_img' => 'nullable|image', ]; $validator = Validator::make($request->all(),$rules); if($validator->fails()){ return back()->withErrors($validator)->with('warning','请完善必填字段后再提交'); }
内容的提问来源于stack exchange,提问作者Jilani Shaik
相关产品推荐
相关产品推荐

