【问题标题】:CodeIgniter flashdata incoerenceCodeIgniter flashdata 不一致
【发布时间】:2014-05-21 14:26:04
【问题描述】:

所以,我已经为此苦苦挣扎了一段时间,但无济于事。我的研究也没有太大帮助。就是这样:我构建了一个测试,以防止人们通过直接在 url 中键入地址而不需要更改注册表的 id 来访问模块的更改页面(因此在数据库中造成麻烦)。简单来说就是在数据库中搜索url中作为参数传递的id;如果匹配,则继续,否则,我重定向到主模块页面,并通过 flashdata 传递错误消息。如果未定义来自不同表的字段(因为两者都需要它才能工作,因为表是相关的),我会使用类似的过程来阻止注册表的插入/更改。我在 Controller 中所做的一个粗略示例是:

if(is_numeric($id)) $search=$this->model_foo->search($id);
else
{
  $this->session->set_flashdata('error_message','not numeric');
  redirect('myurl/index','refresh');
}
if($search->num_rows()==0)
{
  $this->session->set_flashdata('error_message','not found');
  redirect('myurl/index','refresh');
}
$search=$this->model_foo2->list();
if ($search->num_rows()==0)
{
  $this->session->set_flashdata('error_message','other table empty');
  redirect('myurl/index','refresh');
}

而我的观点(索引)是这样的:

<?php
 $error=$this->session->flashdata('error_message');
 $success=$this->session->flashdata('success_message'); /*success_message goes after a successful inset/update*/
 if ($error!="")echo $error;
?>

所以这是问题所在:成功消息正常显示(我检查并仔细检查,它们在控制器中的声明方式与错误消息完全相同),以及“非数字”消息,但不是“未找到”和“其他表为空”。我对此感到非常困惑,因为 flashdata 似乎在某些情况下有效,而在其他情况下无效,这特别奇怪,因为 flashdata 的声明方式几乎相同... =/ 对不起,如果我不是很清楚,这是我在这里的第一篇文章,所以(尽量)耐心等待;D 提前感谢您在这件事上的任何帮助。

编辑:找出问题的根源。这与我的浏览器缓存存储有关。重新启动我的机器并清理缓存,输出就像一个魅力。感谢所有的帮助。

【问题讨论】:

  • 你检查过flashdata是否真的被设置了吗?尝试打印 $this->session->all_userdata();exit; $this->session->set_flashdata('error_message','not found');并检查那里的值...
  • 其实我不认为 print $this->session->all_userdata();exit;会起作用的,可能 $this->session->flashdata('error_message');exit;...我只是想确保在重定向之前设置了该值。
  • 您可能想尝试在重定向中不使用“刷新”选项 - 这可能会干扰闪存数据。
  • @pecci,我确实对此进行了一些测试。 “未找到”的 flashdata 确实没有被设置,但“不是数字”是,女巫再次是最尴尬的,因为我设置它们的方式几乎相同......我几乎可以肯定我正在设置使用正确语法的“未找到”,但仍然没有设置。有什么想法吗?
  • @SamDufel,我在系统的几乎所有模块中都使用 flashdata 运行刷新,但没有一个显示出问题的迹象。此外,有效的消息也设置在“刷新”重定向之前

标签: php codeigniter session


【解决方案1】:

所以,我只是稍微改进了您的代码,以便您可以尝试调试...

控制器:

$arr = array('error_message' => '');
if(!empty($id) && is_numeric($id)) {
  $search=$this->model_foo->search($id);

  if($search->num_rows()==0) {
    $arr['error_message'] = 'not found';
  } else {
    $search=$this->model_foo2->list();
    if ($search->num_rows()==0) {
      $arr['error_message'] = 'other table empty';
    }
  }
} else {
  $arr['error_message'] = 'not numeric';
}

$this->session->set_flashdata($arr);
redirect('myurl/index');

查看(相同):

<?php
 $error=$this->session->flashdata('error_message');
 $success=$this->session->flashdata('success_message'); /*success_message goes after a successful inset/update*/
 if ($error!="")echo $error;
?>

尝试一下,在检查消息是否出现之前,请确保设置了 flashdata。

【讨论】:

  • 试过了,还是一样的结果。还运行了测试,消息未显示的时间是因为未设置 flashdata
  • @luck_ponte,我对代码做了另一个更改,我在我的项目中使用了这样的方法,试一试...这种方式对我有用...
  • 很奇怪,问题仍然存在...再次检查是否设置了 flashdata,“未找到”并没有发生...
猜你喜欢
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多