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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:55:20