2011-06-04 94 views
1

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

form_validation值(set_value())在重定向上消失吗?如果是这样,我如何预先填充字段值?

回答

2

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

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

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

+0

是的,这就是我最终做的。 – WebNovice 2011-06-04 18:50:24

1

我只是在几分钟前将一个窗体添加到旧的CI安装中,并且出现此问题。你应该提到它很有趣。

由于set_value()及相关函数只读取$_POST数据,所以刷新后它们不会保留该值。你有几个选择:

  1. 不要重定向,直到表单有效。
  2. 分配$_POST阵列到flashdata(会话)变量,和重定向
  3. 自己写的功能组与任一flashdata或会话数据或其它的方法来处理这后手动将其复制到$_POST阵列,和Don不使用set_value()函数。

为了最快速的修复,请使用#1。我不喜欢手动设置$_POST的值,所以我并不真正支持#2,但它应该起作用。从长远来看 - 使用#3。我发现CI表单处理通常是缺乏的,而且我的个人表单交互代码库已经随着时间的推移而增长很多。

+0

如果我做#1,flashdata将不包含错误消息,是吗?那么在数据库检查之后,我可能需要将错误存储在一个变量中并显示它。顺便提一下,在发布问题后,我读了一些关于form_validation中的回调函数。 例如:$ this-> form_validation-> set_rules('email','电子邮件地址','required | valid_email | callback_username_check');你有没有使用它?如果是这样,这样做是个好主意吗? – WebNovice 2011-06-04 12:34:33

+0

@DamcheyLhendup:如果您已经将错误分配给flashdata,它将不会受到影响(但它不会自动为您执行此操作)。回调函数确实适用于检查用户是否存在 - 我会推荐它。没有看到你是如何设置的,很难给你具体的建议,但总的来说,解决方案#1是我该做的。 – 2011-06-04 12:43:07

相关问题