Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Codeigniter会话在登录时清除_Codeigniter_Session - Fatal编程技术网

Codeigniter会话在登录时清除

Codeigniter会话在登录时清除,codeigniter,session,Codeigniter,Session,我在会话中保存匿名用户的首选项。问题是,当用户登录时,我必须清除以前的会话并启动新会话(出于安全原因) 似乎若我破坏了会话,那个么登录函数就会注销!即使我在sess\u destroy之后使用set\u userdata,它也无法登录(可能销毁后的会话变得不可用)。 使用unset仅对少数指定会话起作用。是否有任何方法可以清除用户的所有会话而不出现此类问题 public function login() { if($this->session->userdata('id'))

我在会话中保存匿名用户的首选项。问题是,当用户登录时,我必须清除以前的会话并启动新会话(出于安全原因)

似乎若我破坏了会话,那个么登录函数就会注销!即使我在
sess\u destroy
之后使用
set\u userdata
,它也无法登录(可能销毁后的会话变得不可用)。 使用
unset
仅对少数指定会话起作用。是否有任何方法可以清除用户的所有会话而不出现此类问题

public function login()
{
    if($this->session->userdata('id'))
        redirect($this->config->base_url());
    if($_POST)
    {
        ...
        $user=...
        if($user)
        {
            $this->session->sess_destroy();
            $this->session->set_userdata('id',$user['id']);
            ....
        }
        else
        {
            ....    
        }
    }
    $this->load->view('...');
}

运行
sess\u destroy()
后,尝试重新初始化会话库

更新:

CI似乎没有本机函数来清除会话,而不会在脚本运行时的其余时间损坏会话

然而,寻找根本原因取得了成功


不要使用sess_destroy,除非您计划在同一url上再次重定向回。 只用

$this->session->set_userdata('id','')

或者,您可以为要销毁的会话创建一个
数组
,并在其值上添加一个空样本

$test = array('session_id'=>'','session_id2'=>'');
$this->session->set_userdata($test);
这将使会话名为
session\u id
session\u id 2
NULL
FALSE


因为当您调用
sess\u destroy()
时,它会销毁应用程序正在使用的所有
会话。即使您尝试在调用后添加另一个会话,它也不会添加,因为没有活动会话,这就是它无法工作的原因。多次尝试,只有在刷新或重定向回控制器/方法以便创建新会话时,它才会起作用。CI中的会话就是这样工作的,如果我错了,我不知道如何纠正我。

这没有帮助。顺便说一句,库是在构造函数中加载的。有你想要的答案。@MaximKumpan,很好,请将此链接作为答案发布。严格来说,这似乎不是重复的,所以我将该答案的摘录发布在下面。不过,一定要试着更彻底地研究一下你们的问题,一个简单的重新措辞就可以了。真的!但是如果我有很多项目要取消设置,并且在开发过程中我增加了更多的会话项目,那么我如何保证所有项目都会被清除呢。在这里,您只需清除
session\u id
。但是如果会话包括
语言
权限
和其他选项,我不希望它们与经过身份验证的用户混合在一起,该怎么办呢。有没有办法清除CI中会话的所有内容?
function unset_only() {
    $user_data = $this->session->all_userdata();

    foreach ($user_data as $key => $value) {
        if ($key != 'session_id' && $key != 'ip_address' && $key != 'user_agent' && $key != 'last_activity') {
            $this->session->unset_userdata($key);
        }
    }
}
$test = array('session_id'=>'','session_id2'=>'');
$this->session->set_userdata($test);