为什么复选框状态并不总是传递给PHP脚本?

Nat*_*man 14 html php checkbox

我有一个HTML表单:

<form action='process.php' method='post'>
  <input type='checkbox' name='check_box_1' /> Check me!<br>
</form>
Run Code Online (Sandbox Code Playgroud)

以下是PHP脚本的一节process.php:

echo (isset($_POST['check_box_1']))?'Set':'Not set';
Run Code Online (Sandbox Code Playgroud)

设置复选框时脚本的输出是

但是当未设置复选框时,输出为:

没有设置

为什么是这样?这似乎是一个非常糟糕的设计,因为我的PHP脚本检查了许多$_POST变量,以确保它们被传递给脚本.如果$_POST['check_box_1']未设置该值,那么我如何知道脚本是否未能传递该值或复选框是否未设置?

nic*_*ckf 45

如果您想克服此设计功能,请尝试以下操作:

<input type="hidden" name="check_box_1" value="0" />
<input type="checkbox" name="check_box_1" value="1" />
Run Code Online (Sandbox Code Playgroud)

这样,您将始终$_POST['check_box_1']在回调页面中进行设置,然后您可以检查其值以查看是否已对其进行检查.这两个输入必须按顺序排列,因为后一个输入优先.


dec*_*eze 5

仅将已选中复选框的值提交给服务器.这是一个HTML /浏览器设计的东西,与PHP无关.您如何可靠地区分已选中的复选框和未选中的复选框?

...那么我如何知道脚本是否未传递该值或复选框是否未设置?

您可以信任浏览器和PHP以使其正确.如果未设置,则不检查该框.如果您正在运行一些提交表单的Javascript并且可能出错,那么您有责任调试脚本.


关于"这是糟糕的设计":

这是高效的设计.考虑到值仅作为文本发送的限制,只有两种可能性:

  1. 分别发送值和状态,如checkbox:state=checked&checkbox:value=myvalue.让我们假装一秒钟,这不会导致输入元素名称和不允许的内容出现严重的问题和含糊之处.
  2. 使用魔术值表示"未选中":checkbox=false.这意味着我不能像这样制作一个复选框:<input type="checkbox" name="checkbox" value="false" />

让我们假装使用上述任何一种解决方案,并解决与它们相关的问题.这意味着对于页面上的每个复选框,都会发送一个POST值.通常这不是什么大问题,但让我们想象一个包含50个复选框的页面.我不会说太不现实.那200人怎么样?这是200 * ~10+在每个POST HTTP头文字额外的,可能大多只是告诉你什么样的用户也不会做.

由于这种技术是在带宽非常宝贵时发明的,因此简单地发送未选中复选框的值是最有效的.


Dwa*_*yne 5

nickf提供了最佳答案,但是当您有多个具有相同名称的复选框时,在特殊情况下它不起作用。相反(如果您使用的是jQuery),则可以使用伪造的复选框来切换真实的隐藏输入的值,如下所示:

<input type="checkbox" onclick="$(this).next().val(this.checked?1:0)"/>
<input type="hidden" name="verified[]"/>

<input type="checkbox" onclick="$(this).next().val(this.checked?1:0)"/>
<input type="hidden" name="verified[]"/>
Run Code Online (Sandbox Code Playgroud)

请注意,仅隐藏的复选框被命名。