【问题标题】:Logic behind validating form info with PHP使用 PHP 验证表单信息背后的逻辑
【发布时间】:2009-09-07 17:16:04
【问题描述】:

我正在尝试使用 PHP 进行第一次表单验证。

我需要一些关于逻辑的指导。

我有 purchase.php(有表单)和 review-purchase.php(设置 SESSION 变量并显示输入的用户数据)

如果任何字段验证失败,我不希望用户访问 review-purchase.php

我是否应该将用户发送到 review-purchase.php 脚本,在那里检查验证,然后将带有错误消息的 purchase.php 重定向回?

我是否应该使用带有 $_SERVER['php_self'] 等形式的 if/else 语句 action="" 并在 purchase.php 页面本身上保留所有验证,并且只有在一切都通过时才让购买审核运行验证?

抱歉这个令人困惑的问题,但我自己很困惑......

【问题讨论】:

  • 我希望我能接受多个答案,因为你们都提供了帮助。

标签: php validation forms


【解决方案1】:

这是很多人问自己的问题,而且可能没有一个正确的答案......

在你的情况下,我通常做的是:

  • purchase.php 显示表单
  • 该表单自己发布帖子(即purchase.php
  • 当数据提交后,处理--仍在purchase.php
    • 如果出现错误(比如输入中的某些内容不正确),您可以非常轻松地重新显示表单,这样:您已经拥有用户输入的每个值
    • 如果没有错误,您可以对数据进行任何操作;比如在会话中设置它,如果你需要的话,或者将它保存到数据库中。
  • 只有在一切正常时(数据验证正常且存储正常),您才会重定向到“confirm.php
    • 该确认页面除了显示“感谢您的购买”消息或类似内容外,什么都不做。


这意味着在您的purchase.php 中添加更多内容,是的:

  • (重新)显示表单
  • 处理输入

但是,通过这种方式,当出现验证错误时,重新显示表单确实更容易,预先填写用户首次键入的内容。

不过,您可以使用函数/类/方法,甚至一些包含的文件,以免最终得到一大块不可读/不可维护的代码...

如果您的表单发布到另一个页面,重新显示表单会非常困难......如果您使用重定向,您将传递 URL 中的所有内容,这将是一团糟(也有大小限制)


在这里,这意味着我将完全删除您的 review-purchase.php 文件;并将其转换为确认页面,以便用户知道一切正常,并且正在处理他的购买。

我想这就是你在上一段中的意思,实际上:-)


请注意:在将数据注入表单之前,您必须考虑转义数据(请参阅htmlspecialchars 和/或htmlentities);对于您从用户那里获得的一切都是如此(我想说,PHP_SELF 可能也是如此) ;-)

【讨论】:

  • 这很有意义,而且听起来比我尝试做的要简单得多。但是假设我想在 confirm.php 进行验证,我将如何将用户发送回原始表单?有没有比 header() 更有效的方法; ?
  • 如果在confirm.php上进行验证,除了用标头重定向使用之外,我真的没有看到其他选择(顺便说一句,使用http_build_query会有所帮助);;或从 confirm.php 重新显示表单,包括一些包含在内;;但这不是我认为更简单的方法。
  • 谢谢帕斯卡,你帮我理解了很多,但我不得不接受另一个答案,因为这是我最后使用的逻辑。
【解决方案2】:

好吧,您似乎对 PHP 代码的执行位置和时间有一个误解。如果你想在服务器端验证用户输入 - 使用 PHP(你应该这样做,因为恶意用户可以解决客户端上的任何 JavaScript 验证) - PHP 验证只能在用户发布数据后进行。这与用户将数据发布到哪个页面无关 - 无论是原始表单还是其他页面。

因此,在您的情况下,如果您希望用户在验证成功后转到某个页面,而在验证失败时转到另一个页面,则无论如何您都需要进行重定向。

在这种情况下,您有两条路径:

  • 用户请求Purchase.php并填写表格
  • 用户将数据发布到验证页面
  • 如果数据有效 -> 显示购买评论信息
    else -> 重新显示表单页面并让用户重新输入数据

因此,如果 Purchase.php 发布到自己,您可以在那里验证并仅在数据有效时重定向到 review.php。这意味着在成功的情况下您会进行 2 次重定向,而在失败的情况下您只会进行 1 次发布。

另一方面,如果您直接发布到 review.php 并在那里进行验证,那么您有 1 个帖子在成功的情况下,2 在失败的情况下。

无论您如何旋转,以上都是正确的 - 除非您对表单和评论使用相同的 URL,在这种情况下,您可以将逻辑放在同一个地方以成功进行表单、验证和购买评论案例。

我希望这会有所帮助。

【讨论】:

  • 我喜欢这个逻辑,因为我可以将它与我当前的表单设置方式一起使用。
【解决方案3】:

最常见的方法是在purchase.php 中进行所有验证检查。这样,如果出现验证错误,就可以更轻松地重新显示包含用户已经输入的所有信息的表单。

如果验证通过,您可以重定向到review-purchase.php,并在数据库中设置必要的购买信息,或者如果您不使用数据库,也可以重定向到$_SESSION

如果您可以将验证代码分离到函数中,并将显示代码分离到要包含的模板中,那么您可以实现很好的逻辑分离,从而使您可以从所使用的任何文件中使用它们。您可能可以通过这种方式避免重定向,即。在purchase.php 中,您可以检查是否有 $_POST 输入,对其进行验证,然后重新显示表单模板或显示购买评论模板。

【讨论】:

  • 很好的提示,因为我对自我处理的主要关注是它变得多么混乱。
猜你喜欢
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多