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