1

我的印象是,解析 HTML 表单的 POST 的服务器代码(或至少是 PHP)无法区分 POST 和带有未“选中”值的复选框的表单与没有“检查”的表单的 POST t 根本不包括该名称的复选框。

例如,采取以下 3 种形式。如果它们都按原样提交,没有手动输入,只使用初始值,那么表单 f2 和 f3 将发送相同的结果:

<form name="f1">
<input type="text" name="txt_1" value="Hello">
<input type="checkbox" name="chk_1" checked="checked">
</form>

<form name="f2">
<input type="text" name="txt_1" value="Hello">
<input type="checkbox" name="chk_1">
</form>

<form name="f3">
<input type="text" name="txt_1" value="Hello">
</form>

在我的实际应用程序中,我提交了 f3 类型的表单,故意省略了一个复选框(不同情况下的不同复选框)。对于我遗漏的任何复选框,我希望后端忽略它——不要将其视为打开或关闭,只需不执行与该字段相关的任何操作。

在我构建它之后,我几乎要在测试之前扔掉我的工作,当我记得后端会像对待未选中的现有 chk_1 一样对待丢失的 chk_1 - 并且会关闭相关值后端。

但是我去尝试了一下,它成功了!我尝试了不同的变化,它们都有效。他们正确地忽略了与缺少复选框相关的字段(同时处理与现有复选框相关的字段)。

所以,这很好,但我不知道它是如何完成的(或者它是否可能会停止工作——比如在另一个浏览器上等等)。在 PHP 中,我知道代码 isset($_POST['chk_1']) 将获取复选框的值,并且在两种情况下都返回 false:未选中的复选框或缺少复选框。其他服务器语言有没有办法区分?为什么这行得通?

4

1 回答 1

1

简短的回答是 PHP 只获取浏览器发送的内容。它不知道也不关心表单本身,只关心来自浏览器的数据。数据作为name=data值的集合出现。

除其他因素外,浏览器只会发送一个按钮,如果

  • 它有一个名字,并且
  • 它已被选中

如果按钮没有名称,或者没有被选中,那么 PHP 将永远不会听到它。这适用于

  • 普通按钮(<button><input type="submit">
  • 单选按钮(只能选择一组中的一个:如果没有选择,那么这也将不存在)
  • 复选框(仅发送选定的复选框)

因此,简短的回答是 PHP 永远不会知道复选框是丢失还是未选中,因为两者都不会发送到服务器。

于 2017-02-06T05:25:43.473 回答