我有一个HTML表单:
<form action='process.php' method='post'>
<input type='checkbox' name='check_box_1' /> Check me!<br>
</form>
以下是PHP脚本process.php
的一部分:
echo (isset($_POST['check_box_1']))?'Set':'Not set';
设置复选框时脚本的输出是
集
但是当未设置复选框时,输出为:
未设置
这是为什么?这似乎是一个非常糟糕的设计,因为我的PHP脚本检查了许多$_POST
变量,以确保它们被传递给脚本。如果未设置$_POST['check_box_1']
值,那么如何知道脚本是否未能传递该值或复选框是否未设置?
答案 0 :(得分:44)
如果您想克服此设计功能,请尝试以下操作:
<input type="hidden" name="check_box_1" value="0" />
<input type="checkbox" name="check_box_1" value="1" />
这样,您将始终在回调页面中设置$_POST['check_box_1']
,然后您可以检查其值以查看是否已对其进行检查。这两个输入必须按顺序排列,因为后一个输入优先。
答案 1 :(得分:5)
仅将已选中复选框的值提交给服务器。这是一个HTML /浏览器设计的东西,与PHP无关。您如何可靠地区分已选中复选框和未选中复选框?
...那么我如何知道脚本是否未能传递该值或复选框是否未设置?
您可以信任浏览器和PHP以使其正确。如果未设置,则不检查该框。如果您正在运行一些提交表单的Javascript并且可能出错,那么您有责任调试脚本。
关于“这是糟糕的设计”:
高效设计。考虑到值仅作为文本发送的限制,只有两种可能性:
checkbox:state=checked&checkbox:value=myvalue
。让我们假装一秒钟,这不会导致输入元素名称和不允许的内容出现严重的问题和含糊之处。checkbox=false
。这意味着我无法创建如下的复选框:<input type="checkbox" name="checkbox" value="false" />
让我们假装使用上述任何一种解决方案,并解决与之相关的问题。这意味着对于页面上的每个复选框,都会发送一个POST值。通常这不是什么大问题,但让我们想象一个包含50个复选框的页面。我不会说太不现实。那200人怎么样?每个POST的HTTP标头中都有200 * ~10+
个字符,可能大多数只是告诉您用户做了什么不。
由于这种技术是在带宽非常宝贵的情况下发明的,因此只需不发送未选中复选框的值就会最有效。
答案 2 :(得分:4)
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[]"/>
请注意,只有隐藏的复选框被命名。
答案 3 :(得分:3)
不幸的是,这就是提交表单中复选框规范的工作原理 - 如果未选中复选框,浏览器根本不会发送该字段。
答案 4 :(得分:0)
是的,这是糟糕的设计,它肯定不是“高效”的设计,原因如下:
复选框是一种控件,允许用户从一组一个或多个选项中选择零个或多个值。
通过不发送未经检查的值,浏览器强制表单处理程序“知道”它应该从表单中得到什么,并假设缺失值意味着“我不想要那个选项”。当您在某处更新记录时,这是灾难性的,因为您不能依赖提交的信息是完整的。
您基本上不知道缺少的复选框是表示“用户不希望设置该选项”还是“用户未提供任何信息”。前者需要你更新记录,而后者不需要。
这使得部分表单(允许用户更新部分记录)在没有大量额外工作的情况下绝对不可能,当您的表单有大量复选框时尤其糟糕。
本质上,您首先必须明确查找应该存在的信息,然后推断用户希望它在丢失时“未设置”。
如果一个不包含复选框的部分表单提交给同一个处理程序,它会错误地假设用户希望这些选项“未设置”,而实际上没有有关此事的任何信息。
这使得代码在后端很难重用。