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

如何实现将用户名从Model传递至Controller?附代码问题排查

修正代码实现从Model传递用户名到Controller的登录功能

嘿,我帮你把这些问题都修复好,让登录功能能正确把用户名从Model传到Controller并存进Session里。咱们一步步来看:

修正后的控制器代码

public function aksi_login(){ 
    // 获取POST提交的邮箱和密码
    $email = $this->input->post('email'); 
    $password = $this->input->post('password'); 

    // 1. 定义$where变量,用于验证登录的条件
    $where = array(
        'Email' => $email,
        'Password' => $password // 注意:实际项目中密码必须加密存储,这里仅为示例
    );

    // 2. 先验证登录凭证是否有效
    $cek = $this->action->cek_login("anggota", $where)->num_rows(); 
    if($cek > 0){ 
        // 3. 调用getNamaLogin时传入必要的$email参数
        $username = $this->action->getNamaLogin($email); 
        // 将用户名及登录状态存入Session
        $data_session = array( 
            'nama' => $username, 
            'logged_in' => TRUE // 建议添加登录状态标记,方便后续权限判断
        ); 
        $this->session->set_userdata($data_session); 

        // 登录成功后可跳转至后台页面,比如:redirect('dashboard');
    } else {
        // 登录失败的处理逻辑,比如提示错误信息
        $this->session->set_flashdata('error', '邮箱或密码错误,请重试');
        redirect('login');
    }
}

控制器核心修改点:

  • 新增$where数组,用提交的邮箱和密码作为登录验证条件,解决原代码中$where未定义的问题
  • 调用getNamaLogin()时传入了必需的$email参数,让Model能正确查询对应用户名
  • 补充了登录失败的反馈逻辑,同时建议添加登录状态标记到Session中,方便后续权限控制
  • 增加了登录成功后的跳转提示(可根据实际项目调整)

修正后的模型代码

function getNamaLogin($email) { 
    // 1. 使用参数绑定避免SQL注入风险,这是关键的安全优化
    $query = $this->db->query("SELECT Nama FROM anggota WHERE Email = ?", array($email));
    
    // 2. 检查查询结果并返回用户名,无结果时返回NULL
    if($query->num_rows() > 0){
        $row = $query->row();
        return $row->Nama;
    } else {
        return NULL;
    }
}

// 补充标准的cek_login方法实现(如果原方法存在逻辑问题)
function cek_login($table, $where){
    return $this->db->get_where($table, $where);
}

模型核心修改点:

  • 保留$email参数,确保能接收控制器传递的查询条件
  • 用参数绑定(?占位符)替换直接字符串拼接,彻底避免SQL注入漏洞,这是生产环境必须的安全措施
  • 增加结果检查逻辑,确保只返回有效的用户名,无匹配时返回NULL,避免Session存入空值
  • 补充了cek_login方法的标准实现,确保登录验证逻辑正常运行

额外重要提示

  • 密码加密:实际项目中绝对不能明文存储密码!推荐使用PHP内置的password_hash()加密密码,验证时用password_verify()对比,比如在cek_login方法中需要调整逻辑验证加密后的密码
  • 错误边界处理:可以在控制器中对$username是否为NULL做额外判断,避免异常情况
  • 代码规范:尽量保持数据库字段名与代码变量名的大小写一致,减少混淆概率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:23:00