CodeIgniter flash数据在本地工作,但不在服务器上


CodeIgniter flash data working locally but not on server

CodeIgniter用户好。

我有flash数据的问题,我想要一些帮助。我的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);
        }
    }
}

这个函数保留所有的flash数据(或者可以选择只保留以某个字符串开头的flash数据)用于另一个重定向。它类似于keep_flashdata函数,除了它适用于多个项目而不需要它们的确切名称。

调用此函数后,:old::new:键都存储在会话数据中。然后在重定向之后,删除旧密钥并将新密钥设置为旧密钥。然后,如果有另一页,我再次调用keep_all_flashdata(),以此类推,直到最后一页。

当我在本地WAMP服务器上工作时,这很好,但在我的实际服务器上,所有flashdata只是在重定向后被删除,即使它在键中有:new:。我确认我的keep_all_flashdata()功能工作通过检查session->all_userdata()的内容,一切看起来如预期。

我正在使用一些AJAX调用,但他们不应该擦除flash数据(一个已知的问题),因为我已经阻止了这与$this->CI->input->is_ajax_request()之前flashdata被清除(在sess_update()_flashdata_sweep()函数)。

这是一个bug在CodeIgniter或我做错了什么?

我认为是你的if语句引起了问题。我假设":old:"或":new:"用作您在会话中存储的每个键的前缀?

strpos()返回指针存在的位置,因此当检查带有前缀':old:'的键时,该位置将为0。这是打算作为旧的闪存数据需要被删除。我测试了下面这段代码:

$flashDataKey = ':new:myKey';
die(var_dump(strpos($flashDataKey, ':old:')));

返回false,因为没有找到指针。导致flashdata不存储为':old:',而保留到下一个请求。

我不知道为什么这是工作在您的本地主机。你应该把if语句改成:

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

现在只有包含字符串':new:'的键才会传递,其他所有键都将返回false。希望这对你有所帮助!