sess_destroy()无法正常工作

时间:2015-02-14 20:47:00

标签: php codeigniter session-variables logout


我试图在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每次都会改变。我无法解释原因..

1 个答案:

答案 0 :(得分:1)

问题是,如果您要破坏会话,为什么要测试会话是否已设置? 此外,sess_destroy()将销毁所有会话,甚至是flash会话。你不需要先取消它们。

一个简单的功能就足够了:

public function logout()
{
    $this->session->sess_destroy();
    redirect('welcome');
}

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

编辑:

我认为你太专注于session_id了。以下是CI文档的引用:

  

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

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