CodeIgniter 会话为空

Posted

技术标签:

【中文标题】CodeIgniter 会话为空【英文标题】:CodeIgniter session is empty 【发布时间】:2019-08-29 05:00:28 【问题描述】:

我在库中的一个类中设置了一个会话。然后我尝试从库中的另一个类中获取此会话的值。该值为空。

我查看了 CodeIgniter 库以找出问题所在,并查看了 *** 中的一些类似主题,但我没有发现任何问题。也许我错过了一些东西。请帮忙。

// IN THIS CLASS I SET THE SESSION 'fr_phone'

class Form_submit_fr 
    var $CI;
    protected $fr_id;
    protected $fr_data = array();
    public function __construct() 
      $this->CI =& get_instance();

      if (strpos($this->CI->uri->segment(1),'frid') !== false) 
        $this->fr_id = (int)str_replace('frid','',$this->CI->uri->segment(1));

        $this->fr_data = $this->get_fr_data();

        // add the phone to session
        if (isset($this->fr_data->city_toll) && $this->fr_data->city_toll != '') 
            $fr_phone = $this->fr_data->city_toll;
           else 
            $fr_phone = $this->fr_data->city_phone;
          

          // here the session is set
          $this->CI->session->set_userdata('fr_phone', $fr_phone);

          //the result is correct
           echo $this->CI->session->userdata('fr_phone') . ' - fr_phone<br>';

      
    
 ....




// IN THIS CLASS I NEED TO GET THIS SESSION 'fr_phone'

class P_details 

    protected $page_link;
    protected $fr_data;

    var $CI;

    public function __construct()
      $this->CI =& get_instance();
        if ($this->CI->uri->segment(2) == false && $this->CI->uri->segment(3) == false) 
          $this->page_link = $this->uri->segment(1)."/";
         else if ($this->CI->uri->segment(1) != false && $this->CI->uri->segment(2) != false && $this->CI->uri->segment(3) == false) 

                     $this->page_link =  $this->CI->uri->segment(1)."/".$this->CI->uri->segment(2)."/";
         else if ($this->CI->uri->segment(1) != false && $this->CI->uri->segment(2) != false && $this->CI->uri->segment(3) != false) 

          $this->page_link =  $this->CI->uri->segment(1)."/".$this->CI->uri->segment(2)."/";
          $this->fr_data = $this->get_fr_data($this->CI->uri->segment(3));

        
      $this->CI->load->model('getDetails_model');


    

    public function get_p_id($type = '') 


           $details_array = $this->CI->getDetails_model->all_details($this->page_link);

               if (empty($details_array)) 
                  return FALSE;
               
               else 
                $data['fr_phone'] = '';

                $data['detail'] = $details_array;


                  // get phone from session 
                  // here the session is empty
                  echo $this->CI->session->userdata('fr_phone') . ' - fr_phone<br>';

                  if ($this->CI->session->userdata('fr_phone')) 
                    $data['fr_phone'] = $this->CI->session->userdata('fr_phone');
                   
                  if ($this->fr_data != '') 
                    $data['fr_detail'] = $this->fr_data;
                  
                  return $data;
               
    

...



这是我的配置文件:

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;


$config['cookie_prefix']    = '';
$config['cookie_domain']    = '';
$config['cookie_path']      = '/';
$config['cookie_secure']    = FALSE;
$config['cookie_httponly']  = FALSE;

这是我的自动加载文件:

$autoload['libraries'] = array('database','session');

我已在 $config['sess_save_path'] 的配置文件中进行了建议的更改。多谢。当我以这种方式检查时,我也可以看到可写文件夹中的文件和数据库中的条目:

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 43200;
$config['sess_save_path'] = APPPATH.'writable';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

我还使用数据库进行会话:

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 43200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

如果我在 Controller 中的构造函数或索引函数中定义会话,则在这两种情况下会话都有效。我可以在视图文件和其他类中获取会话,但如果我在特定链接的条件下设置会话,那么当我想从库文件夹或视图文件中获取它时,该会话始终为空:

//in controller
if (strpos($this->uri->segment(1),'frid') !== false) 
   ...
$fr_phone = '111-222-3333';
  $this->session->set_userdata('fr_phone', $fr_phone);
   echo $this->session->userdata('fr_phone') // works 

当我在库文件夹中的类中调用此会话时,会话为空:上面的示例为类 P_details。并且没有办法从库文件夹中获取在 Class 中设置的会话,并从库文件夹中获取另一个类中的会话。这很奇怪,我无法理解。我也尝试在不同的控制器中获取会话,但没有成功。

【问题讨论】:

问题出在 sess_save_path 上。看到这个答案:***.com/a/43723441/617054 谢谢阿方索。它在某种程度上有所帮助,但我仍然无法在特定条件下进行会话。我上面提到过。 【参考方案1】:

我在一个项目中遇到了类似的问题。经过长时间的尝试,我通过以下方式解决了这个问题

1) 在 config.php

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'writable absolute path';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

并在根目录下创建了名为“可写绝对路径”的文件夹

希望这会有所帮助

【讨论】:

谢谢瑞吉。是的,我错过了 $config['sess_save_path'] 但无论如何我无法在特定条件下获得会话。【参考方案2】:

这很奇怪,但我从自动加载中删除了会话: $autoload['libraries'] = array('database'); 我添加了 session_start();在控制器中,我以一种常见的方式设置会话:

$_SESSION['fr_phone'] = $fr_phone;

然后我能够在任何文件中获取此值。这是一个错误吗? 我通过添加 $this->load->library('session'); 尝试不使用 session_start();它没有用。 谁能找到这个问题的答案?

我正在使用 CodeIgniter 3.0.2

【讨论】:

您需要检查从中调用库的控制器。你是在给父建造者打电话吗?

以上是关于CodeIgniter 会话为空的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter:Session_id 为空

重复的 SQL 导致 JOIN - Codeigniter

未捕获的 ReferenceError:$ 未定义 - Datepicker - Codeigniter 3

无法让 echo form_open 工作 - CodeIgniter

codeigniter 3 - 删除 index.php:Linux 上的错误 404,但在 Windows 上工作正常

Codeigniter 3 - 从外部 Codeigniter 安装访问会话