【问题标题】:What is the best way to identify which form has been submitted?识别已提交的表单的最佳方法是什么?
【发布时间】:2010-04-18 18:40:01
【问题描述】:

目前,当我设计表单时,我喜欢让提交按钮的名称与表单的 id 相同。然后,在我的 php 中,我只需执行 if(isset($_POST['submitName'])) 以检查是否已提交表单以及已提交的表单。

首先,这种方法是否存在安全问题或设计缺陷?

我遇到的一个问题是,当我希望用 javascript 覆盖我的表单以便为用户提供更快的验证时。例如,虽然我显然需要保留服务器端验证,但如果在模糊输入时内联显示错误消息,对用户来说会更方便。此外,最好在单击提交按钮时提供整个表单验证。

因此,当用户单击表单的提交按钮时,我将停止默认操作,进行验证,然后在验证通过时尝试重新启用传统的提交功能。为了做到这一点,我使用了form.submit() 方法,但不幸的是,这不会发送提交按钮变量(因为它应该是 form.submit() 可以在不单击任何按钮的情况下调用)。这意味着我的 PHP 脚本无法检测到表单已提交。

解决此问题的正确方法是什么?似乎标准的解决方案是在通过验证后在表单中添加一个隐藏字段,该字段具有表单 ID 的名称。然后当调用 form.submit() 时,它会代替提交按钮传递。但是,这个解决方案对我来说似乎很不优雅,所以我想知道我是否应该:

a) 使用另一种方法来检测已提交的表单,该方法不依赖于传递提交按钮。如果是这样,有什么选择?显然,从一开始就多加一个隐藏字段并没有更好。

b) 使用替代的 Javascript 解决方案,让我保留我的非 Javascript 设计。例如,是否有替代 form.submit() 的方法可以让我传入额外的数据?

c) 接受它,然后使用 Javascript 插入一个隐藏字段。

更新: 我已经接受了正确的答案,但我只是想在这里澄清我的错误,以便对其他人更有帮助。我使用 Mootools,我非常天真地认为,当我使用 addEvent('submit' ...) 时,我需要立即调用 event.stop() 以防止提交。实际上情况并非如此,只有在验证失败时我才能调用 event.stop() 。否则,默认提交会像往常一样被触发,并且使用 form.submit() 变得完全没有必要。

【问题讨论】:

  • 我的团队目前是这样做的。我不喜欢它,因为我们的表单现在需要有一个提交按钮。执行此操作的人转移到另一个团队;我和另一个队友很难弄清楚为什么我们的表单没有提交,然后我们意识到它需要一个提交按钮来进行验证。

标签: php javascript


【解决方案1】:

您可以使用action=file1.phpaction=file2.php 将表单发送到不同的处理程序。

它们是使用一堆相同的代码进行处理的吗?将其放入单独的文件中,包括共性,并在每个处理文件中写入唯一位。不要乱砍,要组织。

对于 Javascript 验证,不要停止默认操作然后恢复,而是这样做:

if (validation != valid) {
    return false;
}

这样,如果 JS 被关闭或验证失败,表单动作/事件是完整的并且它的行为符合预期,否则它会失败。当然,肯定会保留服务器端验证。那是“真正的”验证,客户端只是为了取悦用户并节省他们的时间。永远不要为了你自己而依赖它。

【讨论】:

  • 我投了这个票,因为最终它是“正确”的答案,即使有时你不使用它,因为你只是一起破解一个快速脚本或在某些限制/截止日期下不允许你这样做,了解良好做法是件好事。
  • 谢谢!谢谢!太棒了。我的错误是认为为了执行任何 Javascript onsubmit,我必须立即停止默认的提交操作。相反,我可以在提交时做任何我想做的事情,并且只有在所有代码之后才提交表单。因此,我可以测试失败的验证,并在这种情况下阻止默认设置。这意味着我不需要 form.submit()。非常好!
  • 太好了,很高兴它有帮助!在你看到它完成之前,有时很难想到“其他”方式。
【解决方案2】:

您可以自定义表单的操作以添加获取键/值;比如action="formhandle.php?formid=10"

【讨论】:

  • Alex Mcp 有最好的食谱。但我同意这是一个很好的快速处理事情的方法。当我遇到这种情况时,我尝试使用这样的 GET;最后,我决定将所有内容都保留为 POST 会更干净。
  • 有趣的是,我刚刚回顾了 RESTful 概念并了解到原则上,GET 用于“查看”信息,而 POST 用于交互或“编辑”工作。我不知道有多少人订阅或遵守它。 (抱歉,目前无法链接来源。)
  • 我更喜欢这个,因为使用 Alex Mcp 解决方案,您仍然可以更改操作,但您可以移动代码。为什么不保持代码不变而只更改操作。 +1 如果 GET 用于审核。另外,这更简单直接。
猜你喜欢
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多