首页 > 解决方案 > Codeigniter 3.1.11 - 会话重新生成和数据丢失 PHP 7.3.11

问题描述

我在我的本地主机上使用 Codeigniter 3.1.11 和 XAMPP PHP 版本 7.3.11。我正在使用数据库会话,而不是文件。

我编写了一些简单的代码来将用户购物车数据放入会话中。在初始表单提交时,数据被放入会话中并且看起来不错。一次刷新,会话重新生成,之前的会话数据在新会话中不存在,但在旧会话中仍然存在。以下是我的配置设置。我尝试了很多组合,但无法弄清楚问题所在。

初始会话数据看起来不错:

Array
(
    [__ci_last_regenerate] => 1576165611
    [CART] => Array
        (
            [0] => Array
                (
                    [product_id] => XYZ1234567
                    [qty] => 1
                )

        )

)

在页面刷新时,我回显 $this->Session->all_userdata() 并收到:

Array
(
    [__ci_last_regenerate] => 1576124405
)

每次刷新都会生成一个新数字。

配置设置

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

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

我将向提供有效解决方案的人支付 10 美元。

标签: phpsessioncodeigniter-3session-cookies

解决方案


我通过从另一个线程中应用解决方案来部分工作,其中在检查 cookie 时 REGEX 不正确。但是,这仅部分有效或有时有效。这个逻辑并不总是被执行,所以我认为标准 CI 会话代码中还有一个地方也需要更改。

\system\libraries\session\Session.php

            //Line 136 changed by me on 12.15.2019 -mb
            //OR ! preg_match('#\A'.$this->_sid_regexp.'\z#', $_COOKIE[$this->_config['cookie_name']])
            OR ! preg_match('/^[0-9a-f]/', $_COOKIE[$this->_config['cookie_name']])

推荐阅读