Codeigniter使用flashdata和form_validation

时间:2011-06-04 11:22:22

标签: codeigniter validation

我正在尝试使用codeigniter学习PHP,遇到了一个问题。我正在写一份带有表单验证的用户注册表。 如果用户输入已通过验证,则它将检查数据库(如果电子邮件已存在于数据库中)。如果存在,则应向用户显示错误。 我将此错误存储在flashdata会话变量中,并将用户重定向到注册表单。但重定向后,表单set_values为空。 我希望用早先用户填写的值填充它。如果我使用$this->load->view('registration_form') ..字段值按我的意愿填充,但数据库错误没有显示,因为它不是新的服务器调用。

form_validation值(set_value())是否会在重定向上消失?如果是,我该如何预填充字段值?

2 个答案:

答案 0 :(得分:2)

如果您在发布到自身的表单有效时重定向,那么您将丢失set_value(),因为$ _POST数组中现在没有任何内容 - 这就是您重定向的原因,因此用户不会重新提交表单在刷新。

您应该在同一个控制器的回调函数中创建自己的验证规则。见http://codeigniter.com/user_guide/libraries/form_validation.html#callbacks

您需要做的是将电子邮件传递给回调中的模型,该模型将根据您的数据库检查电子邮件,如果已存在则返回false。这样,如果电子邮件已经存在,您的表单将无效并且不会重定向。

答案 1 :(得分:1)

我刚刚在几分钟之前将一个表单添加到旧的CI安装中并遇到了这个问题。你应该提一下这很有趣。

由于set_value()和相关函数仅读取$_POST数据,因此刷新后它们不会保留该值。您有几个选择:

  1. 在表单有效之前不要重定向。
  2. $_POST数组分配给flashdata(会话)变量,并在重定向后手动将其复制到$_POST数组
  3. 使用flashdata或会话数据或其他方法编写您自己的一组函数来处理此问题,并且不要使用set_value()函数。
  4. 要获得最快的修复,请使用#1。我不喜欢手动设置$_POST值,所以我并不认可#2,但它应该有效。从长远来看 - 使用#3。我发现CI表单处理经常缺乏,随着时间的推移,我的个人表单交互代码库已经增长了很多。