我的印象是,解析HTML表单的POST的服务器代码(或至少是PHP)无法区分表单中的POST与不是“已检查”的复选框与来自表单的POST的复选框根本不包含该名称的复选框。
例如,请采用以下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:未选中复选框或缺少复选框。有其他服务器语言可以区分吗?为什么这有效?
答案 0 :(得分:0)
简短的回答是PHP只能获取浏览器发送的内容。它不知道或不关心表单本身,只关注来自浏览器的数据。数据以name=data
值的集合形式出现。
除其他因素外,如果(a)它有一个名字并且(b)它已被选中,浏览器将只发送一个按钮。如果按钮没有名称,或者没有选择,那么PHP将永远不会听到它。这不仅适用于普通按钮(<button>
或),也适用于单选按钮(只能选择一个组中的一个:如果没有选择,那么这也将不存在)和复选框(仅限)选中的复选框已发送。)