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

Php 为什么使用隐藏字段来检测表单提交?,php,forms,Php,Forms,我一直在阅读PHP表单处理教程,他们建议在表单中使用一个隐藏字段,这样PHP就可以使用类似于IF($\u POST['hidden\u field']==which的东西来检测表单是提交的还是只显示的 但是,在使用Notepad++使用XDebug并逐步执行代码并观察变量之后,我不清楚为什么我们不能直接使用IF($\u POST['submit\u button']='Ok')并完全删除隐藏字段 毕竟,在没有设置其他表单字段的情况下设置隐藏字段似乎是不存在的(即使它们是空的)。从第一次到第二次,

我一直在阅读PHP表单处理教程,他们建议在表单中使用一个隐藏字段,这样PHP就可以使用类似于
IF($\u POST['hidden\u field']==which
的东西来检测表单是提交的还是只显示的

但是,在使用Notepad++使用
XDebug
并逐步执行代码并观察变量之后,我不清楚为什么我们不能直接使用
IF($\u POST['submit\u button']='Ok')
并完全删除隐藏字段

毕竟,在没有设置其他表单字段的情况下设置隐藏字段似乎是不存在的(即使它们是空的)。从第一次到第二次,当表单被显示到提交之前,
$\u POST
变量已经存在,但它是空的。我想我们也可以使用
if(!empty)($_POST))
查看表单是否已提交

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


编辑:好的,我缺少的特例是这样的,需要隐藏字段。如果按Enter键提交表单,$\u POST变量将不包括提交按钮的值。Chrome似乎没有这样做,但其他浏览器可能会这样做。

不,你的想法是正确的


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

虽然我自己不这么做,但我想说,破坏
curl
或在常规浏览器之外访问站点的其他方法是很有用的——当然,隐藏字段必须随每个请求而不同。

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

如果页面上有多个表单,请命名“提交”按钮,如果只有一个,只需检查是否
$\u POST
isset()
,然后开始验证数据,等等

你可以使用<代码>!空($POST)< /C> >,但是我尽量避免这个(取决于场景),因为我喜欢告诉用户他们没有输入任何东西,否则用户点击提交,然后再次将它们填空。 当然,他们可能知道自己在胡闹,但可能出于许多潜在原因,他们认为自己键入了一些东西。
总是很好地保持用户的评价,特别是他们方面的任何潜在错误

隐藏字段所在的位置是否有我遗漏的特殊情况 是否需要检测表单提交

要检测表单提交,您不需要表单中的隐藏字段,但有时它会用作垃圾邮件保护

<input type="text" name="humans" id="humans" class="humans" />
当您检查表单提交时,您还可以检查字段是否为空,如

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

因为,
bots/spammers
(使用自动脚本)可以提交表单,基本上,
脚本试图填充所有字段,但不知道您为捕获它而放置的隐藏字段,这样您可以确定它是由人还是机器人提交的。您可以获取更多信息并更好地理解垃圾邮件拦截。

使用hidden字段仅用于检查表单是否已提交

但假设您希望动态发布一个没有理由在表单中显示的值。 例如,您有一个数组
$user
,该数组保存用户的所有数据。用户提交表单,您将其作为隐藏字段
$user['id']
传递,以便在提交后使用其id


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

是的,可以多次使用隐藏字段来验证提交

  • 正如您所提到的,区分表单视图和提交
  • 正如@kingkero所提到的,一种阻止机器人自动提交表单的方法
在编辑现有记录的情况下

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

老实说,所有这些都不正确。正确的方法是验证你的申请工作所需的所有字段,这使得“隐藏”或“提交”按钮在提交时不需要,只要填写并验证了所需字段,你就应该接受该职位,你应该永远不要相信用户输入,您应该始终根据字段必须是什么进行验证。简单地说,您不需要字段就可以知道表单正在发布,除了按钮或隐藏字段之外,还有其他方法可以检测。是的,所有字段都应该进行验证,但在开始验证字段之前,您是否应该首先确定表单是否已发布是否已提交?否则,您的脚本将认为字段未填充,并将显示表单
if(!empty($_POST['humans'])) {
// it's spam
}
else {
// it's human
}