在CodeIgniter 3中如何实现双表登录的邮箱密码匹配查询
问题分析与解决方案
你的代码核心问题出在select()方法的调用逻辑上:CodeIgniter 3的select()方法中,第二个参数是控制字段转义的布尔值,并非第二个字段列表。你写的select('ta.*', 'pr.*')只会解析ta.*,pr.*被误当成了转义开关(字符串会转为布尔值true),因此查询结果仅包含tbl_admin表的字段。
另外需要确认join的关联条件ta.admin_id = pr.patient_id是否与你的数据库表结构逻辑匹配,若关联字段错误,也会导致无法正确获取patient_record表的数据。
修正后的代码
<?php class Login_model extends CI_Model { public function __construct() { parent::__construct(); $this->load->database(); } public function login($email, $pass) { // 将两个表的字段放在同一个字符串中,正确传递给select方法 $query = $this->db->select('ta.*, pr.*') ->from('tbl_admin ta') ->join('patient_record pr', 'ta.admin_id = pr.patient_id') // 确认关联字段是否符合表结构 ->where('ta.email', $email) ->where('ta.password', $pass) ->get(); // 返回包含两个表字段的整行数据 return $query->row(); } } ?>
额外优化建议
- 密码安全:当前直接用明文密码匹配存在严重安全风险,建议注册时用
password_hash()加密密码,登录时用password_verify()验证,示例:$admin = $this->db->select('ta.*, pr.*') ->from('tbl_admin ta') ->join('patient_record pr', 'ta.admin_id = pr.patient_id') ->where('ta.email', $email) ->get()->row(); if ($admin && password_verify($pass, $admin->password)) { return $admin; } return null; - 字段冲突处理:如果两个表存在同名字段(如都有
id),需给字段起别名避免数据覆盖,比如select('ta.admin_id as admin_id, pr.patient_id as patient_id, ta.*, pr.*')。
内容的提问来源于stack exchange,提问作者ksykko
相关产品推荐
相关产品推荐

