带有表单验证的表单提交预览 (PHP)

Posted

技术标签:

【中文标题】带有表单验证的表单提交预览 (PHP)【英文标题】:Form submission preview with form validation (PHP) 【发布时间】:2016-12-04 11:59:26 【问题描述】:

这听起来像是一个愚蠢的问题,所以我先道歉。

我有一个 php 表单,它的动作发布到自己,所以我可以做一些验证以确保选择文本框、几个复选框和几个单选按钮。在确认没有表单错误后,我需要让用户预览他们输入的内容,然后再让他们将信息提交到数据库。

对于预览表单提交的详细信息,从逻辑上讲 page1.php 应该有 <form action="page2.php"> 而 page2.php 将允许用户预览他们提交的内容。

但是对于表单验证,从逻辑上讲,表单应该提交给自己,以便它可以验证在同一页面上输入的所有必填字段。

那么,有没有一种方法可以在表单通过提交自身进行验证后将用户引导到“下一页”,以便他们可以预览信息?


注意: 我正在重写一个经典的 ASP 表单,它是这样做的:

if errorMsg = "" then
  response.redirect "verify.asp"
else
  session("errorMsg") = errorMsg
  response.redirect "default.asp"
end if

我假设在 PHP 的情况下,类似条件的“else”部分是不必要的,因为它已经发布到自身,只有当错误消息数组为空时,它才应该重定向到验证页面。

【问题讨论】:

【参考方案1】:

您可以使用header 执行重定向:

if(empty($errorMsg)) 
  header("Location: verify.php");
  exit;

【讨论】:

实际上,经过进一步检查,这是行不通的。 PHP 文档说必须在发送任何输出之前 使用标头函数。我相当肯定我的代码是在打开<html> 之后出现的,这会导致错误。 但这确实让我知道我需要看哪里。我发现没有 php 重定向替代方案,推荐的方向是使用 javascript 和元标记,如果禁用 javascript,元标记将说明。 @Tiffany 在输出任何 html 之前不能完成表单处理不应该是有原因的。更一般地,以这种方式将页面发布到自身可能会导致其他问题(例如,如果用户使用浏览器的后退按钮返回页面,浏览器将提示用户重新发布/重新发送表单)。除了使用已建立的框架发布到单独的文件来处理表单和执行重定向之外,这将是一个更好的选择。 那么你会如何推荐在不同的页面上进行表单验证呢?我不反对张贴到verify.php,但前提是我能够在去verify.php 之前验证同一页面上的表单。我不想使用 javascript 来验证表单,以防 javascript 被禁用。 这也可能是一个问题:我的逻辑流程是否正确?因为我必须包含一个 config.php 文件,然后在我开始表单验证之前有几个函数和变量定义。我的一个函数调用打开<html> 标记并准备HTML 页面的其余部分。我想我可以在完成所有表单验证后移动该函数调用,这样可以减少使用标头函数调用的干扰。【参考方案2】:

使用 Mark Heintz 的回答和一些谷歌搜索,我发现最好的方法是结合使用 Javascript 和元标记。元标记将说明何时禁用 javascript。

Redirect in PHP without use of header method

Redirecting to a relative URL in JavaScript

还有一种 AJAX 方式:Modify the URL without reloading the page

【讨论】:

元刷新和 javascript 重定向不能很好地替代服务器发起的重定向,因为浏览器必须在重定向到下一个页面之前开始接收/解析页面。如果这是您的意图,引用的 URL 修改实际上不会将您导航到其他页面。 AJAX/XHR 表单处理完全是另一种动物。

以上是关于带有表单验证的表单提交预览 (PHP)的主要内容,如果未能解决你的问题,请参考以下文章

jquery中表单提交,怎么打开新页面?

php通过token验证表单重复提交

php form提交账户密码 怎么写验证

使用 laravel 提交带有验证的模态表单

PHP表单提交失败,如何返回原值?

带有验证和多个表单处理的 Django Ajax 提交