Laravel+PHP+HTML实现MySQL数据存储失败求助
Laravel数据存入MySQL失败排查方案
问题描述
使用PHP、HTML及Laravel框架开发数据存储功能,点击保存按钮后页面正常跳转,但数据未成功存入MySQL数据库。
相关代码
路由代码
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\ServicePaieController; route::get('/',[ServicePaieController::class, 'index']); Route::match(['get', 'post'], '/search', [ServicePaieController::class, 'searchDataAbsence'])->name('searchDataAbsence'); Route::post('/', [ServicePaieController::class,'storeAbsence'])->name('storeAbsence'); Route::middleware([ 'auth:sanctum', config('jetstream.auth_session'), 'verified', ])->group(function () { Route::get('/dashboard', function () { return view('dashboard'); })->name('dashboard'); });
控制器storeAbsence函数
public function storeAbsence(Request $request) { $request->validate([ 'Matricule' => 'required', 'Structure' => 'required', 'NomPrenom' => 'required', 'Abs_Periode' => 'required', 'Abs_Mois' => 'required', 'Abs_Exercice' => 'required', 'Abs_jour_sp' => 'required', 'Abs_Total_ap' => 'required', 'Abs_Retenue_sp' => 'required', 'Abs_jour_aes' => 'required', 'Abs_Total_aes' => 'required', 'Abs_Retenue_aes' => 'required', ]); Log::info('Your log message here'); Absence::create([ 'Matricule' => $request->search, 'Structure' => $request->nomStr, 'NomPrenom' => $request->nomPer, 'Abs_Periode' => $request->searchPeriode, 'Abs_Mois' => "Décembre", 'Abs_Exercice' => $request->searchExercice, 'Abs_jour_sp' => $request->jour_sp, 'Abs_Total_ap' => $request->total_sp, 'Abs_Retenue_sp' => $request->retenue_sp, 'Abs_jour_aes' => $request->jour_aes, 'Abs_Total_aes' => $request->total_aes, 'Abs_Retenue_aes' => $request->retenue_aes, ]); return redirect()->route('service_paie.service_paie_module')->with('success', "Absence data created successfully"); }
HTML表单代码
<form class="font_size" id="addAbsenceForm" action="{{ route('storeAbsence') }}" method="post"> @csrf <!-- your form fields go here --> <div class="div_design"> <div class="btn_design" role="group" aria-label="Actions"> <input id="addAbsenceButton" class="btn_designBtn btn btn-primary" type="submit" value="Enregistrer"> </div> </div> </form>
排查与解决步骤
1. 修正验证规则与请求字段不匹配问题
控制器中验证规则使用的字段名(如Matricule、Structure)与实际从请求中获取的字段名(如search、nomStr)完全不一致,这会导致验证逻辑失效甚至静默失败。
- 方案一:将验证规则改为实际表单提交的字段名:
$request->validate([ 'search' => 'required', 'nomStr' => 'required', 'nomPer' => 'required', 'searchPeriode' => 'required', 'searchExercice' => 'required', 'jour_sp' => 'required', 'total_sp' => 'required', 'retenue_sp' => 'required', 'jour_aes' => 'required', 'total_aes' => 'required', 'retenue_aes' => 'required', ]);
- 方案二:统一表单输入框的
name属性与验证规则的字段名,确保两者一致。
2. 检查Absence模型的批量赋值权限
Laravel的create()方法要求模型必须声明可批量赋值的字段,否则数据无法写入数据库。在Absence模型中添加$fillable属性:
protected $fillable = [ 'Matricule', 'Structure', 'NomPrenom', 'Abs_Periode', 'Abs_Mois', 'Abs_Exercice', 'Abs_jour_sp', 'Abs_Total_ap', 'Abs_Retenue_sp', 'Abs_jour_aes', 'Abs_Total_aes', 'Abs_Retenue_aes', ];
3. 完善表单输入字段
当前HTML表单仅包含提交按钮,缺少实际的输入字段,导致请求中没有携带需要存储的数据。需要补充表单输入框,并确保每个输入框的name属性与控制器中$request->xxx的xxx一致:
<form class="font_size" id="addAbsenceForm" action="{{ route('storeAbsence') }}" method="post"> @csrf <div> <label>Matricule:</label> <input type="text" name="search" required> @error('search') <span class="text-danger">{{ $message }}</span> @enderror </div> <!-- 按相同逻辑补充nomStr、nomPer等其他字段 --> <div class="div_design"> <div class="btn_design" role="group" aria-label="Actions"> <input id="addAbsenceButton" class="btn_designBtn btn btn-primary" type="submit" value="Enregistrer"> </div> </div> </form>
4. 增加请求日志排查数据
修改控制器中的日志代码,记录完整的请求数据,便于排查是否有数据传入:
Log::info('Store absence request data:', $request->all());
之后查看storage/logs/laravel.log文件,确认请求中是否包含所需字段及对应值。
5. 验证重定向路由有效性
检查重定向使用的service_paie.service_paie_module路由是否在路由文件中正确定义,若路由不存在,会导致跳转异常。
6. 调整路由避免潜在冲突
根路径/同时绑定了GET请求的index方法和POST请求的storeAbsence方法,建议将存储路由改为更明确的路径,避免潜在冲突:
Route::post('/absence/store', [ServicePaieController::class,'storeAbsence'])->name('storeAbsence');
内容的提问来源于stack exchange,提问作者RaoufDevelop
相关产品推荐
相关产品推荐

