Laravel 8表单数据无法传递至后端,无法存入数据库问题排查与修正
问题排查与错误修正
核心错误分析
- 表单提交方式错误:用
<a>标签发起GET请求,无法携带表单输入数据,后端自然获取不到txtManufactureName的值。 - 路由请求方法错误:保存数据的
store方法使用GET路由,HTTP规范中创建资源应使用POST请求,且GET请求不会传递表单数据。 - 路由映射冗余:
/item_manufacture路由直接返回视图,与控制器index功能重复。 - 缺少必要表单结构:未用
<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正确获取输入与保存数据的规范
表单提交要求
- 必须用
<form>标签包裹输入字段,指定method="POST"。 - 必须添加
@csrf指令生成CSRF令牌,Laravel会自动验证该令牌。 - 提交操作使用
<button type="submit">,避免用<a>标签发起GET请求。
- 必须用
路由设置
- 创建资源用
POST路由,对应控制器store方法;查询资源用GET路由。 - 使用路由命名(
->name()),通过route()函数调用,避免硬编码URL。
- 创建资源用
输入数据获取
$request->input('字段名', '默认值'):字段不存在时返回默认值。$request->字段名:快捷访问方式,字段不存在返回null。$request->all():获取所有输入数据,返回数组。
数据库保存
- 手动赋值:实例化模型,给属性赋值后调用
save()。 - 批量赋值:使用
Model::create($data),需模型中定义$fillable(允许批量赋值的字段)或$guarded = [](不保护任何字段)。 - 建议添加表单验证:通过
$request->validate()确保输入符合业务规则,验证失败自动重定向并返回错误信息。
- 手动赋值:实例化模型,给属性赋值后调用
内容的提问来源于stack exchange,提问作者Chinthani Madinuda
相关产品推荐
相关产品推荐

