我如何知道在PHP表单提交中单击了哪个按钮?


Answers:


147

使用类似如下的HTML形式:

<input type="submit" name="btnSubmit" value="Save Changes" />
<input type="submit" name="btnDelete" value="Delete" />

使用的PHP代码如下所示:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Something posted

    if (isset($_POST['btnDelete'])) {
        // btnDelete
    } else {
        // Assume btnSubmit
    }
}

您应该始终假定或默认为第一个提交按钮以HTML源代码的形式出现。实际上,在以下情况下,各种浏览器会可靠地发送带有发布数据的提交按钮的名称/值:

  1. 用户使用鼠标或定位设备从字面上单击提交按钮
  2. 或者将焦点放在“提交”按钮(它们在选项卡上)上,然后Enter按键。

存在其他提交表单的方法,并且在某些情况下,某些浏览器/版本决定不发送任何提交按钮的名称/值。例如,许多用户通过按Enter在光标/焦点位于文本字段上时。表单也可以通过JavaScript以及其他一些晦涩的方法提交。

请务必注意此细节,否则用户提交表单时确实会让他们感到沮丧,但是“什么也没有发生”并且其数据丢失,因为您的代码无法检测到表单提交,因为您没有预料到事实提交按钮的名称/值可能不会与帖子数据一起发送。

另外,上面的建议也应用于带有单个提交按钮的表单,因为您应始终假定默认的提交按钮

我知道互联网上充斥着大量的表单处理程序教程,并且几乎所有它们都只检查提交按钮的名称和值。但是,他们只是错误的!


1
感谢您提供有关假设默认按钮...的额外信息,易于忽略。
kad81

为什么要使用else而不是else?
Buts 2013年

@Gorg如果呢?您要测试什么,为什么?
山羊

@goat指定肯定单击了btnSubmit会更安全吗?用户可以更改按钮的值并提交其他数据吗?
Buts

2
@Gorg如果您是在谈论试图欺骗您的用户,则您无能为力。这是您必须在客户端/服务器编程中接受的现实-客户端可以轻松地向您发送所需的任何数据。用户服务器端存储(例如,服务器端会话)通常会存储您不希望用户篡改的数据。
山羊

14

在HTML中:

<input type="submit" id="btnSubmit" name="btnSubmit" value="Save Changes" />
<input type="submit" id="btnDelete" name="btnDelete" value="Delete" />

在PHP中:

if (isset($_POST["btnSubmit"])){
  // "Save Changes" clicked
} else if (isset($_POST["btnDelete"])){
  // "Delete" clicked
}

4
对不起,得投票。在使用Enter键提交时,行为异常的表单处理程序是我的宠儿。
山羊

4
@chris-没关系,您的观点完全正确。提出了您的答案。
MiffTheFox 2010年

1

您只需将name属性赋予每个按钮即可。而且您需要解决PHP脚本中每次按下按钮的问题。但是请注意为每个按钮指定一个唯一的名称。因为PHP脚本大多数时候只使用名称

<input type="submit" name="Submit_this" id="This" />

-2

您是用php还是javascript询问。

如果它在php中,请提供其名称并使用post或get方法,之后可以使用isset选项或将特定按钮名称检查为该值。

如果在js中,请使用getElementById

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.