如何实现将用户名从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
相关产品推荐
相关产品推荐

