使用PHP验证表单信息的逻辑

时间:2009-09-07 17:16:05

标签: php validation forms

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

我需要一些逻辑指导。

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

如果任何字段未通过验证,我不希望用户进入review-purchase.php

我应该将用户发送到review-purchase.php脚本,检查那里的验证,然后重新定向buy.php并显示错误消息吗?

我应该在表单action =“”中使用带有$ _SERVER ['php_self']等的if / else语句,并在purchase.php页面上保留所有验证,并且如果一切都通过则只允许购买评论运行验证

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

3 个答案:

答案 0 :(得分:4)

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

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

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


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

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

但是,通过这种方式,当出现验证错误时,重新显示表单非常容易,预先填充了首次输入的内容。

你可以使用函数/类/方法甚至一些包含的文件,但最终不会有一大块不可读/不可维护的代码......

如果您的表单发布到另一个页面,重新显示表单将会非常困难......如果您正在使用重定向,那么您将传递URL中的所有内容,这将是一团糟< em>(并且还有尺寸限制)


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

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


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

答案 1 :(得分:1)

最常见的方法是在purchase.php中进行所有验证检查。这样,如果存在验证错误,则更容易使用用户已输入的所有信息重新显示表单。

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

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

答案 2 :(得分:1)

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

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

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

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

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

另一方面,如果您直接发布到review.php并在那里验证,则在成功案例中有1个帖子,在失败案例中有2个帖子。

无论你如何旋转它都是如此 - 除非你在表格和评论中使用相同的URL,在这种情况下你可以将逻辑放在同一个地方,以便在成功时进行表格,验证和购买评审情况下。

我希望这会有所帮助。