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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 12:58:12