Codeigniter 2.1.3:当'sess_use_database'== TRUE时,sess_destroy()会导致未定义索引:session_id等通知

时间:2012-12-07 10:18:49

标签: php codeigniter session

我一直在测试使用数据库的会话的codeigniter功能,当我注销时(使用sess_destroy())我得到以下通知:

            A PHP Error was encountered

            Severity: Notice

            Message: Undefined index: session_id

            Filename: libraries/Session.php

            Line Number: 272
            A PHP Error was encountered

            Severity: Notice

            Message: Undefined index: ip_address

            Filename: libraries/Session.php

            Line Number: 272
            A PHP Error was encountered

            Severity: Notice

            Message: Undefined index: user_agent

            Filename: libraries/Session.php

            Line Number: 272
            A PHP Error was encountered

            Severity: Notice

            Message: Undefined index: last_activity

            Filename: libraries/Session.php

            Line Number: 272
            A PHP Error was encountered

            Severity: Notice

            Message: Undefined index: session_id

            Filename: libraries/Session.php

            Line Number: 288
            A PHP Error was encountered

            Severity: Notice

            Message: Undefined index: last_activity

            Filename: libraries/Session.php

            Line Number: 289

我需要做些什么来解决这个问题? (我知道我可以关闭错误报告等,但我更感兴趣的是为什么会发生这种情况以及如何解决它。)

我用它来创建表格:

                CREATE TABLE IF NOT EXISTS  `ci_sessions` (
                        session_id varchar(40) DEFAULT '0' NOT NULL,
                        ip_address varchar(45) DEFAULT '0' NOT NULL,
                        user_agent varchar(120) NOT NULL,
                        last_activity int(10) unsigned DEFAULT 0 NOT NULL,
                        user_data text NOT NULL,
                        PRIMARY KEY (session_id),
                        KEY `last_activity_idx` (`last_activity`)
                );

会话库自动加载。

5 个答案:

答案 0 :(得分:31)

这导致了您的问题,发布了2.1.3:

  

修正了一个错误(#1314) - 会话库方法sess_destroy()没有销毁userdata数组。

$ this-> tank_auth-> logout()包含函数sess_destroy(); 所以在你调用它之后,你不能在$ this-> _show_message()中使用set_flashdata()。

您需要做的是创建一个新会话。这是你的注销方法在auth.php中的样子:

/**
 * Logout user
 *
 * @return void
 */
function logout() {
    $this->tank_auth->logout(); // Destroys session
    $this->session->sess_create();
    $this->_show_message($this->lang->line('auth_message_logged_out'));
}

答案 1 :(得分:3)

只是为Ben的回答添加快速说明。他在识别问题时是正确的,但我发现,由于操作的顺序,在Tank_auth库中添加创建会话行更有效。

以下是Tank_auth.php库中修订的logout()函数:

    /**
 * Logout user from the site
 *
 * @return  void
 */
function logout()
{
    $this->delete_autologin();

    // See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line
    $this->ci->session->set_userdata(array('user_id' => '', 'username' => '', 'status' => ''));

    $this->ci->session->sess_destroy();
    $this->ci->session->sess_create();
}

答案 2 :(得分:0)

检查您的application/config/config.php文件,看看您是否有$config[‘sess_use_database’] = TRUE

答案 3 :(得分:0)

我猜,刷新就是你所缺少的。 您是否尝试过重定向('注销','刷新');

答案 4 :(得分:0)

对于扎克: 由于您正在使用Tank auth,请确保您的注销功能是这样的: -

    function logout(){
        if ($this->tank_auth->is_logged_in()) {
            $this->tank_auth->logout();

            redirect('');           

        } 
    }

您还可以自动加载最常用的帮助程序和库:

$autoload['libraries'] = array('database','session','form_validation','pagination');
$autoload['helper'] = array('form','url','html');

您的配置似乎没问题,可能您正在尝试退出两次。如果仍有问题,请显示您的退出代码。