3

我一直在使用数据库的会话测试 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`)
                );

会话库是自动加载的。

4

5 回答 5

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'));
}
于 2012-12-14T13:28:14.127 回答
3

只是为 Ben 的回答添加一个简短的注释。他对问题的识别是正确的,但我发现,由于操作的顺序,在 Tank_auth 库中添加 create session 行更有效。

这是 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();
}
于 2014-04-16T21:53:04.070 回答
0

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

于 2012-12-07T10:22:20.937 回答
0

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

于 2012-12-12T09:48:16.473 回答
0

对于 Zach:由于您使用的是 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');

您的配置似乎很好,可能是您尝试注销两次。如果仍然存在问题,请显示您的注销代码。

于 2012-12-12T14:30:24.903 回答