2013-02-11 19 views
0

嘿傢伙幫我從所有頁面註銷..當我點擊註銷鏈接時,我只從一個頁面,當我試圖從其他頁面註銷它不工作。 。我cpntoller代碼: -如何從codeigniter中的所有視圖註銷,我使用錯誤的代碼?

function index() 
    { 
     if($this->session->userdata('logged_in')) 
     { 
      $session_data = $this->session->userdata('logged_in'); 
      $data['email'] = $session_data['email']; 
      $this->load->view('home_view', $data); 
      $this->load->view('home_content_view', $data); 
     } 
     else 
     { 
      //If no session, redirect to login page 
      redirect('login', 'refresh'); 
     } 
    } 

    function logout() 
    { 
     $this->session->unset_userdata('logged_in'); 
     session_destroy(); 
     redirect('home', 'refresh'); 
    } 

回答

0

下面放方法在每個控制器的構造__construct

我假設你已經登錄的用戶控制器指數功能

if (FALSE !== $this->session->userdata('logged_in')) { 
     redirect('/user'); 
    } 
+0

其無法正常工作@diEcho – Jay 2013-02-11 05:36:21

+0

我想,所有pages..its註銷功能只工作在一個頁面工作,而不是所有 – Jay 2013-02-11 05:43:20

+0

所以你把上面的代碼在'註銷按鈕function' – diEcho 2013-02-11 05:55:03

0

方法當用戶點擊退出按鈕CAL將去控制器文件註銷功能。

在該功能

public function logout() { 
     $this->session->session_destroy(); 
     redirect("home"); 
} 
+0

我想,註銷功能工作從所有頁面..只能從一個頁面工作,而不是從全部工作 – Jay 2013-02-11 05:40:34

+0

您的應用程序中有多少個控制器已完全在您的應用程序中並且在您調用功能後轉到您的會話仍然有效的頁面,並找到會話數據並打印它 – 2013-02-11 05:42:53

1

首先的笨不列入使用PHP的本地會話所以session_destroy將無法正常工作使用$this->session->sess_destroy()代替。在每個控制器的構造函數中(如果您有多個控制器)。檢查用戶會話是否不存在,然後將用戶重定向到要顯示的頁面。

class Home extends CI_Controller 
{ 
    function __construct() 
    { 
     parent::__construct(); 
     //this condition checks the existence of session if user is not accessing 
     //login method as it can be accessed without user session 
     if(!$this->session->userdata('logged_in') && $this->router->method != 'login') { 
      redirect('login'); 
     } 
    } 
    function index() 
    { 
     $session_data = $this->session->userdata('logged_in'); 
     $data['email'] = $session_data['email']; 
     $this->load->view('home_view', $data); 
     $this->load->view('home_content_view', $data); 
    } 

    function logout() 
    { 
     $this->session->userdata = array(); 
     $this->session->sess_destroy(); 
     redirect('home', 'refresh'); 
    } 
} 
+2

+ 1如果OP的所有控制器都繼承自共同的'MY_Controller'基類,則可以實現更高級別的會話控制。如果會話檢查是在這個基礎控制器的構造函數中實現的,那麼他們可以通過一次調用完成它:)請參閱[我的前一個答案](http://stackoverflow.com/a/12486869/568884 )。 – 2013-02-11 06:23:02

+0

是的,你是對的... codeigniter也支持鉤子,你也可以使用鉤子管理事物。 – 2013-02-11 06:26:00

+0

傢伙從它只有一個頁面的工作,,不是所有 – Jay 2013-02-11 07:12:57

0

嘗試這個

function logout() 
     { 
      $this->session->unset_userdata($session_data); 
      $this->session->sess_destroy(); 
      redirect('home', 'refresh'); 
     } 
1

我建議你閱讀有關CI中的_remap()函數。我通常的登錄/註銷要做的是覆蓋在我的自定義控制器,擴展是CI_Controller重映射和不喜歡:

function _remap($method) 
{ 
    if (method_exists($this, $method) && $this-my_custom_helper->is_logged_in()) 
    { 
     $this->$method(); 
    } 
    else 
    { 
     redirect('/auth/login/'); 
    } 
} 

這樣,你不需要檢查的loggedIn每個控制器。另一個有用的方法是在每個控制器中的操作之前執行一個之前/之後的過濾器。我不會詳細介紹,但你可以通過Jamie Rumbelow發現的here查看MY_Controller。你可以從他的代碼中採用一些很好的技術。 祝你好運!

相關問題