我正在尝试使用codeigniter学习PHP,遇到了一个问题。我正在写一份带有表单验证的用户注册表。
如果用户输入已通过验证,则它将检查数据库(如果电子邮件已存在于数据库中)。如果存在,则应向用户显示错误。
我将此错误存储在flashdata会话变量中,并将用户重定向到注册表单。但重定向后,表单set_values为空。
我希望用早先用户填写的值填充它。如果我使用$this->load->view('registration_form')
..字段值按我的意愿填充,但数据库错误没有显示,因为它不是新的服务器调用。
form_validation值(set_value())是否会在重定向上消失?如果是,我该如何预填充字段值?
答案 0 :(得分:2)
如果您在发布到自身的表单有效时重定向,那么您将丢失set_value(),因为$ _POST数组中现在没有任何内容 - 这就是您重定向的原因,因此用户不会重新提交表单在刷新。
您应该在同一个控制器的回调函数中创建自己的验证规则。见http://codeigniter.com/user_guide/libraries/form_validation.html#callbacks
您需要做的是将电子邮件传递给回调中的模型,该模型将根据您的数据库检查电子邮件,如果已存在则返回false。这样,如果电子邮件已经存在,您的表单将无效并且不会重定向。
答案 1 :(得分:1)
我刚刚在几分钟之前将一个表单添加到旧的CI安装中并遇到了这个问题。你应该提一下这很有趣。
由于set_value()
和相关函数仅读取$_POST
数据,因此刷新后它们不会保留该值。您有几个选择:
$_POST
数组分配给flashdata(会话)变量,并在重定向后手动将其复制到$_POST
数组set_value()
函数。要获得最快的修复,请使用#1。我不喜欢手动设置$_POST
值,所以我并不认可#2,但它应该有效。从长远来看 - 使用#3。我发现CI表单处理经常缺乏,随着时间的推移,我的个人表单交互代码库已经增长了很多。