flashdata错误无法显示

时间:2012-02-21 20:41:56

标签: php codeigniter

我在登录表单中遇到了codeigniters flashdata这个奇怪的问题。当我提交表单中有错误(无法识别的电子邮件或错误的电子邮件密码组合)时,需要两次提交才能显示错误消息。这是相关的代码:

//If an email address is matched
if($rowcount === 1) {
    $row = $query->row();
    if (hash('sha1', $row->salt . $_POST['password']) === $row->password) {
        //there's a matching user...create a session here and redirect to homepage  
    } else {
        $this->session->set_flashdata('credentials_error', '1');
    // echo 'recognise email but not password';
    }
} else {
    //send message back to view here
    $this->session->set_flashdata('email_error','1'); 
 }

 print_r($this->session);
 $global_data['page_data'] = $this->load->view('login-template','',true);
 $this->load->view('global', $global_data);

以及视图中的相关位:

if($this->session->flashdata('email_error')) {
    echo '<p class="error">We dont recognise this email address.</p>';
}

if($this->session->flashdata('credentials_error')) {
    echo '<p class="error">We dont recognise these details. Please try again.</p>';
}

因此,如果我提交的表单中包含一个无法识别的错误电子邮件地址,那么我会设置email_error flash数据。问题是在视图中我可以看到当我打印出所有会话数据([flash:new:emaili_error] =&gt; 1)时设置了flashdata但我的错误信息没有显示。但是,当我再次提交表单(重新发送相同的数据)时,会显示错误消息。

为什么会出现这种情况?

2 个答案:

答案 0 :(得分:3)

是;不要被他们使用的名称所迷惑,Codeigniter中的“会话”是cookie(它们不是本机php $ _SESSION数组的花哨等价物,它们不使用它.Inf act,全局数组通常被破坏在CI)。因此,它们仅在随后的请求中可用;当您加载视图时,刚刚设置了cookie:您需要再次发出请求,以便浏览器捕获并显示它。

实际上,当你想要在两个http请求之间持久某些内容时,通常使用flashdata,而不是在你设置它们的同一请求中加载视图。

您发送表单,进行检查,然后使用错误设置flashdata,并在同一过程中加载视图。 flashdata仅在codeigniter的类中“设置”。当您重新提交表单时,cookie现在可用,因此您将看到该消息。希望它更清楚。

答案 1 :(得分:2)

我总是重定向而不是加载视图以使我的flashdata正常工作。加载视图时,它不会提交新的http请求,但是当您重定向时,它就是。