为什么使用隐藏字段来检测表单提交?

时间:2013-09-21 23:56:29

标签: php forms

我一直在阅读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似乎没有这种行为,但也许其他浏览器会这样做。

6 个答案:

答案 0 :(得分: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会尝试填充所有字段,并且不知道您为了捕获它而隐藏的字段这样你就可以确定它是由人类还是机器人提交的。您可以read this article获取更多信息并更好地了解垃圾邮件阻止功能。

答案 1 :(得分:5)

不,你有正确的想法。

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

答案 2 :(得分:1)

为什么要实施[隐藏]字段以检查表单是否已提交,如果您首先有表格,则必须有其他字段进行检查。
除了检查是否提交之外,隐藏字段是多余的,因此只是无意义的额外代码。

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

您可以使用!empty($_POST)代替,但我尝试避免这种情况(取决于方案),因为我想告诉用户他们没有输入任何内容,否则用户点击提交,它只是再次显示空白表单。

当然,他们可能知道他们正在搞乱,但也许他们认为他们输入了一些东西,原因很多。
总是很好地保持用户的评价,特别是他们可能犯的任何错误。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

以及编辑现有记录时

  • 找到原始记录需要主键,并且应该隐藏它以便用户无法更改
  • 您可以在发送到浏览器之前将旧数据保存在服务器端的某个位置,然后将该参考密钥作为隐藏字段发送到该数据,稍后它可用于比较新旧数据以确定已更改的内容。
  • 在多用户系统中,如果有多个用户同时选择编辑并保存特定记录,那么他们就有可能覆盖彼此!为防止出现这种情况,如果在表单加载和提交期间更改了所选记录,则可以使用隐藏字段来确定并通知用户。