2012-02-14 69 views
1

這段代碼有什麼問題?CodeIgniter奇怪的行爲與sess_destroy

會話變量「user」具有用戶登錄的ID。它在登錄過程中設置。

$this->session->set_userdata("user",$user->id); 

此代碼總是顯示錯誤頁面並執行會話銷燬!!!爲什麼?

if (!$this->session->userdata("user")) 
{ 
    $error = "User do logout without been logged [" . $_SERVER['REMOTE_ADDR'] ."]" ; 
    log_message('error', $error); 
    show_error($error); 
} 
else 
{ 
    $this->session->sess_destroy(); 
} 

如果我評論$這個 - >會話級> sess_destroy()它的工作原理,會話沒有破壞,且未顯示錯誤

+0

嘗試將CI會話庫用於在線聊天應用程序時,我發現意外的行爲。我終於切換到使用本機PHP會話。我懷疑你發現了這樣的錯誤。接得好;它可能會提供一些有用的見解。 – 2012-04-04 15:10:39

回答

1

你的函數說:「如果用戶不登錄後,顯示錯誤消息並記錄錯誤,否則使用sess_destroy()登錄用戶「

因此,如果您訪問該頁面但未登錄,則會看到該錯誤。如果您訪問該頁面,並且您已登錄,則該函數會調用sess_destroy並將您註銷。


說明:您的代碼只允許1個用戶狀態:註銷 - 這是頁面上任何輸出的唯一方式。如果有人登錄訪問該頁面,則會立即註銷。

if($this->session->userdata('email')){ 
    //the user is logged in 
    echo "HELLO USER, YOU ARE LOGGED IN!"; 
}else{ 
    //you don't need session_destroy because 
    //they won't get here with a session to be destroyed 
    redirect('/home'); 
} 

進一步澄清:我測試了這對全新安裝笨的,它表現爲我解釋。

修改默認的歡迎控制器,以節省時間:當你訪問它設置會話數據的歡迎/指數

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Welcome extends CI_Controller { 

    function __construct() 
    { 
     parent::__construct(); 
     $this->load->library('session'); 

    } 

    function index() 
    { 

     $this->session->set_userdata("user","1234"); 
     echo "userdata set to: ".$this->session->userdata("user"). "<br>"; 
     echo "<a href='welcome/checksess'>check session</a>"; 
    } 

    function checksess() 
    { 


     if (!$this->session->userdata("user")) 
     { 
      $error = "User do logout without been logged [" . $_SERVER['REMOTE_ADDR'] ."]" ; 
      log_message('error', $error); 
      show_error($error); 
     } 
     else 
     { 
      echo "userdata: ".$this->session->userdata("user"). " about to be destroyed with sess_destroy<br>"; 
      $this->session->sess_destroy(); 
      echo "<a href='checksess'>check session again after sess_destroy (refresh this page)</a>"; 
     } 
    } 
} 

/* End of file welcome.php */ 
/* Location: ./application/controllers/welcome.php */ 

。當你點擊checksess鏈接時,檢查echo的userdata然後調用sess_destroy。現在,如果刷新checksess,userdata未設置(因爲sess_destroy),並且您看到錯誤「User do logout without logged ...」

您提供的代碼中沒有任何內容可以解釋您遇到的行爲。

+0

不,這將是正確的行爲...如果我登錄,我訪問該頁面,我得到的錯誤和會話銷燬。這就像執行兩次頁面一樣。我不知道爲什麼,但發生了...... – alasarr 2012-02-14 17:06:56

+0

不,它不會。我用一個例子更新了答案..但缺點是您的代碼只允許用戶註銷。 – stormdrain 2012-02-14 18:31:46

+0

我知道......這很奇怪,但是這種情況我已經深深地做了測試。我的步驟是1)登錄2)啓動用戶頁面3)註銷4)我得到錯誤日誌,會話被破壞(我知道會話被破壞,因爲我可以在CI分析器上看到它,我看不到步驟2 – alasarr 2012-02-14 19:20:18