3

我一直在阅读 PHP 表单处理教程,他们建议在表单中使用隐藏字段,以便 PHP 可以使用类似的东西IF ($_POST['hidden_field'] == whatever来检测表单是已提交还是仅显示。

但是在XDebug开始使用 Notepad++ 并单步执行代码并观察变量之后,我不清楚为什么我们不能IF ($_POST['submit_button'] == 'Ok')完全取消隐藏字段。

毕竟,似乎没有时间设置隐藏字段而不设置其他表单字段(即使它们是空的)。第一次,在显示表单时,在提交之前,$_POST变量已经存在,但它是空的。我想我们也可以用它IF (!empty($_POST))来查看表单是否已提交?

是否存在我遗漏的特殊情况,其中隐藏字段是检测表单提交所必需的?

编辑:好的,我缺少的特殊情况需要隐藏字段似乎是这样的。http://www.vbforums.com/showthread.php?562749-PHP-Checking-if-a-form-has-been-submitted-the-correct-way看来如果你按 Enter 提交表单, $_POST 变量不会包含提交按钮的值。Chrome 似乎没有这样的行为,但也许其他浏览器会这样做。

4

6 回答 6

6

是否存在我遗漏的特殊情况,其中隐藏字段是检测表单提交所必需的?

要检测表单提交,您不需要表单中的隐藏字段,但有时它被用作垃圾邮件保护。例如,如果您在表单中放置一个隐藏字段,例如

<input type="text" name="humans" id="humans" class="humans" />

您可以使用 css 类来隐藏文件,例如

.humans { display: none; }

当您检查表单提交时,您还可以检查该字段是否为空,例如

if(!empty($_POST['humans'])) {
// it's spam
}
else {
// it's human
}

因为,bots/spammers(使用自动脚本)可以提交表单并且基本上script尝试填写所有字段并且不知道您设置的隐藏字段来捕获它,这样您就可以确定它是由人提交还是机器人。您可以阅读本文以获取更多信息并更好地了解垃圾邮件拦截。

于 2013-09-22T00:15:17.037 回答
5

不,你有正确的想法。

但是,我不建议这样做 - 听起来编写本教程的人有点新手。;) 如果您已经在表单中使用 POST,我会坚持使用更传统(更简单)的方法来检测表单是否已提交,或者是否有人只是通过 HTTP 方法($_SERVER ['REQUEST_METHOD'],在 PHP 中为“GET”或“POST”)。

于 2013-09-22T00:01:46.417 回答
1

当您必须有其他字段来检查您是否首先有表单时,为什么要实施 [hidden] 字段来检查表单是否已提交。
除了检查是否提交之外,隐藏字段是多余的,因此只是毫无意义的额外代码。

如果您在页面上有多个表单,请命名提交按钮,如果只有一个,只需检查 if $_POST isset(),然后进行验证数据等

您可以!empty($_POST)改用,但我尽量避免这种情况(取决于场景),因为我想告诉用户他们没有输入任何内容,否则用户点击提交,它只是再次让他们成为空白表单。

当然,他们可能会知道他们在胡闹,但也许他们认为自己输入了一些东西,原因有很多。
让用户得到评价总是好的,尤其是对他们的任何潜在错误。

于 2013-09-22T00:08:20.613 回答
1

使用隐藏字段来检查表单是否已提交没有区别。

但是,假设您要动态发布一个没有理由在表单中显示的值。例如,您有一个$user包含用户所有数据的数组。用户提交表单,您$user['id']在提交后作为隐藏字段传递以使用他们的 id。

或者,您通过 IP 或其他方式找到他们的语言,并将其作为隐藏字段传递,以用他们的语言显示消息。

于 2013-09-22T00:21:00.203 回答
0

虽然我自己不这样做,但我会说curl在常规浏览器之外破坏或其他访问站点的方法可能很有用 - 当然隐藏字段必须因每个请求而异。

于 2013-09-22T00:04:07.053 回答
0

是的,有多种使用隐藏字段来验证提交

  • 正如您所提到的,区分表单视图和提交。
  • 正如@kingkero 提到的,一种阻止机器人自动提交表单的方法。

在编辑现有记录的情况下

  • 定位原始记录需要一个主键,它应该被隐藏,这样用户就不能改变它
  • 您可以在发送到浏览器之前将旧数据保存在服务器端的某个位置,然后将该数据的引用键作为隐藏字段发送,稍后它可用于比较新旧数据以确定已更改的内容。
  • 在多用户系统中,如果多个用户同时选择编辑和保存特定记录,那么他们有可能互相覆盖!!为了防止这种情况,可以使用隐藏字段来确定并通知用户在表单加载和提交期间所选记录是否已更改。
于 2013-09-22T00:38:43.717 回答