CodeIgniter更新表单验证失败时$user_hunter未定义问题求助
问题描述
在HunterController.php文件的updateHunter()方法中,预期实现以下功能:
- 表单验证通过:更新猎人注册信息并跳转至列表页
- 表单验证不通过:返回
form_update.php表单页,显示对应字段的错误提示引导用户修正
但验证不通过返回表单页时,触发错误:Undefined variable $user_hunter,页面显示全白。
相关代码
表单页:form_update.php
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="<?= base_url('css/bootstrap.css'); ?>"> <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.14.15/jquery.mask.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script> <script src="https://kit.fontawesome.com/41b4cd8ba8.js" crossorigin="anonymous"></script> <script type="text/javascript" src="<?= base_url('js/bootstrap.js')?>"></script> <title>更新 <?= $user_hunter['name_hunter'] ?></title> </head> <body> <div class="contained"> <div class="row"> <div class="col-md-12 mt-2"> <div class="card"> <div class="card-header"> <h4>更新 <?= $user_hunter['name_hunter'] ?> <a href="<?= site_url('/home');?>" class="btn btn-secondary float-end"><i class="fa fa-arrow-left"></i> 返回列表</a> </h4> </div> </div> <br> <div class="card-body"> <?php $validation = \Config\Services::validation(); ?> <form action="<?= site_url('update/'.$user_hunter['id_hunter'])?>" method="POST"> <div class="form_group"> <div class="form_group"> <label for="name_hunter">ID: <input type="number" class="form-control" name="id_hunter" value="<?= $user_hunter['id_hunter'] ?>" readonly> </label> </div> <br> <div class="form_group"> <label for="name_hunter">姓名: <input type="text" class="form-control" name="name_hunter" maxlength="30" value="<?= $user_hunter['name_hunter'] ?>"> <?php if($validation->getError('name_hunter')) {?> <div class='text-danger mt-1'> <?= $validation->getError('name_hunter'); ?> </div> <?php }?> </label> </div> <br> ...(以下为更多字段) <button type="submit" class="btn btn-primary"><i class="fa fa-edit"></i> 更新</button> </div> </form> </div> </div> </div> </div> </body> </html>
控制器:HunterController.php
public function updateHunter() { try { helper(['form', 'url', 'html']); $validations = $this->validate([ 'name_hunter' => 'required|max_length[30]', 'year_hunter' => 'required|integer', 'height_hunter' => 'required|decimal', 'weight_hunter' => 'required|decimal', 'type_hunter' => 'required|max_length[30]', 'type_nen' => 'required|max_length[30]', 'type_blood' => 'required|max_length[3]' ], [ 'name_hunter' => [ 'required' => '猎人姓名不能为空。', 'max_length' => '猎人姓名长度不能超过30个字符。' ], 'year_hunter' => [ 'required' => '猎人年龄不能为空。', 'integer' => '猎人年龄必须为整数。' ], 'height_hunter' => [ 'required' => '猎人身长不能为空。', 'decimal' => '猎人身长必须为小数。' ], 'weight_hunter' => [ 'required' => '猎人体重不能为空。', 'decimal' => '猎人体重必须为小数。' ], 'type_hunter' => [ 'required' => '必须指定猎人类型。', 'max_length' => '猎人类型长度不能超过30个字符。' ], 'type_nen' => [ 'required' => '必须指定念能力类型。', 'max_length' => '念能力类型长度不能超过30个字符。' ], 'type_blood' => [ 'required' => '必须指定血型。', 'max_length' => '血型长度不能超过3个字符。' ] ]); $hunter = new HunterModel(); $id_hunter = $this->request->getPost('id_hunter'); // 获取猎人原有数据 $user_hunter = $hunter->find($id_hunter); if ($validations) { $data = [ 'name_hunter' => $this->request->getPost('name_hunter'), 'year_hunter' => $this->request->getPost('year_hunter'), 'height_hunter' => $this->request->getPost('height_hunter'), 'weight_hunter' => $this->request->getPost('weight_hunter'), 'type_hunter' => $this->request->getPost('type_hunter'), 'type_nen' => $this->request->getPost('type_nen'), 'type_blood' => $this->request->getPost('type_blood') ]; $hunter->update($id_hunter, $data); return $this->response->redirect(site_url('/home')); } else { // 验证不通过时,将user_hunter变量传递给视图 echo view('form_update', ['validation' => $this->validator, 'user_hunter' => $user_hunter]); } } catch (\Exception $e) { exit($e->getMessage()); } }
问题解决说明
核心错误原因:验证不通过返回视图时,没有向
form_update.php传递$user_hunter变量,但表单页面多处依赖该变量(比如标题、表单字段默认值、表单提交地址),导致PHP抛出未定义变量错误,页面无法正常渲染。
解决方法:在控制器中先通过猎人ID从模型获取$user_hunter数据,然后在验证不通过的分支里,将该变量和validation一起传递给视图。额外小问题修正:
- 控制器验证规则的自定义错误信息里,把
type_blood误写成了typo_blood,导致血型字段的错误提示无法正常触发,已修正。 - 表单页面里用
<div for="name_hunter">替代了<label>,不符合HTML规范,已改为<label>标签。 - 表单页面里加载本地bootstrap.js时,将
href误写为src,已修正。 - 表单页面里的错误输出代码冗余,直接输出
$validation->getError('name_hunter')即可,无需额外赋值给$error。
- 控制器验证规则的自定义错误信息里,把
内容的提问来源于stack exchange,提问作者user19935342
相关产品推荐
相关产品推荐

