2012-02-01 118 views
4

我想實現的是一個簡單的登錄頁面,如果用戶登錄成功,然後重定向到主頁面,否則保持登錄頁面。無法破壞codeigniter中的會話

我有一個名爲login,的控制器和一個名爲main的型號。 當用戶點擊登錄按鈕時,login/login_send將被調用。

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

class Login extends CI_Controller{ 

function __construct() { 
    parent::__construct(); 
    $this->load->model('model_login'); 
} 

function index() 
{ 
    if ($this->model_login->is_logged_in()) 
    { 
     redirect('main'); 
    } 
    else 
    { 
     // load login page 
     $data['main'] = 'view_login'; 
     $data['style'] = 'style_login'; 
     $this->load->view('template', $data);   
    } 
} 

function login_send() 
{ 
    $this->form_validation->set_rules('username', 'Username', 'trim|required'); 
    $this->form_validation->set_rules('password', 'Password', 'trim|required'); 

    if ($this->form_validation->run() == FALSE) 
    { 
     $this->index(); 
    } 
    else 
    { 
     if ($this->model_login->validate_user()) 
     { 
      $user_session_data = array(
       'username' => $this->input->post('username'), 
       'is_logged_in' => 1 
      ); 
      $this->session->set_userdata($user_session_data);  
      redirect('main'); 
     } 
     else 
     { 
      redirect('login'); 
     } 
    }  
}// end function login_send 

function logout() 
{ 
    if ($this->model_login->is_logged_in()) 
    { 
     $this->session->sess_destroy(); 
     $this->session->set_userdata(array('username' => '', 'is_logged_in' => 0)); 
     log_message('debug', 'Some variable was correctly set'); 
    } 
    redirect('login','refresh'); 
} 

}// end class Login 
?> 

Model_login這裏只是幫助,以驗證是否用戶登錄,通過檢查會話數據。

<?php 
class Model_login extends CI_MOdel{ 

function _isUserExist($username, $password) 
{ 
    $options = array(
     'UserName' => $username, 
     'Password' => $password 
    ); 
    $query = $this->db->get_where('userinfo', $options); 
    return $query->num_rows() > 0; 
} 

function validate_user() 
{ 
    $username = $this->input->post('username'); 
    $password = $this->input->post('password'); 

    return ($this->_isUserExist($username, $password)); 
} 

function is_logged_in() 
{ 
    $is_logged_in = $this->session->userdata('is_logged_in'); 

    if (!isset($is_logged_in) || $is_logged_in != 1) return FALSE; 
    else return TRUE; 
} 
}// end class model_login 
?> 

當第一次登錄,然後註銷,沒有問題。但是,如果我第二次登錄,則無法註銷。即使登錄/註銷被調用正確,我也刷新了頁面,但session['is_logged_in'] == 1。我的代碼有問題嗎?

+1

'$這個 - >會話級> sess_destroy();'應是最後一個叫。另外,最好只從model_login類調用'$ this-> session'函數。要只刪除一個變量,選擇'unset_userdata',你在Login :: logout中對'set_userdata'的調用可能會做很奇怪的事情。 – 2012-02-01 08:01:19

+0

感謝您的回覆。我已將所有會話相關操作移至model_login,並且還向model_login添加了2個函數,即set_login_session(用於設置會話數據)和註銷(用於取消設置會話數據)。然而,問題仍然存在:( – qkzhu 2012-02-01 14:27:31

+0

Typo:CI_MOdel {...應該是:CI_Model {... – hypervisor666 2012-02-18 07:51:22

回答

9

在你application/config/config.php嘗試改變

$config['sess_time_to_update'] = 300; //This is the default setting in ver 2.1.1 

$config['sess_time_to_update'] = 0; 

這給了我一些問題,幾年前