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

CodeIgniter表单验证问题:未填/无效用户名触发非对象属性错误

问题原因与解决方案

这个错误的核心原因很直白:当你没填写用户名或者输入的用户名不存在时,你的user_detail模型方法返回的不是一个包含password属性的对象(大概率是null或者false),但你在控制器第74行直接尝试访问$user->password,自然就触发了“Trying to get property 'password' of non-object”的错误。

具体分两种情况拆解:

  • 未填写用户名时:如果你的表单验证规则没拦截空用户名,系统会拿着空字符串去数据库查用户信息,数据库里肯定没有匹配记录,所以user_detail返回非对象,后续直接取password就报错了。
  • 用户名不存在时:同理,数据库查询不到对应记录,user_detail返回非对象,直接访问属性必然触发错误。

解决步骤:

  1. 先加固表单验证
    在表单验证规则里给用户名字段加上required规则,确保空用户名根本到不了查询数据库的环节,比如:

    $this->form_validation->set_rules('username', 'Username', 'required|trim');
    

    这样用户没填用户名的话,表单验证会直接拦截并返回提示,不会走到后续的数据库查询逻辑。

  2. 在控制器里增加结果判断
    就算表单验证有疏漏,也要在调用user_detail之后先检查返回值是否有效,再去访问属性。比如在登录方法里:

    // 获取提交的用户名
    $username = $this->input->post('username');
    // 调用模型查询用户信息
    $user = $this->user_model->user_detail($username);
    
    // 先判断用户是否存在
    if (!$user) {
        $this->session->set_flashdata('error', '用户名不存在或未填写');
        redirect('user/login');
        return; // 终止后续代码执行,避免报错
    }
    
    // 确认用户存在后,再进行密码验证
    if (password_verify($this->input->post('password'), $user->password)) {
        // 登录成功逻辑,比如设置session、跳转首页
    } else {
        $this->session->set_flashdata('error', '密码错误');
        redirect('user/login');
    }
    
  3. 检查模型的user_detail方法
    确保模型方法在查询不到结果时返回的是null或者false,而非其他无效值。标准的CodeIgniter写法参考:

    public function user_detail($username) {
        $query = $this->db->get_where('users', ['username' => $username]);
        // row()方法无结果时返回null,有结果时返回对象
        return $query->row();
    }
    

这样就能彻底解决这个错误啦~

内容的提问来源于stack exchange,提问作者Farhan Luthfan Farisan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:14:43