闪存数据未在代码点火器中清除


Flashdata not getting cleared in Codeigniter

我正在使用Codeigniter 2.1.4,我遇到了一些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;

它是工作:https://github.com/bcit-ci/CodeIgniter/pull/6013#issuecomment-1316482414

这是较新版本的 php 中的一个问题。您可以通过替换系统/库/会话/会话.php中的第 420 行来修复它:

elseif ($value < $current_time) 

elseif ($value === 'old' || $value < $current_time)

谢谢

Flash仅在下次刷新后消失

转到 System->libries->Session->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;
}

控制器中的代码是正确的

//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');}

希望它会起作用

如果要清除控制器或其他视图文件中的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']);
}

这是php版本问题。 您需要修改会话文件。转到您的会话.php文件

找到_ci_init_vars函数并添加此"$value === '旧' ||"在 elseif 条件下。

或将函数替换为以下内容。

protected function _ci_init_vars()
{
    if ( ! empty($_SESSION['__ci_vars']))
    {
        $current_time = time();
        foreach ($_SESSION['__ci_vars'] as $key => &$value)
        {
            if ($value === 'new')
            {
                $_SESSION['__ci_vars'][$key] = 'old';
            }
            // Hacky, but 'old' will (implicitly) always be less than time() ;)
            // DO NOT move this above the 'new' check!
            elseif ($value === 'old' || $value < $current_time)
            {
                unset($_SESSION[$key], $_SESSION['__ci_vars'][$key]);
            }
        }
        if (empty($_SESSION['__ci_vars']))
        {
            unset($_SESSION['__ci_vars']);
        }
    }
    $this->userdata =& $_SESSION;
}

您必须在$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');
}

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

$this->session->set_flashdata('message', "Record updated successfully.");

设置闪存数据后,重定向到某个功能或同一功能。

如果在同一

控制器功能中刷新,则不会删除闪存数据。在浏览器中来回切换也不会影响闪存数据。要清除闪存数据重定向到另一个控制器功能,它将起作用。

由于代码点火器不提供销毁 flashdata 的可能性,您可以通过对 flashdata 函数进行第二次虚构调用来解决此问题,而无需 echo:

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

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

当我将 php 版本 7 更新到 php 8 时,我遇到了同样的问题。您可以在显示错误或成功消息后立即手动取消设置闪存数据。

$this->session->unset_userdata('err_msg')