Laravel提交数据遇500错误:POST请求失败无法写入数据库
问题:POST提交数据仍报500错误,无法写入数据库
错误提示:路由submitdata不支持GET方法,仅支持POST。
JS代码
document.getElementById('submitdata').addEventListener('click', function (e) { e.preventDefault(); console.log('Submitting all data'); var rowsData = []; document.querySelectorAll('#itemTable tbody tr').forEach(function (row) { var item = row.querySelector('td:nth-child(2)').textContent; var price = row.querySelector('td:nth-child(3)').textContent; var quantity = row.querySelector('td:nth-child(4)').textContent; rowsData.push({ item: item, price: price, quantity: quantity }); }); var csrfToken = document.head.querySelector('meta[name="csrf-token"]').content; console.log('CSRF Token:', csrfToken); console.log('Rows data:', rowsData); fetch('/submitdata', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken, }, body: JSON.stringify({ rows: rowsData }), }) .then(response => { if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } return response.json(); }) .then(data => { console.log('All data submitted successfully:', data); }) .catch(error => { console.error('Error submitting all data:', error); }); });
路由配置(web.php)
Route::post('/submitdata', [OrderController::class, 'submitdata']);
OrderController代码
public function submitdata(Request $request) { try { $rows = $request->input('rows'); \Log::info('Received POST request to /submitdata'); foreach ($rows as $row) { $order = new Order([ 'item' => $row['item'], 'quantity' => $row['quantity'], 'price' => $row['price'], 'total' => $row['total'], ]); $order->save(); } \Log::info('Data submitted successfully'); return response()->json(['message' => 'Data submitted successfully']); } catch (\Exception $e) { \Log::error('Error processing data:', [ 'message' => $e->getMessage(), 'trace' => $e->getTraceAsString(), ]); return response()->json(['error' => 'Internal Server Error'], 500); } }
问题详情
已使用POST方法提交数据,但仍出现错误,控制台输出:
POST http://127.0.0.1:8000/submitdata 500 (Internal Server Error)
(anonymous) @ cashier:208
cashier:227 Error submitting all data: Error: HTTP error! Status: 500
at cashier:218:19
数据无法写入数据库,请求排查原因。
排查与解决方法
1. 核心问题:JS未传递total字段
控制器代码中尝试获取$row['total'],但前端JS的rowsData里只包含item、price、quantity,没有total字段,这会导致PHP抛出未定义索引的错误,触发500状态码。
修复方法:
在JS循环中获取表格行的total值并添加到数据中:
document.querySelectorAll('#itemTable tbody tr').forEach(function (row) { var item = row.querySelector('td:nth-child(2)').textContent; var price = row.querySelector('td:nth-child(3)').textContent; var quantity = row.querySelector('td:nth-child(4)').textContent; // 根据实际表格列位置调整nth-child的数值 var total = row.querySelector('td:nth-child(5)').textContent; rowsData.push({ item: item, price: price, quantity: quantity, total: total }); });
2. 检查Order模型的可填充字段
确保Order模型中设置了$fillable属性,允许批量赋值:
// app/Models/Order.php protected $fillable = ['item', 'quantity', 'price', 'total'];
若未设置,调用new Order([...])批量赋值会抛出MassAssignmentException,同样触发500错误。
3. 验证数据库表结构
确认orders表存在以下字段且类型匹配:
item:字符串类型(如varchar)quantity:整数类型(如int)price:小数类型(如decimal(8,2))total:小数类型(如decimal(8,2))
字段缺失或类型不匹配会导致保存模型时触发数据库错误。
4. 查看Laravel日志定位具体错误
查看storage/logs/laravel.log文件,里面已通过\Log::error记录了详细错误信息(包括异常消息和堆栈跟踪),可直接定位问题根源。
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

