PHP项目使用Yajra Datatables后可读取数据库但POST新增/更新操作报错
错误原因分析
- 核心报错1:POST请求
http://localhost/dashboard_new/public/addPackage返回404,说明服务端没有匹配到该POST请求对应的路由,常见诱因包括路由未定义、路由请求方法不匹配、路由大小写拼写不一致、CSRF令牌缺失导致请求被中间件拦截后跳转至不存在路径。 - 核心报错2:
Uncaught TypeError: Cannot read properties of undefined (reading 'errors')是因为请求返回404时,响应内容不是JSON格式,xhr.responseJSON为undefined,直接读取其下的errors属性触发报错。 - 额外代码问题:编辑逻辑中
$("status").val(data[0].status)、var idRow = $("id").val()两处选择器书写错误,缺少ID选择器标识#,无法正常获取对应表单元素的值。
可行解决方案
- 排查路由配置
执行Laravel命令php artisan route:list,检查以下内容:
- 是否存在POST类型、URI为
addPackage的路由,注意路由拼写、大小写必须和请求地址完全一致 - 确认更新操作的路由是否已设置名称
->name('updatepackage'),和代码中{{route('updatepackage')}}调用匹配
- 补充CSRF令牌校验
Laravel默认要求所有POST请求携带CSRF令牌,否则会拦截请求:
- 在页面
<head>标签中添加CSRF元标签:
<meta name="csrf-token" content="{{ csrf_token() }}">
- 给所有POST类型的AJAX请求添加请求头:
$.ajax({ url: "你的请求地址", type: "POST", headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, // 其余配置保持不变 })
统一路径写法
避免硬编码请求路径,所有请求地址统一使用Laravel辅助函数生成,例如addPackage的请求地址改为{{ route('addPackage') }}(需先给对应路由设置名称)或{{ url('addPackage') }}。
建议配置本地开发环境的虚拟主机,将站点根目录指向项目的public文件夹,既可以消除路径中需要带/public的问题,也能提升项目安全性。修复JS错误兼容逻辑
修改AJAX的error回调,增加非JSON响应的兼容判断:
error: function (xhr, status, error) { if(xhr.responseJSON && xhr.responseJSON.errors) { $.each(xhr.responseJSON.errors,function(key,item) { $('#form_submit_error').modal('show'); setTimeout(function() {$('#form_submit_error').modal('hide');}, 2000); }) } else { console.log('请求异常:', error); alert('操作失败,请稍后重试'); } }
- 修正选择器错误
将两处错误的选择器补充#标识:
// 原代码 $("status").val(data[0].status); 改为: $("#status").val(data[0].status); // 原代码 var idRow = $("id").val(); 改为: var idRow = $("#id").val();
内容的提问来源于stack exchange,提问作者Irtaza Ali
相关产品推荐
相关产品推荐

