我正在使用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')