CodeIgniter表单验证问题:未填/无效用户名触发非对象属性错误
问题原因与解决方案
这个错误的核心原因很直白:当你没填写用户名或者输入的用户名不存在时,你的user_detail模型方法返回的不是一个包含password属性的对象(大概率是null或者false),但你在控制器第74行直接尝试访问$user->password,自然就触发了“Trying to get property 'password' of non-object”的错误。
具体分两种情况拆解:
- 未填写用户名时:如果你的表单验证规则没拦截空用户名,系统会拿着空字符串去数据库查用户信息,数据库里肯定没有匹配记录,所以
user_detail返回非对象,后续直接取password就报错了。 - 用户名不存在时:同理,数据库查询不到对应记录,
user_detail返回非对象,直接访问属性必然触发错误。
解决步骤:
先加固表单验证
在表单验证规则里给用户名字段加上required规则,确保空用户名根本到不了查询数据库的环节,比如:$this->form_validation->set_rules('username', 'Username', 'required|trim');这样用户没填用户名的话,表单验证会直接拦截并返回提示,不会走到后续的数据库查询逻辑。
在控制器里增加结果判断
就算表单验证有疏漏,也要在调用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'); }检查模型的
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
相关产品推荐
相关产品推荐

