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

CodeIgniter 3 MySQL用户密码验证功能失效排查求助

问题分析与解决方案

嘿,我一眼就看出你的verify_password函数为什么总是返回false了——你踩了一个新手常犯的坑:直接把数据库查询返回的结果对象和密码字符串做比较,这两者根本不是同一类型的数据,自然永远不会相等!

具体问题拆解

  • $this->db->get()执行查询后,返回的是一个数据库结果对象(比如CodeIgniter框架里的CI_DB_result实例),而不是你要的密码字符串。你必须先从这个对象里提取出实际存储的密码值。
  • 你还没处理用户不存在的情况:如果传入的用户名在数据库里找不到,查询结果是空的,这时候直接比较也会返回false,我们需要先判断是否存在有效记录。

修正后的代码

public function verify_password($username, $password){
    $this->db->select('password');
    $this->db->from('user_account');
    $this->db->where('username', $username);
    $query = $this->db->get();

    // 先判断是否查询到有效用户记录
    if ($query->num_rows() === 0) {
        return false; // 用户名不存在,验证失败
    }

    // 从结果对象中取出存储的密码(强烈推荐用哈希存储!)
    $user_record = $query->row();
    $stored_password = $user_record->password;

    // 用PHP官方推荐的密码哈希验证函数(前提是存储时用password_hash()生成哈希)
    return password_verify($password, $stored_password);

    // 如果你暂时还在明文存储(非常不建议!),可以用下面的比较方式:
    // return $password === $stored_password;
}

额外重要安全提醒

千万不要明文存储用户密码!这是严重的安全隐患,一旦数据库泄露,所有用户的密码都会直接暴露。正确的流程是:

  • 用户注册时,用password_hash($password, PASSWORD_DEFAULT)生成哈希值再存入数据库
  • 验证时,用password_verify($input_password, $stored_hash)来匹配,这个函数会自动处理哈希的验证逻辑,不需要手动解密

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:09:02