【问题标题】:CodeIgniter cannot use session data after redirect()CodeIgniter 在 redirect() 之后无法使用会话数据
【发布时间】:2019-05-29 14:02:54
【问题描述】:

我试图构建一个应用程序,但我遇到了会话数据问题。所以我下载了一个新的 CodeIgniter 项目并尝试使用该会话但仍然失败。这是我所做的:

application/config/autoload.php:

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

$autoload['helper'] = array('url');

application/config/config.php:

$config['sess_save_path'] = 'D:\Projects\CodeIgnter-fresh\application\cache\session';

之后我创建了一个名为 User.php

的控制器

User.php

<?php

class User extends CI_Controller {

    public function index() {
        $this->session->set_userdata('somedata', 'somevalue');
        redirect('user/dashboard', 'refresh');
    }

    public function dashboard() {
        var_dump($this->session->userdata);
    }
}

控制器包含两个简单的方法。 index 方法设置一些用户数据,然后重定向到另一个方法,该方法转储用户数据。不幸的是,这就是我所看到的:

似乎我能看到的唯一数据是一些 CodeIgniter 数据,但可以肯定的是,我试图设置的数据已经消失了。 我注意到的一件有趣的事情是,在 application/cache/session 文件夹中,我可以看到一些包含我的数据的文件。所以我想这一定是一些权限问题,但我无法弄清楚。有什么建议?

我正在使用:
操作系统:Windows 10 教育版
PHP版本:7.2.11
CodeIgniter 版本:3.1.10

【问题讨论】:

标签: php codeigniter session


【解决方案1】:

我在这个问题中看到 2 个问题:

  1. 无法使用 CI 将会话信息写入磁盘 文件驱动程序
  2. 无法检索会话信息

1.将会话信息写入磁盘

第 344 行左右的 config.php 说

'sess_save_path'

保存会话的位置,取决于驱动程序。

对于“文件”驱动程序,它是可写目录的路径。 警告:仅支持绝对路径!

重要提示:您需要设置有效的保存路径!

因此,您需要将其设置为 false(不保存任何内容)或使用绝对路径。为了使这项工作适用于开发和生产,您可以使用 PHP $_SERVER 数组并在 config.php 中使用它,例如:

$config['sess_save_path'] = $_SERVER['DOCUMENT_ROOT'].'/application/cache/session/';

最后,您需要确保上述目录是可写的,但只有您有权访问该目录(在生产服务器上)。

P.S.:您可以使用这一行查看 $_SERVER 中的内容:

<?php echo'<pre>';print_r($_SERVER); ?>

2。检索会话信息

  • 确保您没有在之前的函数中破坏会话
  • 记住改变 $config['cookie_domain'], $config['cookie_path'], $config['cookie_secure'] 会影响会话:

此设置适用于我的设置:

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = $_SERVER['DOCUMENT_ROOT'].'/application/cache/session/';
$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;

如果这些都不起作用,您仍然可以尝试覆盖自动加载,将此构造函数放入您的 User 控制器中:

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

【讨论】:

  • 这肯定是正确的。但是我仍然没有得到会话数据,结果仍然是一样的..如何检查文件夹的许可?
  • 我回答了这个问题,因为我认为您无法使用“文件”驱动程序将会话存储在您的服务器上。我刚刚再次查看了您的仪表板功能。应该是var_dump( $this-&gt;session-&gt;userdata() );
  • 无论我转储什么:$this-&gt;session-&gt;userdata$this-&gt;session-&gt;userdata() 甚至 $_SESSION,我仍然得到相同的结果...
  • 但是你看到 /application/cache/session/ 中的文件了吗?
  • 是的,我可以看到
【解决方案2】:

在配置中将驱动程序设置为“文件”:

$config['sess_driver'] = 'files';

更多信息在这里Codeigniter Session User Manual

【讨论】:

  • 其实它默认设置为'files',所以解决方案必须在其他地方:/
猜你喜欢
  • 2017-05-16
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 2014-01-03
  • 2019-02-14
  • 2013-10-11
相关资源
最近更新 更多