我在登录表单中遇到了一个关于代码点火器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请求,但当你重定向时,它会提交。