CodeIgniter中遇Trying to get property of non-object错误,如何正确查询数据库?
解决CodeIgniter中“Trying to get property of non-object”错误
兄弟,你碰到的这个错误太常见了!本质就是你代码里的$checkpassword不是一个有效的对象,你却强行去访问它的->password属性,自然就会抛出这个错误。大概率是你的模型方法没返回预期的数据,或者根本没找到匹配的记录,返回了null。
我给你一步步捋清楚怎么解决:
第一步:修复你的模型方法
先把你的checkpassword模型方法补全,确保它能正确返回单个用户对象(或者在没数据时返回null):
function checkpassword($oldpassword) { // 假设你的用户表名叫users,密码字段是password $this->db->where('password', $oldpassword); // 这里先提个醒:实际项目里绝对不能存明文密码!后面我会说正确的做法 $query = $this->db->get('users'); // 使用row()返回单个结果对象,无数据时返回null return $query->row(); }
第二步:在控制器里做安全判断
拿到模型返回的数据后,先别急着访问属性,先判断是否存在有效数据,再做密码验证:
$oldpassword = $this->input->post('oldpassword'); $checkpassword = $this->m_user->checkpassword($oldpassword); // 先检查是否找到了匹配的用户记录 if (!$checkpassword) { $data['inputerror'][] = 'oldpassword'; $data['error_string'][] = 'your old password is wrong'; $data['status'] = FALSE; } else { // 划重点!这里必须用密码哈希验证,不能直接比较字符串 // 如果你的密码是用password_hash()加密存储的,就用下面的方式验证 if (!password_verify($oldpassword, $checkpassword->password)) { $data['inputerror'][] = 'oldpassword'; $data['error_string'][] = 'your old password is wrong'; $data['status'] = FALSE; } else { // 旧密码验证通过,执行后续逻辑 $data['status'] = TRUE; } }
几个关键提醒
- 绝对不要存明文密码:这是安全大忌!用户注册时用
password_hash($password, PASSWORD_DEFAULT)加密后再存到数据库,验证时用password_verify()对比,上面的代码已经按这个正确逻辑调整了。 - 如果你的模型之前返回的是数组(比如用
row_array()),那你应该用$checkpassword['password']来访问属性,而不是->语法,但对象方式更直观。 - 一定要先判断
$checkpassword是否为真,再去访问它的属性,避免无数据时触发错误。
内容的提问来源于stack exchange,提问作者Gusti Erlangga
相关产品推荐
相关产品推荐

