PHP的良好设计和流程 - 提交后保留表单值

时间:2009-11-22 07:01:20

标签: php forms

我一直在搜索关于SO的这个主题,而且找不到它就很头疼。

我已经开发了一段时间的网站,发现目前的问题是在回发后,如果提交有任何错误并且用户重定向回到表单,则表单值全部消失。

有没有好的方法/流程/设计实现,以便在回发后保留值?另外,我需要考虑默认值,数据库中的值和回发中的值 - 那么哪一个优先?

此外,我希望关注Post-Redirect-Get并使用相同的表格。

我想到的是:

  1. 使用唯一ID标识每个表单
  2. 提交后,使用表单的唯一ID
  3. 将所有数据保存到会话中
  4. 再次请求表单时,请显示表单中的值。
  5. 如果成功提交,请清除会话中的数据。

3 个答案:

答案 0 :(得分:10)

这是我通常的工作流程:

POST失败后我立即输出表单而不重定向到初始表单页面。使用任何体面的模板系统都很容易实现。然后,您可以使用POST数据重新填充表单。

如果表单绑定到视图(作为MVC模式的一部分),您可以初始化默认值并从数据库加载模型(填充下拉菜单等) - 重用整个显示/前端逻辑。

如果当前代码库使用重定向,您可以在回发处理的偶然点处include()简单地{{1}}所需的表单/视图文件。

那它是如何运作的?简而言之:

  • 定义初始默认值&用户选择来自模型,数据库和配置。
  • 使用用户提交的$ _POST数据覆盖任何默认值。
  • 消毒输出
  • 重复,直到验证用户输入为止。

答案 1 :(得分:2)

第一个答案是否已将其固定 - 如果帖子未通过验证,请使用错误消息重新生成表单/编辑页面,以便用户可以更正它们并重新提交。 (不要指望他们按“后退”键)。

我想补充一下进一步的调整。

当帖子通过验证并且数据库已更新时,然后将浏览器重定向到页面以显示刚刚更新的数据。这实现了三件好事。

a)如果更新数据库时出现问题,这将显示数据库中的数据,而不是您在变量中留下的数据,因此测试中的问题将非常明确。

b)显示数据库中的数据可让用户确信事情确实按预期发生。

c)如果用户点击远离此页面的链接,然后使用后退按钮返回,则会再次显示数据,而不是重新提交数据的问题。这更符合用户的期望,并且将避免数据库的双重更新。

注意 - 您必须小心重定向。 referer变量将告诉您用户在浏览器窗口中实际拥有的站点。如果他正在使用SSH隧道,这可能不是您所期望的。

伊恩

答案 2 :(得分:0)

如果数据足够小(用于cookie的4k以下的数据?),请将其填入浏览器cookie,这样您就不必存储任何内容,直到您的脚本可以验证每个字段为止。

对于默认值,用户输入应始终优先,否则如果输入的内容无法验证,则默认值将被覆盖。

使用cookie方法和重定向到GET表单有几个好处:

  1. 您可以避免在POST后立即显示更正表单的“必须重新提交数据才能继续”的消息
  2. 用户通常会在没有想到错误的情况下单击后退按钮,cookie允许您预先填充表单,直到成功提交发生(或者您提交的任何到期时间用完),这更加直观