当前位置: 首页 > 知识库问答 >
问题:

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

申黎明
2023-03-14

我一直在阅读PHP表单处理教程,他们建议在表单中使用隐藏字段,这样PHP就可以使用IF($_POST['hidden_field']==任何来检测表单是提交的还是只显示的。

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

毕竟,似乎没有一次在不设置其他表单字段的情况下设置隐藏字段(即使它们是空的)。第一次通过时,当表单显示时,在提交之前,$_POST变量已经存在,但它是空的。我想我们也可以使用IF(!空($_POST))查看html" target="_blank">表单是否已提交?

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

编辑:好的,我丢失的特例,需要隐藏的字段是这个。http://www.vbforums.com/showthread.php?562749-PHP-Checking-if-a-form-has-best-submited-the-correct-way如果按Enter键提交表单,$\u POST变量将不包括提交按钮的值。Chrome似乎不是这样的,但其他浏览器可能会这样。

共有3个答案

何峰
2023-03-14

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

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

您可以使用!空的($POST)< />代码,但我尽量避免(取决于场景),因为我喜欢告诉用户他们没有输入任何东西,否则用户点击提交,然后再次把空白表格发给他们。

当然,他们可能知道他们在胡闹,但也许他们认为他们键入了一些东西,有许多潜在的原因
总是很好地让用户接受评估,尤其是他们可能犯的任何错误。

都才俊
2023-03-14

不,你的想法是对的。

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

楚俊逸
2023-03-14

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

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

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

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

.humans { display: none; }

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

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

因为,机器人/垃圾邮件发送者(使用自动化脚本)可以提交表单,基本上,脚本试图填满所有字段,并且不知道您已将其捕获的隐藏字段,这样您可以确定是否它是由人类或机器人提交的。您可以阅读本文了解更多信息和更好地了解垃圾邮件拦截。

 类似资料:
  • 问题内容: 在以下情况下: 学生“隐藏人的ID字段。 如果我们想在内存中表示以下内容: 约翰对象会为storint Person.ID及其自己拥有两个单独的存储位置吗? 问题答案: 正确。示例中的每个类都有其自己的int IDid字段。 您可以通过以下方式从子类中读取或分配值: 或在外部(当它们是公开的时):

  • 我工作在一个电子邮件偏好中心和用户有4个选项-3个选项是电子邮件频率和最后一个选项是退订。我有两个不同的字段,我的表单正在传递-电子邮件频率和电子邮件状态。我的电子邮件状态字段有问题。 对于单选按钮1-3,我希望它张贴电子邮件状态=“我”,而且电子邮件频率是“所有”,“每周”或“每月” 对于最后一个单选按钮,我只希望它发布电子邮件状态=“O” 我似乎不能使这两个工作-它要么只通过我,然后不明嫌犯单

  • 我在Hibernate验证器和JSF中遇到了一些令人惊讶的行为。我想知道这种行为是一种错误,还是我对自己期望的一种误解。 我有这个Facelets页面: 如果在中运行方法,则验证器将始终返回验证错误(消息“可能不是空的”),因为始终为空。这种行为在我看来是正确的。 如果以空白值提交表单,则会收到“可能不为空”的错误消息;如果您输入了一个值,它将通过验证,但您将在控制台中看到的值仍然为NULL。这种

  • 排除不显示字段 Model.findAll({ attributes: { exclude: ['baz'] } });

  • 操作步骤: ①在"图层管理"模块,选择需要设置的图层,点击"更多"按钮。 ②选择"设置信息窗"按钮。 ③弹出"信息窗设置"窗口。 ④隐藏字段,将显示字段的√去掉,点击"应用"。 ⑤点击记录,弹出窗口字段已经隐藏。 字段隐藏前: 字段隐藏后: 注意 ●在不删除字段的情况下,设置信息窗中需要显示的字段,默认是全部显示。 ●标题字段无法隐藏。 操作动图: [查看原图]

  • 我被这个概念困住了。 这是我在一个站点上看到的解释的一部分: 隐藏实现 我是这样想象的: 库客户机是否知道这个实现有什么区别?