Flashdata是CodeIgniter中仅存活至下一次请求的会话数据,设值后存入session,读取时自动清除;与普通session(持久存储)和tempdata(按TTL过期)机制不同,不适用于AJAX场景,且依赖session正常写入。

Flashdata 是什么,和普通 session 有什么区别
Flashdata 是 CodeIgniter 中一种「仅存活到下一次请求」的会话数据,不是永久存储,也不是临时标记(tempdata)那种带 TTL 的机制。它本质是靠两次请求间的数据搬运实现的:第一次设置后存进 session,第二次读取时自动清除。所以你调用 $this->session->flashdata('msg') 之后再刷一次页面,就拿不到了。
常见错误现象:在重定向(redirect())前设了 flashdata,但跳转后页面没显示——大概率是没在目标控制器里调用 flashdata(),或者用了 userdata() 去读;也可能是 session 库根本没加载。
- 必须先加载 session 库:
$this->load->library('session'); - 不能在 AJAX 请求中依赖 flashdata 显示提示,因为没有后续「页面级」请求来触发读取+清除逻辑
- Flashdata 不支持嵌套数组直接显示,
set_flashdata('errors', $validation_errors)可以存,但输出时得foreach或implode,不能直接echo
怎么正确设置和读取 Flashdata
设置和读取都只有一行代码,但时机很关键。典型流程是:表单提交失败 → 设置 flashdata → redirect() 回表单页 → 在视图中读取并清空。
示例:
// 控制器中(提交处理逻辑)
if ($this->form_validation->run() === FALSE) {
$this->session->set_flashdata('error_msg', validation_errors());
redirect('login');
}
// 视图中(login.php)
<?php if ($this->session->flashdata('error_msg')): ?>
<div class="alert alert-danger"><?php echo $this->session->flashdata('error_msg'); ?></div>
<?php endif; ?>
-
set_flashdata()只接受字符串键名和任意类型值(建议用字符串或一维数组) - 读取时再次调用
flashdata()就会触发自动删除,所以不要重复调用两次 - 如果想在同一次请求中“保留” flashdata 到下个请求(比如中间加了个
return跳转逻辑),用$this->session->keep_flashdata('key')
为什么 set_flashdata 后有时读不到
最常踩的坑不是语法错,而是 session 生命周期被打断。CodeIgniter 的 flashdata 依赖 session 的「写入时机」:它只在响应头发送前把数据写入底层存储(文件/DB/Redis)。如果在这之前发生以下任一情况,flashdata 就丢了。
- 控制器里提前
exit或die,导致 session 没机会写入 - 使用了
show_404()或http_response_code(404)后没再调用session_write_close() - session 配置的
sess_expiration过短(比如设成 60 秒),而用户操作慢了一拍,session 已过期 - 多级子目录部署时,
sess_cookie_path配置不对,导致 cookie 没发到正确路径,服务端收不到 session ID
验证方法:在设置 flashdata 后、重定向前,加一句 var_dump($this->session->all_userdata());,看 __ci_vars 里有没有对应 key 和标记(flash data 存在 __ci_vars 中标记为 flash 类型)。
Flashdata 和 tempdata 容易混淆的点
两者名字像,但机制完全不同:flashdata 是「请求-响应」生命周期,tempdata 是「时间戳」生命周期(TTL)。比如 $this->session->set_tempdata('token', 'abc', 300) 表示 5 分钟后自动删,不管请求几次;而 flashdata 即使 5 秒内连续刷新 10 次页面,也只在第二次有效。
- 不要用
set_tempdata()替代set_flashdata()来做表单提示——它不会自动清空,容易堆积 - 不要对同一个 key 同时用两种方式设置,
flashdata会覆盖tempdata的标记逻辑,源码里它们共用__ci_vars结构但判断分支不同 - 调试时注意:用
$this->session->flashdata()读取会清空,用$this->session->tempdata()读取不会清空,但后者要手动管理过期
真正难搞的是混合场景:比如登录成功设 flashdata 提示,同时设 tempdata 存 token,结果 token 过期了提示还在——这时候得靠业务逻辑兜底,别指望框架自动同步生命周期。


















