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

CodeIgniter用户邮箱修改功能失效,提交表单报非对象属性错误

问题分析与解决方案

首先,你遇到的Trying to get property of non-object错误,根源在于当数据库查询没有匹配到用户时,$query->row()会返回null,这时候直接访问$user->user_id就会触发这个Notice错误,后续的邮箱更新逻辑自然也不会执行,导致邮箱没更新。

具体问题点

  • 查询结果未做判空处理:当用户输入的密码不正确,或者会话中的user_id无效时,查询不会返回任何用户数据,$user变为null,直接访问$user->user_id必然报错。
  • 参数获取不够规范:你直接使用$_POST['wachtwoord']和$_SESSION['user_id'],虽然能运行,但CodeIgniter提供了更安全的$this->input->post()和$this->session->userdata()方法,建议统一使用以契合框架规范。

修复后的控制器代码

<?php 
class GwController extends CI_Controller { 

    public function index() { 
        $this->load->view('gegevenswijzigen'); 
    } 

    function __construct() { 
        parent::__construct(); 
        // 加载更新模型
        $this->load->model('Update_model');
        // 确保会话库可用
        $this->load->library('session');
    } 

    // 修改用户邮箱的控制器方法
    function update_email() { 
        // 用框架内置方法获取参数,提升安全性
        $userId = $this->session->userdata('user_id');
        $newEmail = $this->input->post('email');
        $password = $this->input->post('wachtwoord');

        // 验证必要参数是否存在
        if(empty($userId) || empty($newEmail) || empty($password)){
            // 参数缺失时跳转回修改页面
            redirect('GwController/index');
            return;
        }

        // 查询用户,验证密码正确性
        $this->db->select('*');
        $this->db->from('users');
        $this->db->where(array(
            'user_id' => $userId, 
            'wachtwoord' => $password
        ));
        $query = $this->db->get();

        // 先判断查询是否有结果,再操作用户对象
        if ($query->num_rows() > 0) { 
            $data = array('email' => $newEmail);
            // 调用模型执行邮箱更新
            $this->Update_model->update_email($userId, $data);
            // 跳转回个人资料页
            redirect('user/profile');
        } else {
            // 密码错误或用户不存在时,添加错误提示
            $this->session->set_flashdata('error', '密码不正确,请重试');
            redirect('GwController/index');
        }
    } 
}

模型代码的小优化

模型逻辑可以保留,但建议用框架会话类更新会话值,更符合规范:

<?php 
class Update_model extends CI_Model{ 
    // 更新用户邮箱的模型方法
    function update_email($id,$data){ 
        $this->db->where('user_id', $id);
        $this->db->update('users', $data);
        // 使用框架会话类更新邮箱会话值
        $this->session->set_userdata('email', $data['email']);
    } 
}

视图代码的小调整

用框架的form_open生成表单,同时用会话类传递user_id:

<?php echo form_open('GwController/update_email'); ?>
<tr>
    <td><h4>E-mail adres wijzigen</h4></td>
    <td><?php echo form_input(array(
        'type'=>'email',
        'id'=>'email', 
        'name'=>'email', 
        'placeholder' => 'Nieuw e-mail adres:', 
        'size'=>70
    ));?></td>
    <td><?php echo form_input(array(
        'type'=>'password',
        'id'=>'wachtwoord', 
        'name'=>'wachtwoord', 
        'placeholder' => 'Uw wachtwoord:', 
        'size'=>70
    ));?></td>
    <td><?php echo form_hidden('user_id', $this->session->userdata('user_id'));?></td>
    <td><button type="submit" name="emailwijzigen" class="btn btn-primary">Opslaan</button></td>
</tr>
<?php echo form_close(); ?>

关键修复说明

  1. 通过$query->num_rows() > 0先判断查询是否有结果,避免访问null对象的属性,彻底解决Notice错误。
  2. 使用CodeIgniter内置的input和session类处理参数与会话,提升代码安全性和兼容性。
  3. 添加参数空值验证,防止因缺少必要参数导致的逻辑异常。
  4. 增加错误提示逻辑(借助flashdata),优化用户体验。

这样修改后,不仅能解决你遇到的错误,还能让邮箱更新逻辑正常执行,代码也更贴合CodeIgniter的最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:33:27