You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter 3中Toastr成功提示页面刷新重复显示问题求助

CodeIgniter 3集成Toastr重复弹出提示的修复方案

问题原因分析

  1. Flashdata读取逻辑问题:CodeIgniter 3的flashdata()方法在同一请求中多次调用时,不会立即销毁数据,只会在下一次HTTP请求后自动清除。你当前在视图中先判断再读取的写法,虽不会直接导致重复,但如果后续请求(如刷新)触发重复逻辑,就会重复显示提示。
  2. 浏览器重复提交POST请求:如果保存操作是POST请求,刷新页面时浏览器会重新提交表单,导致控制器再次执行set_flashdata,进而重复弹出提示。
  3. Toastr配置未针对跨请求重复做处理:preventDuplicates: false仅阻止同页面同内容的同时显示,无法解决跨请求的重复提示问题。

具体修复方案

方案一:一次性读取Flashdata并复用变量

在视图开头将Flashdata的值存入变量,后续仅使用变量,避免同一请求内重复读取:

<?php
// 一次性读取所有Flashdata到变量
$success_msg = $this->session->flashdata('success');
$error_msg = $this->session->flashdata('error');
$warning_msg = $this->session->flashdata('warning');
$info_msg = $this->session->flashdata('info');
?>

<script>
toastr.options = {
  "closeButton": true,
  "debug": false,
  "newestOnTop": false,
  "progressBar": false,
  "positionClass": "toast-top-right",
  "preventDuplicates": true, // 建议开启,避免同页面重复提示
  "onclick": null,
  "showDuration": "100",
  "hideDuration": "1000",
  "timeOut": "3500",
  "extendedTimeOut": "60000",
  "showEasing": "swing",
  "hideEasing": "linear",
  "showMethod": "fadeIn",
  "hideMethod": "fadeOut"
};

<?php if($success_msg){ ?>
    toastr.success("<?php echo $success_msg; ?>");
<?php }else if($error_msg){  ?>
    toastr.error("<?php echo $error_msg; ?>");
<?php }else if($warning_msg){  ?>
    toastr.warning("<?php echo $warning_msg; ?>");
<?php }else if($info_msg){  ?>
    toastr.info("<?php echo $info_msg; ?>");
<?php } ?>
</script>

方案二:POST操作后强制重定向(核心解决刷新重复提交)

如果保存是POST请求,控制器执行完逻辑后必须重定向到GET请求页面,避免刷新时重复提交:

// 控制器保存方法示例
public function save() {
    // 执行保存数据库等操作...
    
    $this->session->set_flashdata('success', DELETE_MSG);
    // 重定向到GET路由,比如列表页或当前页的GET地址
    redirect('your_controller/your_page');
}

这样刷新页面时只会发送GET请求,不会重复触发保存逻辑和Flashdata设置。

方案三:手动销毁已使用的Flashdata(可选)

如果需要在当前请求后立即清除Flashdata,可在调用后手动销毁:

<?php if($success_msg){ ?>
    toastr.success("<?php echo $success_msg; ?>");
    <?php $this->session->unset_flashdata('success'); ?>
<?php } ?>

关键注意事项

  • CodeIgniter 3的Flashdata默认保留到下一次HTTP请求,不使用重定向的POST请求直接加载视图,刷新时必然重复提交。
  • preventDuplicates: true仅解决同页面内的重复提示,无法处理跨请求的重复问题,重定向才是解决刷新重复提交的核心方案。

内容的提问来源于stack exchange,提问作者user21725469

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 01:45:26