什么是识别已提交表单的最佳方法?

8

目前,当我设计表单时,我喜欢将提交按钮的名称与表单的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()变得完全不必要。


我的团队目前是这样做的。我不喜欢这种方式,因为我们现在需要在表单中添加提交按钮。实施这个功能的人已经加入了另一个团队;我和另一位队友花了很长时间才弄清楚为什么我们的表单无法提交,后来我们意识到需要添加提交按钮进行验证。 - b01
2个回答

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

它们是否使用相同的一堆代码进行处理?将其放入单独的文件中,包含共同点,并在每个处理文件中编写独特的部分。不要进行hack操作,要组织好代码。

对于JavaScript验证,请不要停止默认操作然后恢复,而是采用以下方法:

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

这样,如果JS被关闭或验证失败,表单动作/事件将保持不变,并按预期运行,否则会出现问题。当然,一定要保留服务器端验证。那是“真正”的验证,客户端只是为了取悦用户并节省他们的时间。不要依靠它来保证你的利益。


我投票支持这个答案,因为它最终是“正确”的答案。即使有时候你只是在编写一个快速脚本或者受到某些限制/截止日期的影响而无法使用它,了解良好的实践也是很有益的。 - Brian Roach
谢谢!谢谢!这太完美了。我的错误在于认为为了执行任何onsubmit的Javascript,我必须立即停止默认的提交操作。相反,我可以在onsubmit中做任何我想做的事情,而表单只有在所有代码之后才被提交。因此,我可以测试失败的验证,并在那种情况下防止默认行为。这意味着我不需要form.submit()。非常好! - Rupert Madden-Abbott
太好了,很高兴它有帮助!有时候在没有看到实际操作之前,很难想到“其他”的方法。 - Alex Mcp

3

您可以自定义表单的操作以添加get键/值,例如 action="formhandle.php?formid=10"


Alex Mcp有最好的配方。但我同意这是一个快速处理事情的好方法。当我遇到这种情况时,我尝试使用像这样的GET;最终我决定保持一切都是POST更加清晰。 - Smandoli
有趣的是,我刚刚回顾了RESTful的概念,并学到GET原则上是用于“查看”信息,而POST则用于交互或“编辑”工作。我不知道有多少人订阅这个理念或遵守它。(抱歉,目前无法提供链接来源。) - Smandoli
我更喜欢这个,因为使用Alex Mcp的解决方案,你仍然在改变操作,但是你会移动你的代码。为什么不保持代码不变,只改变操作呢?如果GET用于审核,请点赞。此外,这更简单和直接。 - b01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接