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

CodeIgniter3中Flashdata无法显示问题求助

解决CodeIgniter 3 Flashdata无法显示的问题

嘿,我来帮你排查下为啥CI3的Flashdata设置后在视图里看不到的问题,结合你的代码一步步分析:

1. 先确认Session库已经正确加载

CI3的Session库不会自动加载哦,你得确保它已经被加载了:

  • 全局自动加载:打开application/config/autoload.php,在$autoload['libraries']数组里加上'session':
    $autoload['libraries'] = array('session');
    
  • 控制器内手动加载:如果不想全局加载,就在你这个add()方法所在控制器的构造函数里加:
    public function __construct()
    {
        parent::__construct();
        $this->load->library('session');
    }
    

要是没加载Session库,$this->session对象根本不存在,自然没法设置或者读取Flashdata啦。

2. 检查跳转的目标页面是否正确

你用了redirect($_SERVER['HTTP_REFERER']);跳回上一页,这里要注意两个点:

  • 万一用户是直接访问add方法的,$_SERVER['HTTP_REFERER']可能是空的,会导致跳转失败,建议换成明确的路由,比如:
    redirect('你的控制器名/列表页面方法'); // 替换成你实际要跳转的页面路由
    
  • Flashdata只会在下一次HTTP请求中有效,所以必须是跳转到新页面后再读取它,不能在当前add方法对应的视图里读(因为redirect已经终止了当前请求)。

3. 修复视图里的读取逻辑

你的视图代码有几个小问题,会影响显示:

  • 当Flashdata不存在时,$this->session->flashdata("msg")会返回NULL,直接trim(NULL)会触发PHP警告,建议先判断是否存在且不为空;
  • 另外你设置的Flashdata内容是"1 Record Deleted",但视图里还判断$msg=="error",这条件永远不会成立,估计是笔误吧?

修改后的视图代码可以改成这样:

<?php
$msg = $this->session->flashdata("msg");
// 先判断Flashdata是否存在且不为空
if (!empty($msg)) {
    // 如果是错误标记,显示错误提示
    if ($msg === "error") {
        echo "<div class='alert alert-error'> Could not delete due to database error. Please try again later </div>";
    } else {
        // 否则显示成功提示
        echo "<div class='alert alert-success'> ".str_replace("~","<br />",$msg)." </div>";
    }
}
?>

4. 控制器里的变量错误要先修复(额外提示)

你的控制器代码里$currencyName变量没定义哦,这会导致代码报错,根本执行不到设置Flashdata的步骤:

// 你得从POST数据里获取对应的货币名称,比如:
$currencyName = $this->input->post('currency_name'); // 替换成你表单里实际的字段名
$currency->setCurrencyName($currencyName);

而且你在catch块里没设置错误的Flashdata,用户看不到错误提示,建议补充下:

catch (Exception $ex) {
    $error_msg = $ex->getMessage();
    $this->session->set_flashdata("msg", "error"); // 或者直接把错误信息传过去,比如$error_msg
    redirect($_SERVER['HTTP_REFERER']);
}

5. 先测试下Flashdata的基本功能

如果以上都弄好了还是不行,可以写个简单的测试来验证Session和Flashdata是否正常工作:

  • 在控制器里加两个测试方法:
    public function test_flash()
    {
        $this->session->set_flashdata('test_msg', 'Flashdata测试成功!');
        redirect('你的控制器名/test_show');
    }
    
    public function test_show()
    {
        echo $this->session->flashdata('test_msg');
    }
    

访问你的控制器名/test_flash,如果跳转到test_show页面后能显示Flashdata测试成功!,说明Session和Flashdata功能是正常的,再回到你的代码排查其他细节问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:17:56