2010-04-18 134 views
8

目前,当我设计我的表单时,我喜欢保持提交按钮的名称等于表单的ID。然后,在我的PHP中,我只需要if(isset($_POST['submitName']))以检查表单是否已提交以及哪个表单已提交。什么是确定提交表单的最佳方式?

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

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

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

解决此问题的正确方法是什么?看起来标准的解决方案是在通过验证后添加一个隐藏的字段到表单中,该表单的ID为name。然后,当form.submit()被调用时,这是代替submit按钮传递的。然而,这个解决方案对我来说似乎很不理智,所以我想知道我是否应该:

a)使用另一种方法来检测哪个表单已被提交,而不依赖于传递提交按钮。如果有,还有什么替代方案?显然,从一开始就有一个额外的隐藏领域是没有更好的。

b)使用另一个Javascript解决方案,它允许我保留我的非Javascript设计。例如,是否有替代form.submit(),它允许我传递额外的数据?

c)把它吸起来,只是用Javascript插入一个隐藏的字段。

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

+0

我的团队目前是这样做的。我不喜欢它,因为我们的表单现在需要有一个提交按钮。实施这个的人转移到另一个团队中;我和另一个队友很难弄清楚为什么我们的表格没有提交,然后我们意识到它需要提交按钮进行验证。 – b01 2013-04-28 21:41:49

回答

6

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

他们使用一堆相同的代码进行处理吗?将其放入单独的文件中,包含共同点,并在每个处理文件中写入唯一的位。不要破解,组织。

对于JavaScript验证,不停止默认的动作然后恢复,而不是这样做:

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

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

+0

我投票赞成,因为最终它是“正确”的答案,即使有时你不使用它,因为你只是一起窃取一个快速脚本或在一些不允许你的约束/最后期限下,很高兴知道好的做法。 – 2010-04-18 18:49:07

+0

谢谢!谢谢!太棒了。我的错误是认为,为了执行任何Javascript onsubmit,我必须立即停止默认提交操作。相反,我可以做任何我想要提交的内容,而表单只在所有代码之后提交。因此,我可以测试失败的验证,并在此情况下阻止默认设置。这意味着我不需要form.submit()。非常好! – 2010-04-18 19:43:26

+0

太棒了,很高兴这很有帮助!在你看到它完成之前,有时很难想到“其他”方式。 – 2010-04-18 19:49:55

3

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

+0

Alex Mcp有最好的配方。但我同意这是一个很好的照顾事物的快速方法。当我遇到这种情况时,我尝试使用这样的GET;最后,我决定将所有内容都保存到POST上更清洁。 – Smandoli 2010-04-18 20:15:38

+0

有趣的是,我刚刚回顾了RESTful概念,并了解到原则上,GET是用于“审阅”信息,POST是用于交互式或“编辑”工作。我不知道有多少人赞同或遵守它。 (对不起,目前无法链接)。 – Smandoli 2010-05-06 20:00:42

+0

我更喜欢这个,因为在Alex Mcp的解决方案中,你仍然在改变这个动作,但是你需要移动你的代码。为什么不只是保持代码相同,只是改变行动。如果GET用于审核,则为+1。此外这更简单直接。 – b01 2013-04-28 21:38:11

相关问题