使用flashdata和form_验证的Codeigniter

使用flashdata和form_验证的Codeigniter,codeigniter,validation,Codeigniter,Validation,我正在尝试使用codeigniter学习PHP,遇到了一个问题。我正在编写一份带有表单验证的用户注册表单。 如果用户输入已通过验证,它将检查数据库中是否已存在该电子邮件。如果它存在,它应该向用户显示一个错误。 我将此错误存储在flashdata会话变量中,并将用户重定向到注册表。但是在重定向之后,表单集合_值为空。 我希望用用户先前填写的值填充它。如果我使用$this->load->view('registration\u form')。。字段值按我所希望的方式填充,但不会显示数据库错误,因为它

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


表单_验证值(set_value())是否在重定向时消失?如果有,如何预填充字段值?

几分钟前,我刚刚在旧CI安装中添加了一个表单,出现了这个问题。有趣的是你应该提到它

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

  • 在表单有效之前不要重定向
  • $\u POST
    数组分配给flashdata(会话)变量,并在重定向后手动将其复制到
    $\u POST
    数组
  • 编写自己的函数组,使用flashdata或会话数据或其他方法处理此问题,不要使用
    set\u value()
    函数

  • 要获得最快的修复,请使用#1。我不喜欢手动设置
    $\u POST
    值,因此我并不真正认可#2,但它应该可以工作。长期使用#3。我发现经常缺少CI表单处理,我的个人表单交互代码库随着时间的推移已经增长了很多。

    如果在发布到自身的表单有效时重定向,那么肯定会丢失set\u value(),因为现在$\u POST数组中没有任何内容-这就是为什么要重定向,因此用户不会在刷新时重新提交表单

    您应该在同一控制器的回调函数中创建自己的验证规则。看这里


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

    如果我这样做,flashdata将不会包含错误消息,是吗?然后在数据库检查之后,我可能需要将错误存储在一个变量中并显示它。顺便说一句,在发布问题之后,我在form_validation中阅读了一些关于回调函数的内容。例如:$this->form_validation->set_rules('email','email Address','required | valid|email | callback|username|check');你用过吗?如果是这样,那么这样做是不是一个好主意?@DamcheyLhendup:如果您已经将错误分配给flashdata,它不会受到影响(但它不会自动为您这样做)。回调函数确实适合于检查用户是否存在——我建议使用它。在没有看到你是如何设置的情况下,很难给你具体的建议,但在一般解决方案中,我会做什么?是的,这就是我最终要做的。