flash数据错误未显示


flashdata error not displaying

我在登录表单中遇到了一个关于代码点火器flash数据的奇怪问题。当我提交表单时出现错误(未识别的电子邮件或错误的电子邮件密码组合),需要两次提交才能显示错误消息。这是相关代码:

//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闪存数据。问题是,在视图中,当我打印出所有会话数据时,我可以看到flashdata已设置([flash:new:emaili_error]=>1),但我的错误消息没有显示。然而,当我再次提交表单(重新发送相同的数据)时,会显示错误消息。

有什么想法吗?

是;不要被他们使用的名称所欺骗,Codeigniter中的"sessions"是cookie(它们不是原生php$_SESSION数组的高级等价物,他们也不使用它。实际上,全局数组通常在CI中被销毁)。因此,它们只能在后续请求时使用;当你加载视图时,cookie刚刚设置好:你需要发出另一个请求,以便浏览器赶上并显示它。

通常使用flashdata,事实上,当你想在两个http请求之间保持时,而不是在同一个请求中设置它们并加载视图。

碰巧你发送了一个表单,进行了检查,然后设置了带有错误的flash数据,在同一过程中加载了一个视图。flashdata仅在codeigniter的类中"设置"。当您重新提交表单时,cookie现在可用,因此会向您显示消息。希望它更清楚。

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