You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP Laravel 验证失败未触发错误提示反而报SQL错误是什么原因?

问题根因

你的代码执行顺序完全错误,数据库写入操作被放到了验证逻辑之前:当前执行流程是先执行数据库插入,再判断验证是否失败,所有字段为空时,在走到验证判断逻辑前就已经触发了数据库的非空约束报错,自然不会进入你写的验证失败提示分支。

你当前的执行流程:

  1. 读取请求参数
  2. 定义验证规则、生成验证器实例
  3. 直接将参数赋值给模型并执行save()写入数据库
  4. 最后才判断验证是否失败

修复方案

调整代码顺序,将验证判断逻辑放到数据库操作之前,只有验证通过时才执行数据写入:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:24:01