sess_destroy() 无法正常工作

Posted

技术标签:

【中文标题】sess_destroy() 无法正常工作【英文标题】:sess_destroy() doesn't work properly 【发布时间】:2015-04-15 16:59:28 【问题描述】:

我正在尝试在 Codeigniter 中实现注销。这是我正在做的事情:

public function logout() 

        if($this->session->userdata('session_id'))
            $this->session->unset_userdata('logged_in');
            $this->session->unset_userdata('session_id');
            $this->session->unset_userdata('email');
            $this->session->sess_destroy();
            redirect('welcome', 'refresh');
        
    

这里是登录功能:

public function authentication() 
        $this->load->helper('html');
        $this->load->library('javascript');
        $this->load->helper('url');
        $this->load->library('session');
        $this->load->model('Tecnici_Model');
        $this->load->library('encrypt');
        $this->load->library('form_validation');

        $this->form_validation->set_rules('email','Email','required');
        $this->form_validation->set_rules('password','Password','required');
        $email = $this->input->post('email');
        $password = md5($this->input->post('password'));
        $email = mysql_real_escape_string($email);
        $password = mysql_real_escape_string($password);
        $this->db->where('e_mail', $email, TRUE);
        $this->db->where('password', $password, TRUE);
        $query = $this->db->get("tecnici");
        $result = $query->num_rows();

        if($result > 0) 
            $newdata = array(
                   'session_id' => md5(uniqid(rand(), true)),
                   'email'  => $email,
                   'logged_in' => TRUE
            );
            $this->session->set_userdata($newdata);
            redirect('welcome');
         else 
            redirect('tecnici/login');
        
    

身份验证工作正常,因为 session_id 已设置,但是当我单击注销按钮时,它会通过显示空白页面停止注销方法。我在哪里做错了?谢谢!

更新 1 这是 Welcome 控制器的 index() 函数:

public function index() 
        $this->load->helper('html');
        $this->load->library('javascript');
        $this->load->helper('url');
        $this->load->library('session');

        $this->load->view('header');
        $this->load->view('welcome_message');
    

更新 2 我试过@AdrienXL 解决方案:

public function user_logout() 
    $this->session->sess_destroy();
    redirect('welcome');

我已经在“欢迎”视图上打印了会话 ID。当我点击注销按钮时,会话 ID 每次都会更改。我无法解释为什么..

【问题讨论】:

$this->session->unset_userdata('session_id') 返回什么?我认为它可能不会返回任何内容,因此 if 语句中的代码永远不会执行。 我们可以看看你的欢迎控制器的 index() 函数吗? @Faris $this->session->unset_userdata('session_id') 不返回任何内容。 我已经修改了问题 【参考方案1】:

问题是,如果要销毁会话,为什么要测试会话是否已设置? 此外, sess_destroy() 将销毁所有会话,甚至是闪存会话。您无需先取消设置。

一个简单的函数就足够了:

public function logout()

    $this->session->sess_destroy();
    redirect('welcome');

http://www.codeigniter.com/user_guide/libraries/sessions.html

编辑:

我认为您过于关注 session_id。这是来自 CI doc 的引述:

当一个页面被加载时,会话类会检查是否有效 会话数据存在于用户的会话 cookie 中。如果会话数据 不存在的新会话将被创建并保存。

这就是为什么你总是有一个 session_id。在您的情况下,您应该检查是否有一个名为“logged_in”的会话。

【讨论】:

奇怪,它在我的一个项目中运行良好。我可以有更多的细节吗?可能是php错误?

以上是关于sess_destroy() 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

codeigniter 中的注销功能

致命错误:调用未定义的方法 CI_Session::sess_destroy() 1.7.2

我无法安装任何 Bioconductor 软件包:“readRDS(dest) 中的错误:从连接读取错误”

查找文件并更改权限,忽略目录

itext7 pdf与书签合并

继续无法正常工作