我在表单中有两个提交按钮。如何在服务器端确定哪一个被点击了?
解决方案 1:
为每个输入框赋予不同的值,但名称保持相同:
<input type="submit" name="action" value="Update" />
<input type="submit" name="action" value="Delete" />
然后在代码中检查哪个被触发:
if ($_POST['action'] == 'Update') {
//action for update here
} else if ($_POST['action'] == 'Delete') {
//action for delete
} else {
//invalid action!
}
这个做法的问题在于您将逻辑绑定到了输入框中用户可见的文本上。
解决方法2:
为每个输入框赋予唯一的名称,然后检查 $_POST 是否存在该输入框:
<input type="submit" name="update_button" value="Update" />
<input type="submit" name="delete_button" value="Delete" />
这段代码中:
if (isset($_POST['update_button'])) {
//update action
} else if (isset($_POST['delete_button'])) {
//delete action
} else {
//no button pressed
}
<input type="submit" name="button_1" value="Click me">
现在有一种新的HTML5方法,即formaction属性:
<button type="submit" formaction="/action_one">First action</button>
<button type="submit" formaction="/action_two">Second action</button>
显然,这在Internet Explorer 9及更早版本中无法工作,但对于其他浏览器,您应该没问题(请参见:w3schools.com HTML <button> formaction Attribute)。
个人而言,我通常使用JavaScript远程提交表单(以获得更快的感知反馈),并以此方法作为备份。在这两种方法之间,唯一未覆盖的人是JavaScript已禁用的Internet Explorer 9之前的版本。
当然,如果您基本上是在服务器端执行相同的操作,而不管按下哪个按钮,这可能是不合适的,但通常如果有两个用户端可用的操作,则它们也将映射到两个服务器端操作。
正如Pascal_dher在评论中指出的那样,此属性也适用于<input>标记。
form_tag 创建的,添加这个属性是不起作用的。唯一让它起作用的方式是切换到 form_for 并使用 f.submit formaction: 'your_path'。 - fgblomqvistformaction 属性定义在提交表单时使用的URL。如果指定了 formaction,将会覆盖表单元素上定义的 action 属性。该属性仅适用于类型为 "submit" 的按钮。 - akinuri<form>
...
<button type="submit" name="action" value="update">Update</button>
<button type="submit" name="action" value="delete">Delete</button>
</form>
按钮内的 HTML(例如 ..>更新<..)是用户看到的内容;由于提供了 HTML,因此value 不可见;它只会发送到服务器。这样就不会有国际化和多个显示语言方面的不便(在前一种解决方案中,按钮的标签也是发送到服务器的值)。
<button>:submit和reset。请注意,reset并不会提交任何内容,它只是重置表单。因此,Jeroen的论点仍然成立。 - fizrukvalue属性为元素在表单提交时的值。元素的值是其value属性的值(如果有),否则为空字符串。
- kiril注:只有当按钮本身被用于启动表单提交时,按钮(及其值)才会包含在表单提交中。
这个非常容易进行测试:
<form action="" method="get">
<input type="submit" name="sb" value="One">
<input type="submit" name="sb" value="Two">
<input type="submit" name="sb" value="Three">
</form>
把它放在一个HTML页面中,点击按钮,然后查看URL。
使用 HTML 属性 formaction(第五行):
<form action="/action_page.php" method="get">
First name: <input type="text" name="fname"><br>
Last name: <input type="text" name="lname"><br>
<button type="submit">Submit</button><br>
<button type="submit" formaction="/action_page2.php">Submit to another page</button>
</form>
<form>
<input type="submit" value="Submit to a" formaction="/submit/a">
<input type="submit" value="submit to b" formaction="/submit/b">
</form>
input标签而不是button标签。 - ToolmakerSteve处理多个提交按钮的最佳方法是在服务器脚本中使用switch case语句。
<form action="demo_form.php" method="get">
Choose your favorite subject:
<button name="subject" type="submit" value="html">HTML</button>
<button name="subject" type="submit" value="css">CSS</button>
<button name="subject" type="submit" value="javascript">JavaScript</button>
<button name="subject" type="submit" value="jquery">jQuery</button>
</form>
服务器代码/服务器脚本 - 您提交表单的位置:
<?php
switch($_REQUEST['subject']) {
case 'html': // Action for HTML here
break;
case 'css': // Action for CSS here
break;
case 'javascript': // Action for JavaScript here
break;
case 'jquery': // Action for jQuery here
break;
}
?>
来源: W3Schools.com
<form action="demo_form.php" method="get"> - Shailesh Sonare也许这里提供的解决方案在2009年起作用,但我测试过了所有受欢迎的答案,没有一个在任何浏览器中都能正常工作。
唯一有效的解决方案是这个(但我认为它有点丑陋):
<form method="post" name="form">
<input type="submit" value="dosomething" onclick="javascript: form.action='actionurl1';"/>
<input type="submit" value="dosomethingelse" onclick="javascript: form.action='actionurl2';"/>
</form>
formaction="actionurl1" 呢?你不需要 JavaScript。 - rybo111formaction。 - LdiCO如何在一个表单中为多个提交按钮设置formaction:
<input type="submit" name="" class="btn action_bg btn-sm loadGif" value="Add Address" title="" formaction="/addAddress">
<input type="submit" name="" class="btn action_bg btn-sm loadGif" value="update Address" title="" formaction="/updateAddress">