Php 销毁会话但保留flashdata

Php 销毁会话但保留flashdata,php,session,codeigniter,tankauth,Php,Session,Codeigniter,Tankauth,我在我的CI 1.7.3应用程序中用于用户管理。一切正常,但我正在尝试设置用户注销时显示的flash_消息。问题是$this->tank_auth->logout()函数销毁会话。我已将Tank Auth库中的注销函数修改为: function logout() { $this->delete_autologin(); // See http://codeigniter.com/forums/viewreply/662369/ as the r

我在我的CI 1.7.3应用程序中用于用户管理。一切正常,但我正在尝试设置用户注销时显示的
flash_消息。问题是
$this->tank_auth->logout()函数销毁会话。我已将Tank Auth库中的注销函数修改为:

    function logout()   {
        $this->delete_autologin();

        // See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line
        $user_session_data = array('user_id' => '', 'username' => '', 'status' => '');
        $this->ci->session->set_userdata($user_session_data);
        $this->ci->session->unset_userdata($user_session_data);
    }
以前是

function logout()
        {
            $this->delete_autologin();

            // See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line
            $this->ci->session->set_userdata(array('user_id' => '', 'username' => '', 'status' => ''));

            $this->ci->session->sess_destroy();
        }
我的控制器里有

function logout(){
    if ($this->tank_auth->is_logged_in()) { // logged in
        $this->session->set_flashdata('status_message', $this->lang->line('auth_message_logged_out'));
        $this->tank_auth->logout();

        redirect('');           

    } 
}


如果我删除
$this->tank_auth->logout()功能消息显示正常。我敢肯定这是一个简单的会话问题

虽然这是一个解决方法,但它可能会为您带来好处

无论您在何处显示这些,我都假设您正在查看视图,以便

<? if ($this->session->flashdata('status_messege'): ?>

    <p><?= $this->session->flashdata('status_message') ?></p>

<? endif; ?>
sess_destroy()
函数也会销毁用于传递消息的会话闪存变量

您已经回答了您的问题,在库
logout()
函数中,您需要替换

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


这不会完全破坏会话,只会破坏用于登录的用户数据,因此我建议改为修改控制器中的
logout()
函数,并通过将消息传递给视图手动显示消息。

如果在调用
sess\u destroy()
后在同一请求中使用数据库时尝试设置flashdata,它不会工作(因为没有可附加flashdata的会话)

要解决此问题,请添加
$this->ci->session->sess_create()sess\u destroy()
后的code>。这是因为您在尝试向会话添加数据之前正在创建会话。如果在数据库中使用会话,这是在执行
sess\u destroy()
后使用flashdata的唯一方法

$this->ci->session->sess_destroy();
$this->ci->session->unset_userdata(array('user_id' => '', 'username' => '', 'status' => ''));