2012-02-21 27 views
1

我在我的登录表单中出现codeigniters flashdata这个奇怪的问题。当我提交包含错误的表单时(无法识别的电子邮件或错误的电子邮件密码组合),需要两次提交错误消息才能显示。下面是相关的代码: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:new:emaili_error] => 1)时设置了flashdata,但我的错误消息未显示。但是,当我再次提交表单(重新发送相同的数据)时,显示错误消息。

任何想法,为什么这可能是?

回答

3

是;不要被他们使用的名称所迷惑,Codeigniter中的“会话”是cookie(它们不是原生php $ _SESSION数组的特殊功能,并且它们不使用它.Infact,全局数组通常被销毁在CI中)。因此,它们仅在随后的请求中可用;当您加载视图时,刚刚设置了Cookie:您需要发出另一个请求,以便浏览器抓住并显示它。

通常使用flashdata,实际上,当你想要持续 2个http请求之间的东西,而不是在你设置它们并加载视图的同一个请求中。

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

+0

但我在第一次看到会话数组中设置的相关会话数据。这是预期的吗?那么在这种情况下不使用flashdata会更好吗?我想知道在这种情况下重定向是否是常见做法......因为这看起来确实起作用 – 2012-02-21 20:54:36

+0

如果你需要flashadata,是的,你需要重定向。否则,它们是无用的,因为你也可以直接打印消息。你不觉得吗? – 2012-02-21 21:08:00

2

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

+0

谢谢鲶鱼。 – 2012-02-21 21:11:09