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
。我的代碼有問題嗎?
'$這個 - >會話級> sess_destroy();'應是最後一個叫。另外,最好只從model_login類調用'$ this-> session'函數。要只刪除一個變量,選擇'unset_userdata',你在Login :: logout中對'set_userdata'的調用可能會做很奇怪的事情。 – 2012-02-01 08:01:19
感謝您的回覆。我已將所有會話相關操作移至model_login,並且還向model_login添加了2個函數,即set_login_session(用於設置會話數據)和註銷(用於取消設置會話數據)。然而,問題仍然存在:( – qkzhu 2012-02-01 14:27:31
Typo:CI_MOdel {...應該是:CI_Model {... – hypervisor666 2012-02-18 07:51:22