CodeIgniter与sess_destroy的奇怪行为

时间:2012-02-14 16:23:08

标签: codeigniter

此代码有什么问题?

会话变量“user”具有记录的用户的id。它是在登录过程中设置的。

$this->session->set_userdata("user",$user->id);

此代码始终显示错误页面并执行会话销毁!!!为什么?

if ( !$this->session->userdata("user"))
{
   $error = "User do logout without been logged [" . $_SERVER['REMOTE_ADDR'] ."]" ;
   log_message('error', $error);
   show_error($error);
}
else
{
    $this->session->sess_destroy();
}

如果我评论 $ this-> session-> sess_destroy()它可以正常运行,则会话不会被破坏并且不会显示错误

1 个答案:

答案 0 :(得分:1)

您的函数说:“如果用户未登录,请显示错误消息并记录错误,否则请使用sess_destroy()将用户注销”

因此,如果您访问该页面但未登录,则会看到错误。如果您访问该页面,并且您已登录,则该函数会调用sess_destroy并将您注销。


澄清:您的代码仅允许1个用户状态:已注销 - 这是页面上任何输出的唯一方式。如果登录的某人访问该页面,则会立即注销。

if($this->session->userdata('email')){
    //the user is logged in
    echo "HELLO USER, YOU ARE LOGGED IN!";
}else{
    //you don't need session_destroy because 
    //they won't get here with a session to be destroyed
    redirect('/home');
}

进一步澄清:我在全新安装的Codeigniter上对此进行了测试,其行为与我解释的相同。

修改默认欢迎控制器以节省时间:

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

class Welcome extends CI_Controller {

    function __construct()
    {
        parent::__construct();
        $this->load->library('session');

    }

    function index()
    {

        $this->session->set_userdata("user","1234");
        echo "userdata set to: ".$this->session->userdata("user"). "<br>";
        echo "<a href='welcome/checksess'>check session</a>";
    }

    function checksess()
    {


        if ( !$this->session->userdata("user"))
        {
           $error = "User do logout without been logged [" . $_SERVER['REMOTE_ADDR'] ."]" ;
           log_message('error', $error);
           show_error($error);
        }
        else
        {
            echo "userdata: ".$this->session->userdata("user"). " about to be destroyed with sess_destroy<br>";
            $this->session->sess_destroy();
            echo "<a href='checksess'>check session again after sess_destroy (refresh this page)</a>";
        }
    }
}

/* End of file welcome.php */
/* Location: ./application/controllers/welcome.php */

当您访问welcome / index时,它会设置会话数据。当您单击checksess链接时,请检查echo的userdata然后调用sess_destroy。现在,如果刷新checksess,则不设置userdata(因为sess_destroy)并且您看到错误“User do logout without a logged ...”

您提供的代码中没有任何内容可以解释您遇到的行为。

相关问题