2009-11-22 49 views
4

我一直在搜索这个主题,因此很头疼,没有找到。良好的PHP设计和流程 - 提交后保留表单值

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

是否有一个很好的方法/流/设计来实现这种回发后的值保留?另外我需要考虑默认值,数据库中的值和回发中的值 - 哪一个优先?

此外,我希望遵循Post-Redirect-Get并使用相同的表单。

我曾想过的是:

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

回答

10

这是我平时的工作流程:

一个POST失败I输出形式后马上不重定向到初始表单页面。这是很容易完成任何体面的模板系统。然后,您可以使用POST的数据重新填充表单。

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

如果当前的代码库正在使用重定向,您可以简单地include()想要的表单/视图文件在后处理中的偶然点。

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

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

如果数据足够小(对于cookie,在4k以下),请将其填充到浏览器cookie中,以便在您的脚本可以验证每个字段之前不必存储任何内容。

至于默认值,用户输入应始终优先,否则如果输入任何不验证的默认值,将保持覆盖。

一对夫妇的优势,使用cookie的方法和重定向到一个GET形式:

  1. 你避免“数据必须重新提交以继续”的帖子
  2. 后立即显示纠正格式的消息用户常常点击后退按钮而不会想到他们看到错误时,Cookie允许您预先填写表单,直到成功提交发生为止(或任何放弃的期满),这更直观
+0

我们总是不假定数据是那么小?无论如何,我确实有10k字节限制的表格。如果我将它存储到Cookie中,每当我的脚本被调用时,cookie都会被发送。因此放缓。 – mauris 2009-11-22 08:11:28

+0

如果它超过了cookie的大小限制,那么您必须使用其他方式。将值存储在服务器端会话交易请求速度中,无需担心将提交存储在服务器上,直到它可以接受为止。在某处存储用户输入 - 无论是客户端还是服务器 - 始终允许您创建比直接响应POST更好的用户体验。 – scribble 2009-11-22 16:09:59

2

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

有一个我想补充的调整。

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

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

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

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

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

Ian