【问题标题】:CodeIgniter strange behaviour with sess_destroysess_destroy 的 CodeIgniter 奇怪行为
【发布时间】:2012-02-14 16:23:07
【问题描述】:

这段代码有什么问题?

会话变量“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() 它可以工作,会话不会被破坏并且错误不会显示

【问题讨论】:

  • 我在尝试将 CI 会话库用于在线聊天应用程序时发现了意外行为。我终于改用原生 PHP 会话了。我怀疑你发现了这样的错误。接得好;它可能会提供一些有用的见解。

标签: codeigniter


【解决方案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 */

当您访问欢迎/索引时,它会设置会话数据。当您单击链接进行检查时,检查回显用户数据然后调用 sess_destroy。现在,如果您刷新 checksess,则未设置 userdata(因为 sess_destroy)并且您会看到错误“用户在未登录的情况下注销...”

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

【讨论】:

  • 不,这将是正确的行为...如果我登录并访问该页面,我会收到错误并破坏会话。这就像执行页面两次。我不知道为什么,但它正在发生......
  • 不,不会。我用一个例子更新了答案..但它的短处是你的代码只允许用户退出。
  • 我知道...这很奇怪,但发生这种情况我已经深入测试过。我的步骤是 1)登录 2)启动用户页面 3)注销 4)我得到错误日志并且会话被破坏(我知道会话被破坏,因为我可以在 CI 分析器上看到它,但我看不到步骤2
  • 如果我在会话销毁前插入 4 秒的睡眠,它会起作用
  • 我也知道我可以简化只做 $this->session->sess_destroy() 但我很想知道发生了什么...... -
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
  • 2014-04-27
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 2011-08-07
相关资源
最近更新 更多