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
相关产品推荐
相关产品推荐

