当未选中时,使复选框返回false

7

我的表格长这样:

<form>
    <input type"checkbox" name="checked[(unique_id)]">
    <input type"checkbox" name="checked[(unique_id)]">
    <input type"checkbox" name="checked[(unique_id)]">
    <input type"checkbox" name="checked[(unique_id)]">
</form>

复选框的数量会随时变化,因此在使用PHP处理这些数据时,必须循环_POST['checked']数组。我的问题是,当复选框被选中和未选中时,我都想采取行动。但只有选中的复选框才会添加到_POST['checked']数组中。

1
你不能用HTML来完成这个任务,所以你有两个选择:1.使用JavaScript;2.使用下拉列表代替复选框。 - Robert
1
为什么不将以下代码添加到您的PHP中: $checked = isset(_POST['checked']) && _POST['checked'] == 1; - sabkaraja
@robert 我早有所料,下拉列表在这种情况下不是一个替代方案,但我非常乐意接受基于JS的解决方案。我该如何使用JS实现这个功能呢?(我的JS经验非常有限) - Gurgy
5个回答

4
<form>
    <input type="checkbox" key="1"/>
    <input type="hidden" name="checked[1]" value="false">
    <input type="checkbox" key="2"/>
    <input type="hidden" name="checked[2]" value="false">
    <input type="checkbox" key="3"/>
    <input type="hidden" name="checked[3]" value="false">
    <input type="checkbox" key="4"/>
    <input type="hidden" name="checked[4]" value="false">
</form>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
    $(document).ready(function () {
        $('[key]').change(function () {
            var key = $(this).attr('key');
            $($('[name="checked[' + key + ']"]')).val($(this).is(':checked') ? 'true' : 'false');
        });
    });
</script>

这是我正在做的事情:

我使用两个输入框,一个是没有名称的复选框,因此不会被发送到PHP,另一个是隐藏的,不会显示给用户,但它将被发送到PHP。

然后,使用jQuery,当用户勾选框时,jQuery将隐藏输入框的值更改为true,取消勾选时更改为false。

因此,该值将始终作为字符串true或false发送到PHP。

您可以通过将.is(':checked')?'true':'false')更改为像.is(':checked')?1:0)这样的内容来更改要发送到PHP的值,以便发送1和0而不是true和false。

另一种解决方案是rybo111的解决方案。

<input type="hidden" name="check" value="false">
<input type="checkbox" name="check" value="true">

如果复选框被选中,它将发送两个选项,但这种方法并不完全可靠,并且会向服务器发送更多的数据。

关于这个问题的更多信息,请参考POSTing Form Fields with same Name Attribute

所以,如果你想使用简单的解决方案而不使用JavaScript,请使用“仅HTML”;如果你想要100%可靠的解决方案,请使用“js”。


哈哈哈 :D 非常欢迎你,我很高兴你理解了这个。你必须学习JS和jQuery,它对于Web开发非常重要。 - Robert
我的答案不需要 JavaScript。 - rybo111
你不应该在复选框中使用 prop 吗? - rybo111
2
同时,key="" 不是有效的 HTML 代码。您应该使用 data-key=""$(this).data('key') 来实现此目的。 - rybo111
@greaterKing 你的意思是什么? - Robert
显示剩余3条评论

4

这是我之前见过的一种技术:

<input type="hidden" name="check" value="false">
<input type="checkbox" name="check" value="true">

这样运作的原因是,当具有相同名称的值被发送多次时,仅接受最后一个值。
在我看来,更好的方法是简单地使用isset($_POST['...'])in_array($_POST['...'])

2
@robert 你有没有关于哪些浏览器发送第一个值的数据? - rybo111
1
我不知道是否有一些浏览器会这样做,但例如当我使用<input type='submit value='something' />将数据发送到PHP时,我遇到了一个问题,现在提交类型不会被发送到服务器。 - Robert
2
@robert 提交按钮的处理方式不同。但据我所知,除非有人能证明否则,这是一种安全的解决方案。我认为它支持更多不使用 JavaScript 的用户。 - rybo111
如果我认为你的回答不好,我不会点赞它:D,但是我说这不是可靠的答案意味着有1%的机会它可能无法按预期工作。 - Robert
所以您的意思是PHP将用第二个替换第一个,对吗? - Robert
显示剩余4条评论

0
在每个复选框输入元素中添加value="true"。 并将您的PHP代码更改为:
$checked_arr = [];
foreach($_POST["checked"] as $checked){
    if($checked == "true"){
        // do what you want to do 
    }
}

4
如果我理解正确的话,$_POST["checked"] 仍然只包含被选中的复选框,是吗? - Gurgy

0
另一个解决方案是我认为非常快速和简便的服务器端解决方案。
客户端解决方案: 只需使用新鲜的HTML:
<input type="checkbox" name="checked1" value="value_checked" ... />

服务器端:

创建如下全局函数:

function getVal(&$var, $default = '') {
    if (!isset($var) || empty($var) || is_null($var))
        $var = $default;
    return $var;
}

然后在你想要读取某个值的地方使用,而你不知道它是否被设置了。 就像这样:

$checked_value = getVal($_POST["checked1"],false);

或者

$checked_value = getVal($_POST["checked1"],"value_not_checked");

希望对其他人有用。


0

根据我的经验,这是最佳方法。

<input type="hidden" name="check" value="false">
<input type="checkbox" name="check" value="true">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接