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

Laravel 8表单数据无法传递至后端,无法存入数据库问题排查与修正

问题排查与错误修正

核心错误分析

  1. 表单提交方式错误:用<a>标签发起GET请求,无法携带表单输入数据,后端自然获取不到txtManufactureName的值。
  2. 路由请求方法错误:保存数据的store方法使用GET路由,HTTP规范中创建资源应使用POST请求,且GET请求不会传递表单数据。
  3. 路由映射冗余:/item_manufacture路由直接返回视图,与控制器index功能重复。
  4. 缺少必要表单结构:未用<form>标签包裹输入字段,也未添加Laravel必填的CSRF令牌。

修正后的代码

1. 视图文件(item_manufacture.blade.php)

@extends('layout.layout_01')

@section('content')
    <div class="container">
        <div class="row">
            <div class="col-md-4"></div>
            <div class="col-md-4">
                <div class="card">
                    <h5 class="card-header">Add Item Manufacture Details</h5>
                    <div class="card-body">
                        <!-- 用form标签包裹,指定POST请求和命名路由 -->
                        <form action="{{ route('saveManufacture') }}" method="POST">
                            <!-- 必须添加CSRF令牌防止跨站请求伪造 -->
                            @csrf

                            <div class="input-field p-3">
                                <label for="txtManufactureName">Manufacture Name :</label>
                                <div class="col-sm-8 p-2">
                                    <input type="text" placeholder="Item Name" name="txtManufactureName" id="txtManufactureName">
                                </div>
                            </div>

                            <!-- 新增状态选择字段(可选,根据业务需求调整) -->
                            <div class="input-field p-3">
                                <label for="status">Status :</label>
                                <div class="col-sm-8 p-2">
                                    <select name="status" id="status">
                                        <option value="available">Available</option>
                                        <option value="unavailable">Unavailable</option>
                                    </select>
                                </div>
                            </div>

                            <!-- 用submit按钮替换a标签 -->
                            <button type="submit" class="btn btn-primary mb-2" id="btnAdd">ADD</button>
                        </form>
                    </div>
                </div>
            </div>
            <div class="col-md-4"></div>
        </div>
    </div>
@endsection

2. 路由文件

// 显示制造商添加页面,映射到控制器index方法
Route::get('/item_manufacture', [ItemManufactureController::class, 'index'])->name('itemManufacture');
// 保存制造商数据,使用POST请求
Route::post('/save_manufacture', [ItemManufactureController::class, 'store'])->name('saveManufacture');

3. 控制器文件(ItemManufactureController.php)

class ItemManufactureController extends Controller
{
    public function index(){
        return view('item_manufacture');
    }

    public function store(Request $request){
        // 可选:添加表单验证,确保输入合法性
        $request->validate([
            'txtManufactureName' => 'required|string|max:255',
            'status' => 'required|in:available,unavailable'
        ]);

        // 手动赋值保存
        $newManufacture = new ItemManufacture;
        $newManufacture->name = $request->input('txtManufactureName');
        $newManufacture->status = $request->input('status', 'available'); // 保留默认值应对字段缺失
        $newManufacture->save();

        // 批量赋值方式(需模型已定义$fillable)
        // ItemManufacture::create([
        //     'name' => $request->txtManufactureName,
        //     'status' => $request->input('status', 'available')
        // ]);

        return redirect()->route('itemManufacture');
    }
}

4. 模型文件(无需修改)

你的模型已正确设置$fillable,批量赋值和手动赋值都能正常工作。


Laravel正确获取输入与保存数据的规范

  1. 表单提交要求

    • 必须用<form>标签包裹输入字段,指定method="POST"。
    • 必须添加@csrf指令生成CSRF令牌,Laravel会自动验证该令牌。
    • 提交操作使用<button type="submit">,避免用<a>标签发起GET请求。
  2. 路由设置

    • 创建资源用POST路由,对应控制器store方法;查询资源用GET路由。
    • 使用路由命名(->name()),通过route()函数调用,避免硬编码URL。
  3. 输入数据获取

    • $request->input('字段名', '默认值'):字段不存在时返回默认值。
    • $request->字段名:快捷访问方式,字段不存在返回null。
    • $request->all():获取所有输入数据,返回数组。
  4. 数据库保存

    • 手动赋值:实例化模型,给属性赋值后调用save()。
    • 批量赋值:使用Model::create($data),需模型中定义$fillable(允许批量赋值的字段)或$guarded = [](不保护任何字段)。
    • 建议添加表单验证:通过$request->validate()确保输入符合业务规则,验证失败自动重定向并返回错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:44:57