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

Laravel表单实时更新遇419错误,求排查解决方法

解决Laravel表单实时更新419错误问题

问题描述

在Laravel中实现表单实时更新功能,用户修改下拉选项或文本框内容时自动保存至数据库,迁移主机后出现419错误,数据无法存入数据库,相关代码如下:

HTML代码

<table class="table-bordered table-striped table">
    <tr>
        <th>@lang('quickadmin.inspections.fields.inspection-date')</th>
        <td field-key='inspection_date'>
            {!! Form::text('inspection_date', old('inspection_date'), [
                'class' => 'form-control date',
                'placeholder' => '',
                'id' => 'inspection_date',
            ]) !!}
        </td>

    <tr>
        <th>@lang('quickadmin.inspections.fields.execution-date')</th>
        <td field-key='execution_date'>
            {!! Form::text('execution_date', old('execution_date'), [
                'class' => 'form-control date',
                'id' => 'execution_date',
                'placeholder' => '',
            ]) !!}
        </td>

        <th>@lang('quickadmin.inspections.fields.execution-hour')</th>
        <td field-key='execution_time'>
            {!! Form::text('execution_time', old('execution_time'), [
                'class' => 'form-control timepicker',
                'id' => 'execution_time',
                'placeholder' => '',
            ]) !!}
        </td>
    </tr>

    <tr>
        <th>Veicolo</th>
        <td field-key='vehicles' colspan="3">
            {!! Form::select('vehicles[]', $vehicles, old('vehicles'), ['class' => 'form-control select2', 'multiple' => 'multiple', 'id' => 'selectall-methods' ]) !!}
            <p class="help-block"></p>
            @if($errors->has('vehicles'))
                <p class="help-block">
                    {{ $errors->first('vehicles') }}
                </p>
            @endif
        </td>
    </tr>
    
    <tr>
        <th>Trasferta [minuti]</th>
        <td field-key='trip_time' colspan="3">
            {!! Form::text('trip_time', old('trip_time'), [
                'class' => 'form-control',
                'id' => 'trip_time',
                'placeholder' => 'Esempio: 28 [min]',
            ]) !!}
        </td>
    </tr>

    <tr>
        <th>Descrizione dell'intervento</th>
        <td field-key='inspection_note' colspan="3">
            @if ($inspection->inspection_note != null)
                <textarea id="desc" class="form-control" style="width: 100%;resize: none;" rows="5" maxlength="80">{{ $inspection->inspection_note }}</textarea>
            @else
                <textarea id="desc" class="form-control" style="width: 100%;resize: none;" rows="5" placeholder="Descrizione intervento"
                 maxlength="80"></textarea>
            @endif
        </td>
    </tr>
</table>

Javascript代码

<script>
    // This code will update the database when the user changes the value of a field
    $(function() {
        $('.form-control').on('change', function() {
            $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': "{{ \Illuminate\Support\Facades\Session::token() }}"
            }
        });

            $.ajax({
                url: '/admin/new_inspections/update/' + {{ $inspection->id }},
                type: 'post',
                data: {
                    inspection_date: $('#inspection_date').val(),
                    inspection_time: $('#inspection_time').val(),
                    inspection_state: $('#inspection_state').find("option:selected").attr('value'),
                    user_code: $('#user_code').find("option:selected").attr('value'),
                    inspection_note: $('textarea#desc').val(),
                    trip_time: $('#trip_time').val(),
                    execution_date: $('#execution_date').val(),
                    execution_hour: $('#execution_time').val(),
                },
                success: function(response) {
                    if (response.success) {
                        console.log('Product updated successfully!');
                    } else {
                        console.log('Error updating product!');
                    }
                }
            });
        });
    });
</script>

Controller代码

public function update(UpdateNewInspectionRequest $request, $id)
{
    $inspection = NewInspection::findOrFail($id);
    $inspection->extra_vehicles()->sync(array_filter((array)$request->input('extra_vehicles')));
    $inspection->update($request->all());
    $inspection->save();

    return back();
}

问题排查与解决方法

1. 修复CSRF令牌验证(核心解决419错误)

419错误本质是CSRF令牌验证失败,按以下步骤修正:

  • 在页面全局模板(或当前页面头部)添加CSRF meta标签:
    <meta name="csrf-token" content="{{ csrf_token() }}">
    
  • 调整JS中的ajaxSetup位置与令牌获取方式,将其移到事件外部(全局生效),避免重复设置:
    $(function() {
        // 全局设置AJAX请求头
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });
    
        $('.form-control').on('change', function() {
            // AJAX请求逻辑...
        });
    });
    

2. 修正请求方法与路由匹配

Laravel的更新路由默认使用PUT/PATCH方法,原JS使用post会导致路由不匹配:

  • 方法一:在AJAX的data参数中添加_method字段指定请求类型:
    data: {
        _method: 'PUT',
        // 其他字段...
    }
    
  • 方法二:直接修改AJAX的type为PUT:
    $.ajax({
        url: '/admin/new_inspections/update/' + {{ $inspection->id }},
        type: 'PUT',
        // 其他配置...
    });
    
  • 确保路由文件中定义的是PUT方法:
    Route::put('/admin/new_inspections/update/{id}', [NewInspectionController::class, 'update']);
    

3. 清理无效字段

JS的data中包含inspection_time、inspection_state、user_code等HTML中不存在的字段,会传递undefined值,可能触发验证错误,直接移除这些字段,或补充对应的表单元素。

4. 调整控制器响应格式

AJAX请求需要JSON格式响应,原控制器返回back()无法被JS正确解析,修改为:

public function update(UpdateNewInspectionRequest $request, $id)
{
    $inspection = NewInspection::findOrFail($id);
    $inspection->extra_vehicles()->sync(array_filter((array)$request->input('extra_vehicles')));
    $inspection->update($request->all());

    return response()->json(['success' => true]);
}

(注:update()方法已包含保存逻辑,无需重复调用save())

5. 检查主机环境配置

迁移主机后需确认:

  • .env文件中SESSION_DRIVER配置正确,若为file,确保storage/framework/sessions目录有读写权限;若为database,确认会话表已创建且可读写。
  • 主机的PHP版本、Laravel版本与旧主机一致,避免版本兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:49:53