PHP Laravel 验证失败未触发错误提示反而报SQL错误是什么原因?
问题根因
你的代码执行顺序完全错误,数据库写入操作被放到了验证逻辑之前:当前执行流程是先执行数据库插入,再判断验证是否失败,所有字段为空时,在走到验证判断逻辑前就已经触发了数据库的非空约束报错,自然不会进入你写的验证失败提示分支。
你当前的执行流程:
- 读取请求参数
- 定义验证规则、生成验证器实例
- 直接将参数赋值给模型并执行
save()写入数据库 - 最后才判断验证是否失败
修复方案
调整代码顺序,将验证判断逻辑放到数据库操作之前,只有验证通过时才执行数据写入:
class InputController extends Controller { public static function save(Request $request) { //Rules for each field $rules = [ 'First_Name' => ['required', 'string'], 'Last_Name' => ['required', 'string'], 'Email' => ['required', 'string', 'email'], 'Credit_Card' => ['required', 'string'], 'Password' => ['required', 'string', 'min:8'] ]; //Validator variable $valid = Validator::make($request->all(),$rules); // 先做验证判断,失败直接返回错误 if ($valid->failed()) { dd("Error! Some of the required information are empty"); } // 验证通过后再读取参数、写入数据库 //Get input values to variables respectively $First_Name = $request->input('First_Name'); $Last_Name = $request->input('Last_Name'); $Email = $request->input('Email'); $Credit_Card = $request->input('Credit_Card'); $Password = $request->input('Password'); //Insert information into SQL table $customer = new CustomersTable; $customer->First_Name = $First_Name; $customer->Last_Name = $Last_Name; $customer->Email = $Email; // 注意:信用卡明文存储存在严重安全风险,建议做加密处理 $customer->Credit_Card = $Credit_Card; $customer->Password = Hash::make($Password); $customer->save(); return view('submit'); } }
额外优化建议
- 可以给不同字段加对应格式校验规则,比如邮箱加
email规则、密码加min规则限制最小长度,避免无效数据入库 - 生产环境不要用
dd()输出错误提示,可以用back()->withErrors($valid)返回上一页面并自动渲染验证错误信息,用户体验更好
内容的提问来源于stack exchange,提问作者Hacker Rhino
相关产品推荐
相关产品推荐

