2016-02-04 75 views
2

我想寫一個函數來殺死我的用戶會話,如果他們在數據庫中的狀態(對於公司或用戶)更改爲false(此工作正常)。codeigniter殺會話,但在重定向時使用flashdata

不幸的是,codeigniter在殺死會話後不會輕易讓set_flashdata。我無法解決如何重新初始化新會話,以便將重定向的flash數據存儲到登錄頁面(並告訴用戶它們爲什麼被引導出來)。

在這裏搜索和谷歌沒有真正提供任何關於重新創建會話使用。我用笨3.0.3

助手代碼:

function user_active($username) 
{ 
    $CI =& get_instance(); 
    $CI->load->database(); 

    $CI->db->where('username', $username); 
    $CI->db->from('users'); 
    $CI->db->join('company', 'company.orgID = users.orgID'); 

    $query = $CI->db->get(); 

    $result = $query->row_array(); 

    // check company active 
    if($result['orgStatus'] != TRUE){ 
     $CI->session->sess_destroy(); 
     $CI->session->set_flashdata('flashError', 'Company currently disabled please contact accounts for reactivation'); 
     redirect(site_url(), 'refresh'); 
    } 
    // check user active 
    if($result['status'] != TRUE) { 
     $CI->session->sess_destroy(); 
     $CI->session->set_flashdata('flashError', 'User not active, please contact your administrator'); 
     redirect(site_url(), 'refresh'); 
    } 
} 
+0

您必須通過數據庫驗證每個請求。意思是在每個請求上都做這件事。 –

+0

這與我的問題無關? –

+0

對我而言,沒有。對於這種事情,我所做的是創建一個擴展CI_Controller的主控制器。然後每個控制器都必須擴展您創建的主控制器。在主控制器的構造函數中,調用你的當前函數。對我而言,這是我做過的最好的方式。 –

回答

1

按照codeignitier的文檔,

所有會話數據(包括flashdata和TempData的)將被永久破壞 和之後同樣要求 中的功能將不可用破壞會話。

所以我建議您刪除除重要的會話數據之外的所有會話數據。

$user_data = $this->session->userdata(); 
foreach ($user_data as $key => $value) { 
    if ($key!='__ci_last_regenerate' && $key != '__ci_vars') 
     $this->session->unset_userdata($key); 
} 
+0

非常感謝!這正是我需要的! –

1

別毀了會議。使用unset_userdata()來取消您的不需要的會話。 $this->session->unset_userdata('session_name');它可以解決你的問題。有關其他服務器的請求,你可以使用$this->session->keep_flashdata('session_name')