【问题标题】:unable destroy session in codeigniter无法在 codeigniter 中销毁会话
【发布时间】:2012-02-23 22:29:23
【问题描述】:

我要实现的是一个简单的登录页面,如果用户登录成功,则重定向到主页,否则保持登录页面。

我有 1 个名为 login, 的控制器和 1 个名为 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。我的代码有问题吗?

【问题讨论】:

  • $this-&gt;session-&gt;sess_destroy(); 应该是最后一个被调用的。此外,最好只从 model_login 类调用 $this-&gt;session 函数。要仅删除一个变量,请选择 unset_userdata,您在 Login::logout 中调用 set_userdata 可能会做一些奇怪的事情。
  • 感谢您的回复。我已将所有与会话相关的操作移至 model_login,并且我还在 model_login 中添加了 2 个函数,即 set_login_session(用于设置会话数据)和注销(用于取消设置会话数据)。但是,问题仍然存在:(
  • 错字:CI_MOdel{... 应该是:CI_Model{...
  • 是的,我改为“模型”,但它不起作用。我目前的解决方案是使用 php $_SESSION 而不是使用 CI 会话,它可以工作。

标签: php codeigniter session login


【解决方案1】:

在您的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;

几年前这给了我一些问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多