我在CI 1.7.3 App中使用Tank Auth进行用户管理。一切正常,但我试图在用户注销时设置flash_message
。问题是$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();
功能,则消息显示正常。我确定这是一个简单的会话问题
答案 0 :(得分:7)
如果在调用sess_destroy()
后尝试在同一请求中使用数据库时尝试设置flashdata,则无效(因为没有会话要将flashdata附加到)。
要解决此问题,请在致电$this->ci->session->sess_create();
后添加sess_destroy()
。这是有效的,因为您在尝试向其追加数据之前重新创建会话。如果您在数据库中使用会话,这是在sess_destroy()
之后使用flashdata的唯一方法。
答案 1 :(得分:2)
sess_destroy()
函数还会破坏用于传递消息的会话flash变量。
你已经回答了你的问题,在库logout()
功能中,你需要替换
$this->ci->session->sess_destroy();
带
$this->ci->session->unset_userdata(array('user_id' => '', 'username' => '', 'status' => ''));
这不会完全破坏会话,只会破坏用于登录的用户数据,因此我建议修改控制器中的logout()
功能,并通过将其传递给视图来手动显示消息。 / p>
答案 2 :(得分:1)
虽然这是一种解决方法,但它可能会为您解决问题......
无论你在哪里展示这些,我都会假设你正在查看视图......
<? if ($this->session->flashdata('status_messege'): ?>
<p><?= $this->session->flashdata('status_message') ?></p>
<? endif; ?>
你 COULD 为其添加一个elseif并检查引荐来源是你的退出功能...
<? if ($this->session->flashdata('status_messege'): ?>
<p><?= $this->session->flashdata('status_message') ?></p>
<? else if ($this->agent->referrer() == site_url('path/to/logout'): ?>
<p><?= $this->lang->line('auth_message_logged_out') ?></p>
<? endif; ?>
克服这个问题的一种骇人的方式,但可能仍然是一种方式。