我遇到了同样的问题并解决了问题。如果您将会话存储在数据库中,它将不起作用。
Tank Auth 从主库 ($this->tank_auth->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();
然后它从身份验证控制器 ($this->_show_message()) 运行此代码:
$this->session->set_flashdata('message', $message);
redirect('/auth/');
问题是由于sess_destroy()在设置flashdata之前运行,没有数据库行可以添加flashdata,所以flashdata永远不会被设置。
此时有几个解决方案:
选项 1:
在application/libraries/Tank_auth.php中的函数logout()中的$this->ci->session->sess_destroy();之后立即添加$this->ci->session->sess_create();
这是有效的,因为您正在创建一个可以存储 flashdata 的新空白会话。这样做的一个潜在缺点是您正在对数据库执行更多操作(删除+插入)。
选项 2:
注释掉/删除函数$this->ci->session->sess_destroy();中的logout()application/libraries/Tank_auth.php
这是因为会话没有被破坏,允许 CI 只执行更新查询来添加 flashdata。除非您绝对需要销毁会话,否则这可能比选项 1 更好。
选项 3:
将$config['sess_use_database'] 设置为FALSE。
之所以有效,是因为会话在再次请求时会自动创建,而不是在您将会话存储在数据库中时它的工作方式。可能不太安全。
最终,由您决定哪个选项最适合您的应用程序。