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

CodeIgniter认证时Session数据显示Null的问题求助

解决CodeIgniter中Session变量跨控制器传递为空的问题

嘿,我碰到过好几个CodeIgniter开发者遇到这种Session跨控制器取不到值的情况,咱们一步步拆解问题,找出原因:

先排查最基础的Session配置问题

首先得确认你的Session库是不是正常工作的:

  • 打开application/config/autoload.php,看看是不是已经把session库加入自动加载了:
    $autoload['libraries'] = array('session');
    
    如果没加,那每次都要在控制器里手动调用$this->load->library('session'),不然根本用不了Session功能。
  • 再检查application/config/config.php里的Session存储配置:
    • 如果用的是file驱动,$config['sess_save_path']对应的目录必须存在,而且服务器要有读写权限(比如设置成./application/sessions,然后给这个目录700权限)。
    • 如果用database驱动,要确保你已经创建了对应的session表,配置里的数据库连接也没问题。

检查Session变量是否真的被正确设置

你在登录成功的地方,是不是这样存Session的?

// 登录逻辑里设置Session的代码示例
$this->session->set_userdata('userdata', array(
    'is_logged_in' => true,
    'username' => 'test_user'
));

设置完之后立刻打印一下所有Session内容,确认变量确实存进去了:

print_r($this->session->userdata());

如果这里就看不到userdata这个键,那问题出在登录时的设置环节,不是跨控制器的问题。

修复你的Login_lib里的容错逻辑

你现在的logged_in()方法直接访问$CI->session->userdata('userdata')['is_logged_in'],如果userdata这个Session键不存在,或者它不是数组,直接访问索引会报错,而且会返回Null。改成下面这样增加容错:

<?php 
// library/login_lib.php 
class Login_lib { 
    public function logged_in() { 
        $CI = & get_instance(); 
        // 先取出整个userdata会话,判断是否是数组
        $user_session = $CI->session->userdata('userdata');
        if (!is_array($user_session)) {
            return null;
        }
        // 再检查is_logged_in键是否存在
        return isset($user_session['is_logged_in']) ? $user_session['is_logged_in'] : null;
    } 
} 
?>

确保Helper里的函数正确依赖Login_lib

你的common_helper.php里的authentication_user函数,要确保已经加载了Login_lib,不然调用的时候会找不到类:

<?php 
// common_helper.php 
if( !function_exists('authentication_user') ) { 
    function authentication_user() {
        $CI = &get_instance();
        // 先检查Login_lib是否已加载,没加载就手动加载
        if (!$CI->load->is_loaded('login_lib')) {
            $CI->load->library('login_lib');
        }
        return $CI->login_lib->logged_in();
    }
}
?>

最后在目标控制器里验证

在你要获取Session的控制器里,先打印全部Session内容,确认变量存在:

public function some_method() {
    // 如果没自动加载session,先手动加载
    $this->load->library('session');
    // 打印所有Session内容,看看有没有userdata
    print_r($this->session->userdata());
    
    // 再调用你的方法
    $this->load->library('login_lib');
    var_dump($this->login_lib->logged_in());
}

按照这个流程排查,基本上就能找到问题所在了——大概率是Session没加载、配置不对,或者设置Session的时候出了疏漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:27:04