2011-04-19 51 views
1

在我的代碼,我已經註銷功能如下如何在Codeigniter中銷燬所有具有特殊功能的會話?

function logout() 
{ 
    $this->session->sess_destroy(); 

    // but, don't destroy this session 
    $this->session->userdata('admin_id'); 
} 

如何銷燬所有的會話,除了「admin_id」?

+0

如果你想消滅所有會話除了管理員的,或者如果你是我不明白試圖摧毀所有管理員的會話數據,但不是他的ID。 – Matthew 2011-04-20 03:02:14

回答

2

您可能需要暫時保存admin_id,並在銷燬所有會話變量後將其恢復到會話。

$temp = $this->session->userdata('admin_id'); 
$this->session->sess_destroy(); 
$this->session->set_userdata('admin_id', $temp); 
+0

它應該工作,但它不工作,奇怪。 – 2014-05-15 13:05:50

+1

它不工作,因爲會話不會立即銷燬,而是在下次請求時銷燬。 – abimelex 2014-05-16 14:05:03

0

$this->session->sess_destroy();破壞session_id和會話的last_activity。所以會議不再存在。所以這不會工作。

試試這個:

$sess_array = $this->session->all_userdata(); 

foreach($sess_array as $key =>$val){ 

    if($key!='session_id'||$key!='last_activity'||$key!='admin_id'){ 
    $this->session->unset_userdata($key); 
    } 

    } 
+0

它不起作用,因爲你用OR邏輯而不是AND邏輯摧毀所有的鍵 – abimelex 2014-05-16 14:05:44

1

您必須保存一些關鍵的會議上,這裏是正確的代碼。

$sess_array = $this->session->all_userdata(); 
foreach($sess_array as $key =>$val){ 
    if($key!='session_id' 
     && $key!='last_activity' 
     && $key!='ip_address' 
     && $key!='user_agent' 
     && $key!='RESERVER_KEY_HERE')$this->session->unset_userdata($key); 
} 

這會爲你工作:)

+0

哈哈我剛剛看到你也發佈了一個正確的答案。 – abimelex 2014-05-16 14:07:22

3

會話破壞CI在下次請求進行的,所以你不能摧毀一個會話,兩者之間沒有請求打開一個新的會話。

但是您可以取消設置所有會話數據,但您希望保留的數據和數據Codeigniter需要保留會話。這取決於如何配置會話,默認情況下是用戶代理,最後一個活動和會話ID。見CI-Session class首選項(在頁面底部)

此函數刪除除admin_id所有的會話數據

$sessionData = $this->session->all_userdata(); 
foreach($sessionData as $key =>$val){ 
    if($key!='session_id' 
     && $key!='last_activity' 
     && $key!='ip_address' 
     && $key!='user_agent' 
     && $key!='admin_id'){ 
     $this->session->unset_userdata($key); 
    } 
    } 
+0

必須保留session_id,last_activity,ip_address,user_agent鍵才能擁有有效的會話admin_id。 – 2016-05-18 12:07:41