用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2917|回复: 6
收起左侧

[版本 3.x] 构造函数中取不到session?

[复制链接]
发表于 2017-1-21 23:42:20 | 显示全部楼层 |阅读模式
需求是登陆时确认成功后写日志,日志类是自己写的。
登陆成功跳转前会写session,内容是用户名,然后调用日志类的方法写日志。
日志类的构造函数中会从session中把用户名取出来,结果发现取session这行放到构造函数中是取不出来的,放到其他函数中就没问题,不知道是不是BUG?
发表于 2017-1-22 15:53:59 | 显示全部楼层
贴代码看一下。
 楼主| 发表于 2017-1-22 20:51:04 | 显示全部楼层
Hex 发表于 2017-1-22 15:53
贴代码看一下。

Login.php 代码段:
  1. #判断用户状态
  2.                         if ($data['usersinfo']['status'] == 1) {
  3.                             #设置session,更新登陆时间,写日志,跳转到主页面
  4.                             $this->session->set_userdata('s_username',$username);
  5.                             $this->m_usermanage->update_lastlogintime($username);
  6.                             #写日志
  7.                             $this->logtodb->logdb(
  8.                                 array(
  9.                                     'log_type'=>'0001',
  10.                                     'log_content'=>array(
  11.                                         'content'=>'用户成功登陆系统'
  12.                                     )   
  13.                                 )   
  14.                             );  
  15.                             redirect('mainpage');
复制代码

logtodb类代码:
  1. <?php
  2. class Logtodb {
  3.     protected $CI;
  4.     public function __construct()
  5.     {   
  6.         $this->CI =& get_instance();
  7.         $this->CI->load->model('m_logtodb');
  8.         $this->logdata['log_user']=$this->CI->session->userdata('s_username');
  9.     }   
  10.         
  11.     public function logdb($log_content) {
  12.         $this->logdata['log_type']=$log_content['log_type'];
  13.         $this->logdata['log_content']=serialize($log_content['log_content']);
  14. if ($this->CI->m_logtodb->wrlog($this->logdata)) {
  15.             return TRUE;
  16.         }else{
  17.             return FALSE;
  18.         }
  19.     }
  20. }
  21. ?>
复制代码

在其他页面都没问题,就是在Login的时候取不到session
 楼主| 发表于 2017-1-22 20:51:56 | 显示全部楼层
Hex 发表于 2017-1-22 15:53
贴代码看一下。

倒也不是非得在构造函数中取session,只是觉得很奇怪,排错用了1个小时
发表于 2017-1-23 11:27:03 | 显示全部楼层
hyperlau 发表于 2017-1-22 20:51
倒也不是非得在构造函数中取session,只是觉得很奇怪,排错用了1个小时

你的 Logtodb 和 Session 类库是 autoload 吗?如果是 autoload 那你怎么保证 Logtodb 实例化之前已经实例化 Session 类库呢?
 楼主| 发表于 2017-1-23 18:18:13 | 显示全部楼层
Hex 发表于 2017-1-23 11:27
你的 Logtodb 和 Session 类库是 autoload 吗?如果是 autoload 那你怎么保证 Logtodb 实例化之前已经实 ...

两个都是autoload的,但我没太明白您的意思,因为不管怎样的执行顺序,都没有报错,只是var_dump session的时候s_username没有值,有另外一个CI开头的session变量,这种情况仅仅出现在Login.php的logtodb调用,因为我是在写logtodb类的时候用的是另一个控制器去调试这个类,当时logtodb取session就是写在构造函数里的,是正确能取出来username的,所以我觉得是不是框架代码里有什么问题会导致构造函数取session取不出来?
发表于 2017-1-24 16:55:03 | 显示全部楼层
hyperlau 发表于 2017-1-23 18:18
两个都是autoload的,但我没太明白您的意思,因为不管怎样的执行顺序,都没有报错,只是var_dump session ...

我觉得有可能是 autoload 顺序的问题,你可以试试不适用 autoload 看看可以不可以。

本版积分规则