php
  • codeigniter
  • session
  • 2010-07-14 58 views 1 likes 
    1

    我試圖爲構建在CodeIgniter上的網站創建通用頭,並且我無法找出將切換「登錄」鏈接的代碼。用戶名(帶有鏈接到個人資料頁)在用戶登錄後如何用CodeIgniter中的用戶名替換「登錄」按鈕

    在控制器的功能,我試過下面的代碼:

    if(!$this->session->userdata($userSessionVar)) 
        { 
         $data['header_output'] = "<li><a href='" . base_url() . "index.php/main/login'>Login</a></li>"; 
        } else 
        { 
         $data['header_output'] = $this->session->data('userFirstName'); 
        } 
    

    (我意識到這是不完整的,基於在我的設計上,但它只是爲了測試。)$ userSessionVar在登錄後保存值「登錄」。可能不是最好的方式來做到這一點。這似乎並沒有工作(我將$數據傳遞給視圖)。我也試着做一個自定義函數:

    function check_login() 
    { 
    $CI =& get_instance(); 
    
    $userSessionVar = 'logged_in'; 
    
    if(! $CI->session->userdata($userSessionVar)) 
    { 
        return false; 
    } return true; 
    } 
    

    然後使用真/假返回結構$ header_output變量。這些似乎都不起作用。我是CodeIgniter的新手,擁有一些PHP/HTML/CSS的中級水平等等。我確信我錯過了一些明顯的東西,並希望得到任何幫助,並且瞭解如何避免包含代碼在每一個控制器功能。

    回答

    1

    變量$userSessionVar僅在函數check_login()中可用,所以當您嘗試在函數外部使用它時,它將爲空白(因此無用)。

    我建議您只需使用$this->session->userdata('logged_in')$CI->session->userdata('logged_in')而不是使用變量$userSessionVar來存儲似乎是一個常數值。

    此外,您的代碼中有錯誤。您需要將$this->session->data('userFirstName')替換爲$this->session->userdata('userFirstName')

    以下是我通常處理用戶數據的方式。首先,將auth.php添加到models文件夾中:

    <?php 
    
    class Auth extends Model { 
        private $user_data = false; 
        function Auth() { 
         parent::Model(); 
    
         if ($this->input->post('action') == 'login') $this->login(); 
         else if ($auth_id = $this->session->userdata('auth_id')) { 
          $user = // load user data from the database into the variable $user 
          if ($user) { 
           $this->user_data = $user; 
          } else $this->session->unset_userdata('auth_id'); 
         } 
        } 
        function login() { 
         // process POST, check with database, and then store user_id using 
         // $this->session->set_userdata('auth_id', $user_id_here) 
        } 
        function me() { 
         return $this->user_data? (object)$this->user_data : false; 
        } 
    } 
    
    ?> 
    

    然後,自動加載模型。要做到這一點,編輯的config/autoload.php像這樣:

    $autoload['model'] = array('auth'); 
    

    現在你的IF語句看起來是這樣的:

    if ($me = $this->me()) $data['header_output'] = $me->userFirstName; 
    else $data['header_output'] = '<li><a href="'.base_url().'index.php/main/login">Login</a></li>'; 
    
    +0

    感謝您的快速響應。我試圖讓我的頭腦 - 每次用戶訪問一個新頁面時,$用戶是否會被重置,或者只有一次,並且它會在整個用戶會話中持續?與將所有用戶數據加載到會話中相比,這有什麼優勢? – tchaymore 2010-07-14 19:25:02

    +0

    @tchaymore:是的,我在每次加載頁面時都會從數據庫中重新加載用戶數據。與您將要運行的所有其他數據庫查詢相比,這通常是微不足道的。主要優點是,如果用戶的信息/權限(可以由其他用戶設置)在請求之間改變,$ this-> auth-> me()將始終返回新的數據。您存儲在會話中的任何數據都可能過時。此外,保持會話數據很小是個好主意,尤其是在數據存儲在cookie中的情況下。在小型網站上,這個論點可能並不具有說服力,但無論如何,它使代碼更簡單。 – 2010-07-14 19:41:22

    +0

    感謝您的解釋。但是,該代碼爲「private $ user_data = false;」提供了「解析錯誤:語法錯誤,意外的T_PRIVATE」線。 – tchaymore 2010-07-14 22:37:52

    0

    在模型中auth.php你有陳述

    class Auth extends Model and parent :: Model();

    有了CodeIgniter,它們應該不是「CI_Model」嗎?

    相關問題