Php 预期的CodeIgniter会话行为?

Php 预期的CodeIgniter会话行为?,php,codeigniter,Php,Codeigniter,我有一个会话,我正在为会话使用一个数据库。我在会话中使用userdata存储用户名和“loggedin”标志。我正在自动加载会话库,因此不必显式加载它 我在控制器中使用它来检查“loggedin”,在视图中显示用户名,这导致CI_会话被加载两次,并导致会话被破坏。在加载CI_会话的两次尝试更新会话和数据库时,第一次成功,第二次失败并销毁了会话 我认为我违反了控制器和视图之间的分离,我只在控制器中使用会话库,并将带有用户名的变量传递到视图中,从而解决了这个问题 但我的问题是:我所做的分析正确吗?我

我有一个会话,我正在为会话使用一个数据库。我在会话中使用userdata存储用户名和“loggedin”标志。我正在自动加载会话库,因此不必显式加载它

我在控制器中使用它来检查“loggedin”,在视图中显示用户名,这导致CI_会话被加载两次,并导致会话被破坏。在加载CI_会话的两次尝试更新会话和数据库时,第一次成功,第二次失败并销毁了会话

我认为我违反了控制器和视图之间的分离,我只在控制器中使用会话库,并将带有用户名的变量传递到视图中,从而解决了这个问题

但我的问题是:我所做的分析正确吗?我是否违反了控制器和视图之间的分离,只要我不再这样做,我就应该没事了,或者这可能会在其他场景中再次发生

注意:我试着仔细地问这个问题,我在寻找技术性的答案,而不是意见,我不希望这成为关于这个与那个的讨论,等等。

按要求添加代码:

来自Controller Admin.php的代码段

class Admin extends CI_Controller {
  function __construct() {
    parent::__construct();
    $this->load->model('users');
    $this->id = $this->session->userdata('id');
    $this->authorized = array('waccess' => $this->users->authorizedUser($this->id, 'waccess'),
                              'ceditor' => $this->users->authorizedUser($this->id, 'ceditor'),
                              'uadmin' => $this->users->authorizedUser($this->id, 'uadmin'),
                              'forms' => $this->users->authorizedUser($this->id, 'forms'));

  }
  public function index() {
    log_message('debug', 'Admin->index');
    $this->load->view('framework', array(
      'head' => $this->load->view('head', array('title' => 'Administrator', 'stylesheet' => 'admin.css', 'javascript' => 'jquery-ui-1.8.16.custom.min.js'), true),
      'header' => $this->load->view('headerAdmin', array('active' => 'Home', 'authorized' => $this->authorized), true),
      'body' => $this->load->view('adminHome', '', true),
      'midBody' => $this->load->view('blankMid', '', true),
      'footer' => $this->load->view('footer', '', true)
    ));
  }
查看adminHome.php中的代码片段

<div id="main">
  <div class="content">
    <h1>Employee Interface</h1>
<? if(!$this->session->userdata('loggedin')): ?>
....
<? else: ?>
    <p>Welcome <?=$this->session->userdata('fname')?> <?=$this->session->userdata('lname')?></p>
<? endif; ?>
    <p>Use the menu above to select the various employee and administrative options available to you</p>
  </div>
</div>

尝试更改配置设置:

$config['sess_match_useragent'] = FALSE;
我猜你的视图中有某种代码,或者其他脚本或浏览器插件,会弄乱用户代理检查。这会导致会话匹配不匹配,导致结果
未找到会话,如您所见,会破坏实例,从而导致错误

当然,这一变化的结果是会话的安全性降低,因此,如果安全性是一个大问题,那么您当然可以进一步研究导致问题的原因

你可以在其他帖子中找到信息

Googlechrome框架是原因(默认情况下是引导模板的一部分):

FireHP扩展是原因:

没有,似乎还涉及其他错误。你能给我们看一些代码吗?您是如何使用tbe会话方法的?在控制器和视图中使用会话调用应该不会有问题。我想补充一点,我问这个问题的一个主要原因是,当我第一次使用会话调用时,我找不到问题原因的任何答案,我花了很多时间钻研codeigniter代码来找出我做错了什么。@jtheman当然,给我几分钟时间你是说当你从视图中取出显式会话调用时,你的问题就消失了吗。这不太可能是真正的原因。可能其他语法是真正的原因。哦,我可以通过简单地将
添加回视图来重新创建问题。这似乎不是useragent的问题,它实际上似乎与ajax问题有更密切的关系,但没有cookie问题:好吧,您没有显示或告诉我们内部的ajax调用。那么问题就不是我第一次觉得的那样线性了。。。获得帮助的一个良好开端是添加与问题相关的所有内容。
$config['sess_match_useragent'] = FALSE;