【问题标题】:Flashdata not getting cleared in CodeigniterFlashdata 未在 Codeigniter 中清除
【发布时间】:2013-09-21 16:36:04
【问题描述】:

我正在使用 Codeigniter 2.1.4,但我遇到了一些关于 flashdata 的问题。 当我成功提交记录时,我可以显示 flashdata 消息。但是,如果从显示 flashdata 消息的页面转到其他页面,然后使用浏览器返回按钮返回上一页,它会再次显示 flashdata 消息。
使用后如何清除 flashdata 消息?强> 我认为它不是 flashdata 问题它的缓存问题。我很困惑为什么会这样。 如果它的缓存问题,那么如何删除它?

下面是我用过的代码,

//In the manage of controller
$this->session->set_flashdata('message', "Record updated successfully.");

// In the view of controller
$data['message'] = $this->session->flashdata('message');

// In the view page
echo $message;

【问题讨论】:

  • 我已经阅读了你的两个答案的 cmets,是的,你是对的,使用后退按钮是“永远”不会给你新的数据。请在每个表单提交和处理表单/数据redirect() 某处之后,这样您(主要是您的用户)就不必处理“您要重新发送数据吗?” Chrome/Firefox 提供的 nag。
  • 当我在 index.php 中使用header("Expires: Thu, 19 Nov 1981 08:52:00 GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); 时,它工作正常。这是消除缓存问题的好选择吗?
  • 我会选择“刷新”(redirect())而不是搞乱标题。但是你解决了你的问题,我们没有你所拥有的全局(为什么需要后退按钮才能工作 - redirect() 解决了这个“问题”)。
  • @Sachin,你有没有找到解决办法?我花了几个小时但无济于事

标签: php codeigniter google-chrome firefox


【解决方案1】:

Flash 仅在下次刷新后才会消失

【讨论】:

    【解决方案2】:

    您在控制器中的代码是正确的

    //In the manage of controller
    $this->session->set_flashdata('message', "Record updated successfully.");
    redirect('controller_name/function_name','refresh');
    

    现在可以像这样使用

    if($this->session->flashdata('message')){echo $this->session->flashdata('message');}
    

    希望它会起作用

    【讨论】:

    • 谢谢,我确信问题不在于 flashdata,而是缓存问题。因为当我单击浏览器后退按钮时,它会再次显示。
    • 在设置 flashdata 后告诉我一件事你是重定向到任何函数还是使用 $this->load->view 函数。
    • 是的,我正在重定向页面以查看功能
    • 如果您使用redirect() 函数,那么第二次flashdata 将不再显示值。
    【解决方案3】:

    必须将页面重定向 之后 $this->session->set_flash('item','value');

    示例

    if ($this->form_validation->run() == FALSE){
        $this->session->set_flashdata('error',validation_errors());
        redirect(base_url().'user/login');
    }
    else{
        $this->session->set_flashdata('success','Thank you');
        redirect(base_url().'user/login');
    }
    

    通常开发人员在向同一页面提交数据时会出错。他们设置了闪存数据但忘记了重定向。

    【讨论】:

      【解决方案4】:

      如果你想清除控制器或其他视图文件中的 set_flash,那么你可以使用这个简单的代码。

      $this->session->set_flashdata('error', 'User not found...'); //create set_flash
      

      销毁 set_flash

      //echo "<pre>"; print_r($_SESSION); die; //for check 
      
      if(isset($_SESSION['error'])){
          unset($_SESSION['error']);
      }
      

      【讨论】:

        【解决方案5】:
        $this->session->set_flashdata('message', "Record updated successfully.");
        

        设置flashdata重定向到某个函数或者同一个函数后。

        【讨论】:

        • 谢谢,我确信问题不在于 flashdata,而是缓存问题。因为当我单击浏览器后退按钮时,它会再次显示。
        【解决方案6】:

        如果在同一个控制器函数中刷新,flashdata不会被删除。同样在浏览器中来回切换也不影响flashdata。 清除 flashdata 重定向到另一个控制器功能,它将起作用。

        【讨论】:

          【解决方案7】:

          由于 Code igniter 不提供销毁 flashdata 的可能性,您可以通过第二次虚构调用 flashdata 函数而不使用 echo 来解决此问题:

          if ($this->session->flashdata('message')) :
              echo $this->session->flashdata('message'); // First normal call
              $this->session->flashdata('message'); // Second fictitious call
          endif;
          

          【讨论】:

            【解决方案8】:

            转到系统->库->会话->session.php 找到flshdata函数并用这个替换

            public function flashdata($key = NULL)
            {
                if (isset($key))
                {
                    $return= (isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$key], $_SESSION[$key]) && ! is_int($_SESSION['__ci_vars'][$key]))
                        ? $_SESSION[$key]
                        : NULL;
                        unset($_SESSION[$key]);
                        return $return;
                }
            
                $flashdata = array();
            
                if ( ! empty($_SESSION['__ci_vars']))
                {
                    foreach ($_SESSION['__ci_vars'] as $key => &$value)
                    {
                        is_int($value) OR $flashdata[$key] = $_SESSION[$key];
                    }
                }
                unset($_SESSION[$key]);
                return $flashdata;
            }
            

            【讨论】:

            • 如果这个答案仍然与这个有 7 年历史的问题相关,您能否详细说明这是如何解决这个问题的。只有一段代码作为解决方案可能是一个解决方案,但这并不能帮助人们学习。
            • 好的。我所做的是请求我重置值的每个会话密钥
            【解决方案9】:

            看起来这将在 3.1.12 中修复:https://github.com/bcit-ci/CodeIgniter/pull/6013

            【讨论】:

              猜你喜欢
              • 2016-03-03
              • 1970-01-01
              • 2022-01-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-10-13
              相关资源
              最近更新 更多