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

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>&nbsp;返回列表</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>&nbsp;更新</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());
    }
}

问题解决说明
  1. 核心错误原因:验证不通过返回视图时,没有向form_update.php传递$user_hunter变量,但表单页面多处依赖该变量(比如标题、表单字段默认值、表单提交地址),导致PHP抛出未定义变量错误,页面无法正常渲染。
    解决方法:在控制器中先通过猎人ID从模型获取$user_hunter数据,然后在验证不通过的分支里,将该变量和validation一起传递给视图。

  2. 额外小问题修正:

    • 控制器验证规则的自定义错误信息里,把type_blood误写成了typo_blood,导致血型字段的错误提示无法正常触发,已修正。
    • 表单页面里用<div for="name_hunter">替代了<label>,不符合HTML规范,已改为<label>标签。
    • 表单页面里加载本地bootstrap.js时,将href误写为src,已修正。
    • 表单页面里的错误输出代码冗余,直接输出$validation->getError('name_hunter')即可,无需额外赋值给$error。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:15:43