2013-08-27 38 views
0

我正在使用codeigniter,並且我有3個控制器,我使用會話來存儲第一個控制器的用戶名,我使用此從其他控制器確定是否有人登錄。無法使用會話變量

這裏是第一控制器的構造函數,在這個階層,我也用在這裏我提供一個價值$_SESSION['username']的語句,以便其他控制器使用它:

class Login extends CI_Controller { 

public function __construct() 
{ 
    session_start(); 
    parent::__construct(); 

} 

public function index() 
{ 

    $this->load->library('form_validation'); 
    $this->form_validation->set_rules('username', 'Username'); 
    $this->form_validation->set_rules('password', 'Password', 'required|min_length[4]'); 

    if ($this->form_validation->run() !== false) { 
    // then validation passed. Get from db 
    $this->load->model('Login_Model'); 
    $res = $this->Login_Model->verify_user(
       $this->input->post('userName'), 
       $this->input->post('password') 
      ); 

    if ($res !== false) { 
     $tempuser = $this->input->post('username'); 
     $_SESSION['username'] = $tempuser; 
     redirect(base_url()); 
    } 

    } 

    $this->load->view('login_view'); 
} 

這是第二控制器,在他的構造,我創建了一個條件語句,以確定是否有人登錄,我測試了這一點,它仍然可以:

class Pagination extends CI_Controller { 

public function __construct() { 
    parent:: __construct(); 
    $this->load->helper("url"); 
     session_start(); 
     if(!isset($_SESSION['username'])){ 
      redirect(base_url().'index.php/login'); 
     } 

} 

在第三控制器,這是我遇到的問題,我無法訪問其中i存儲的用戶名變量,這裏是代碼:

class Blood_Controller extends CI_Controller { 

public function __construct() 
{ 
     session_start(); 
    parent::__construct(); 

    if(!isset($_SESSION['username'])){ 
     redirect(base_url().'index.php/login'); 
    } 
} 

它總是走在if語句內連如果我在第一個控制器上輸入右用戶名。 任何人都可以幫忙嗎?

+0

你在哪裏寫'用戶名'的會話?當某個用戶使用正確的用戶名和密碼登錄時,第一個控制器上的 –

+0

。 – egt1993

+0

你應該粘貼該代碼以及 – Paddyd

回答

0

檢查會話是否已經存在總是個好主意。

嘗試:

if (!session_id()) 
    session_start(); 

並嘗試的var_dump($ _ SESSION);在session_start()之後的第三個控制器中檢查內部是什麼。

0

需要在此情況下使用$ _SESSION數組來設置會話數據,而不是CI會話庫ie。替換$this->session->set_userdata('username', $tempuser);$_SESSION['username'] = $tempuser

+0

我已經這樣做了,但它沒有修復它。 – egt1993

+1

您是否嘗試從控制器中刪除所有'session_start()'並在主(CI根)index.php文件的頂部添加一次? – Vadim

+0

我只是試了一下,它沒有工作,第二個控制器也無法訪問它。 – egt1993

0

刪除所有session_start();並將其設置在配置 - > autoload.php

變化「!==「爲」!=」,並檢查會話變量值

+0

我沒有問題,因爲$ _SESSION ['用戶名']仍然可以在第二個控制器內訪問。問題是,當我在第三個控制器上使用它時,$ _SESSION ['username']沒有任何值 – egt1993

+0

ok,你說你在第一個控制器中有$ _SESSION ['username']的值,你是否在外面回顯它if語句int在第三個控制器 –

+0

是的,但沒有什麼是他們什麼都沒有。當我在第二個控制器上嘗試它時。它有一個值 – egt1993

1

負載這個「$這 - >負載>庫(‘會話’); 「在構造函數即這裏

public function __construct() 
{ 
    session_start(); 
    parent::__construct(); 

} 

並刪除在session_start(),並使用

`$this->session->set_userdata('username', $tempuser);` 
0

你可以在你的控制器構造函數初始化session類,使用$這 - >負載>庫函數:

$this->load->library('session'); 

在不需要笨來使用session_start()

ONC如果你不想在每個控制器構造函數中手動初始化Session類,那麼你可以從你的自動加載它應用/配置/自動加載。PHP文件,只是在$自動加載[「圖書館」]數組添加會話類名是這樣的:

$autoload['libraries'] = array('database', 'form_validation', 'session'); 

現在你可以設置你的會話數據像這樣:

$this->session->set_userdata('user_name', $user_name); 

而且你可以檢索你的會話數據像這樣:

$user_name = $this->session->userdata('user_name'); 

去這裏瞭解更多關於CI會話:http://ellislab.com/codeigniter/user-guide/libraries/sessions.html