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

Laravel中Ajax提交数据时变量未定义问题求助

问题分析与修复方案

核心问题:控制器未从请求中获取表单字段

你遇到的undefined错误根源在于控制器中直接使用了未定义的变量(比如$fname、$lname等),没有从Request对象中读取Ajax提交的表单数据。此外还有几处细节错误会导致前端响应异常。

修复步骤:


1. 修正控制器变量获取逻辑

将控制器中直接赋值的变量,全部改为从$request对象中获取。可以逐个字段赋值,或者使用批量赋值(更简洁):

方式一:逐个字段赋值(修改后的控制器代码)
public function save(Request $request)
{
    // 完善验证规则,覆盖所有必填字段
    $validator = \Validator::make($request->all(), [
        'cnic' => 'required|unique:patients',
        'fname' => 'required',
        'contactno' => 'required',
        'gender' => 'required',
        // 其他必填字段按需添加
    ]);
    
    if ($validator->fails()) {
        return response()->json(['success' => false, 'errors' => $validator->errors()->all()]);
    }

    $temppatientId = IdGenerator::generate(['table' => 'patients', 'length' => 5, 'prefix' => '22']);
    $patientid = $temppatientId + 1;

    // 模型名遵循Laravel约定,首字母大写(假设模型文件为Patient.php)
    $query = new Patient;
    $query->patientid = $patientid;
    // 从$request中读取对应字段值
    $query->fname = $request->fname;
    $query->lname = $request->lname;
    $query->cnic = $request->cnic;
    $query->contactno = $request->contactno;
    $query->gender = $request->gender;
    $query->age = $request->age;
    $query->dob = $request->dob;
    $query->city = $request->city;
    $query->address = $request->address;
    $query->husbandname = $request->husbandname;
    $query->fathername = $request->fathername;
    $query->bloodgroup = $request->bloodgroup;
    $query->maritalstatus = $request->maritalstatus;
    
    $query->save();
   
    // 保持返回键名和前端回调一致
    return response()->json(['success' => true, 'patient' => $query]);
}
方式二:批量赋值(更简洁,需在模型中设置$fillable)

在Patient模型中添加可填充字段:

class Patient extends Model
{
    protected $fillable = [
        'patientid', 'fname', 'lname', 'cnic', 'contactno', 
        'gender', 'age', 'dob', 'city', 'address', 
        'husbandname', 'fathername', 'bloodgroup', 'maritalstatus'
    ];
}

然后控制器可以简化为:

public function save(Request $request)
{
    $validator = \Validator::make($request->all(), [
        'cnic' => 'required|unique:patients',
        'fname' => 'required',
        'contactno' => 'required',
        'gender' => 'required',
    ]);
    
    if ($validator->fails()) {
        return response()->json(['success' => false, 'errors' => $validator->errors()->all()]);
    }

    $temppatientId = IdGenerator::generate(['table' => 'patients', 'length' => 5, 'prefix' => '22']);
    
    // 合并patientid到请求数据中,批量创建
    $patient = Patient::create(array_merge(
        $request->all(),
        ['patientid' => $temppatientId + 1]
    ));
   
    return response()->json(['success' => true, 'patient' => $patient]);
}

2. 修正Ajax回调的键名错误

控制器返回的键名需要和前端回调保持一致,否则会出现undefined:

success: function(data) {
    if (data.success === false) {
       alert(data.errors.join('\n'));
    } else {
       $("#patientid").val(data.patient.patientid);
    }
}

3. 阻止a标签的默认跳转行为

点击#save1这个a标签时,会触发默认页面跳转,导致Ajax请求中断。添加e.preventDefault()阻止默认行为:

$("#save1").on('click', function(e) {
    // 阻止a标签默认跳转
    e.preventDefault();

    // 后续验证和Ajax代码...
});

4. 优化前端验证逻辑

利用你已经引入的Parsley.js做统一验证,替代分散的判断:

$("#save1").on('click', function(e) {
    e.preventDefault();
    
    // 使用Parsley验证表单
    if ($('#registrationform').parsley().isValid()) {
        $.ajax({
            url: "/save",
            type: "post",
            data: $('#registrationform').serialize(),
            dataType: 'json',
            success: function(data) {
                if (data.success === false) {
                   alert(data.errors.join('\n'));
                } else {
                   $("#patientid").val(data.patient.patientid);
                }
            },
            error: function(xhr) {
                alert('提交失败,请重试');
            }
        });
    }
});

内容的提问来源于stack exchange,提问作者user19704437

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:35:24