Php CodeIgniter闪存数据在本地工作,但不在服务器上工作

Php CodeIgniter闪存数据在本地工作,但不在服务器上工作,php,codeigniter,session,Php,Codeigniter,Session,你好,CodeIgniter用户 我有一个闪存数据的问题,我想得到一些帮助。我的CI版本是2.1.4 我正在使用CI flash数据临时存储由多个页面组成的表单的数据。每个页面上输入的数据都会被存储起来,以便在下一个页面上访问,最后所有数据都会输入到数据库中 现在,为了让数据存储在多个页面中,而不是只存储一个页面,我使用以下函数扩展了Session类: function keep_all_flashdata($prefix = '') { $userdata = $this->al

你好,CodeIgniter用户

我有一个闪存数据的问题,我想得到一些帮助。我的CI版本是2.1.4

我正在使用CI flash数据临时存储由多个页面组成的表单的数据。每个页面上输入的数据都会被存储起来,以便在下一个页面上访问,最后所有数据都会输入到数据库中

现在,为了让数据存储在多个页面中,而不是只存储一个页面,我使用以下函数扩展了Session类:

function keep_all_flashdata($prefix = '')
{
    $userdata = $this->all_userdata();
    foreach ($userdata as $key => $value)
    {
        if (strpos($key, ':old:' . $prefix))
        {
            $new_flashdata_key = str_replace(':old:', ':new:', $key);
            $this->set_userdata($new_flashdata_key, $value);
        }
    }
}
此函数为另一个重定向保留所有闪存数据(或者可选地仅保留以特定字符串开头的闪存数据)。它类似于
keep_flashdata
功能,只是它可以用于多个项目,而不需要它们的确切名称

调用此函数后,会话数据中存储了
:old:
:new:
键。然后在重定向之后,旧密钥被删除,新密钥被设置为old。然后,如果还有另一个页面,我会再次调用
keep\u all\u flashdata()
,依此类推,直到最后一个页面

当我在本地WAMP服务器上工作时,这很好,但在我的实际服务器上,所有flashdata在重定向后都会被删除,即使它的键中有
:new:
。我通过检查
session->all\u userdata()

我正在使用一些AJAX调用,但它们不应该擦除flash数据(这是一个已知的问题),因为在清除flashdata之前(在
sess\u update()
\u flashdata\u sweep()
函数中),我已经通过
$this->CI->input->is\u AJAX\u request()
阻止了这种情况


这是CodeIgniter中的错误还是我做错了什么?非常感谢您的帮助。

我认为是您的if声明造成了问题。我假设“:old:”或“:new:”用作会话中存储的每个密钥的前缀

strpos()返回指针所在的位置,以便在检查前缀为“:old:”的键时,指针的位置为0。这是因为需要删除旧的flashdata。我测试了以下代码:

$flashDataKey = ':new:myKey';

die(var_dump(strpos($flashDataKey, ':old:')));
由于未找到指针,因此返回false。导致不将flashdata存储为“:old:”并将其保留以供下一个请求使用

我不知道为什么这在你的本地主机上起作用。您应该将if语句更改为:

if( strstr($key, ':new:') !== false)

现在只有包含字符串“:new:”的键将通过,其他所有键都将返回false。希望这有帮助

我能理解你的推理,但不幸的是事实并非如此。每个闪存数据键都包含前缀
'flash'
,因此
strpos
返回一个大于0的数字。实际的CodeIgniter类以同样的方式检查它,我已经对它进行了测试。我认为我的函数不是问题所在,因为它正确地重命名了键(通过许多
var\u dump
s检查)。