【问题标题】:CodeIgniter flash data working locally but not on serverCodeIgniter 闪存数据在本地工作但不在服务器上
【发布时间】:2015-05-27 17:58:04
【问题描述】:

你好 CodeIgniter 用户。

我的闪存数据有问题,我需要一些帮助。我的 CI 版本是 2.1.4。

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

现在为了让数据通过多个页面而不是一个页面来存储,我使用以下函数扩展了 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: 密钥都存储在会话数据中。然后在重定向后,旧键被删除,新键被设置为旧键。然后,如果还有其他页面,我会再次调用keep_all_flashdata(),以此类推,直到最后一页。

当我在本地 WAMP 服务器上工作时,这可以正常工作,但在我的实际服务器上,所有 flashdata 都会在重定向后被删除,即使它的键中有 :new:。我通过检查session->all_userdata() 的内容确认了我的keep_all_flashdata() 功能正常工作,并且一切看起来都符合预期。

我正在使用一些 AJAX 调用,但它们不应擦除 flash 数据(一个已知问题),因为我在清除 flashdata 之前使用$this->CI->input->is_ajax_request() 阻止了此操作(在sess_update()_flashdata_sweep() 函数中)。

这是 CodeIgniter 中的错误还是我做错了什么?任何帮助表示赞赏。

【问题讨论】:

    标签: php codeigniter session


    【解决方案1】:

    我认为您的 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。希望这有帮助!

    【讨论】:

    • 我可以看到你的推理,但不幸的是事实并非如此。每个 flash 数据键都包含前缀 'flash',因此 strpos 返回一个 > 0 的数字。实际的 CodeIgniter 类以相同的方式检查它,我已经对其进行了测试。我认为我的功能不是问题,因为它正确地重命名了键(与许多 var_dumps 进行了检查)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    相关资源
    最近更新 更多