CodeIgniter 2.1.0会话问题

时间:2012-07-15 15:01:18

标签: php codeigniter session authentication

CodeIgniter Session()类有问题,而用户注销时出错。问题是我在页面的标题上有一个用户HTML块,其中显示了他的头像和信息。问题是当我在我的Logout Controller中执行此操作时:

if ($this->session->userdata('is_logged_in') == 1) {
    $data['logged_in'] = TRUE;

    $this->session->sess_destroy();
}

$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate");
$this->output->set_header("Cache-Control: post-check=0, pre-check=0");
$this->output->set_header("Pragma: no-cache");

..然后在我的HTML视图中我问这个:

<?php
    if ($this->session->userdata('is_logged_in') == 1) {
        // Output HTML
    }
?>

..但它会为缺少的所有会话变量生成错误。

所以我的问题;为什么'is_logged_in'在检查时仍然存在,但其余的数据都消失了。

1 个答案:

答案 0 :(得分:2)

CI 2.1.0中的错误是,如果您致电$this->session->sess_destroy(),则不会取消设置用户数据。

可以在此处找到解决问题的提示请求:https://github.com/EllisLab/CodeIgniter/pull/1323

修复非常简单。您必须更改文件system\libraries\Session.php。您必须在函数sess_destroy()的末尾添加以下行:

// Kill session data
$this->userdata = array();

所以sess_destroy()看起来像这样:

/**
 * Destroy the current session
 *
 * @return  void
 */
public function sess_destroy()
{
    // Kill the session DB row
    if ($this->sess_use_database === TRUE && isset($this->userdata['session_id']))
    {
        $this->CI->db->where('session_id', $this->userdata['session_id']);
        $this->CI->db->delete($this->sess_table_name);
    }

    // Kill the cookie
    setcookie(
            $this->sess_cookie_name,
            addslashes(serialize(array())),
            ($this->now - 31500000),
            $this->cookie_path,
            $this->cookie_domain,
            0
        );

    // Kill session data
    $this->userdata = array();
}