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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:37:33