2011-11-02 79 views
12

无法让我的POST数组显示来自我的表单的所有复选框值。POST数组未显示未选中复选框

我已成立的一种形式如下:

<form name='foo' method='post' action=''> 
    <table> 
     <tr> 
      <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> 
     </tr> 
     <tr> 
      <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> 
     </tr> 
     <tr> 
      <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> 
     </tr> 
    </table> 
</form> 

我在绑定到该增加5个更多的空行的形式(因此对于输入名称CBOX阵列一个jquery函数底部有一个按钮[])。

现在,问题所在。比方说,第一个复选框未选中,最后2个选中。当我输出的值(使用调试PHP的print_r),我会得到:

Array ([0] => on [1] => on) 

出于某种原因,该阵列不包含未选中的复选框的任意值。

我已经看到一些解决方案,每个复选框都会传递一个隐藏变量,但是这种解决方案可以在我的情况下实现(使用数组)吗?

+0

听起来很简单..我会给它一个:)谢谢 – SpaghettiMonster

+0

不幸的是,我仍然没有得到未经检查的值。虽然 – SpaghettiMonster

+0

我意识到我之前的评论是出于对你的问题完全错误理解的动机。我在下面添加了一个正确的答案。 – Jon

回答

16

这种行为并不令人惊讶,因为浏览器不会为未选中的复选框提交任何值。

如果您处于需要以数组的形式提交确切数量的元素的情况,那么为什么当与每个复选框关联的某种排序的id时您做同样的事情?只是包括PHP数组的键名作为<input>元素的名称的一部分:

<tr> 
                 <!-- NOTE [0] ---> 
     <td class='bla'>Checkbox: <input type='checkbox' name='cBox[0]'/></td> 
    </tr> 
    <tr> 
     <td class='bla'>Checkbox: <input type='checkbox' name='cBox[1]'/></td> 
    </tr> 
    <tr> 
     <td class='bla'>Checkbox: <input type='checkbox' name='cBox[2]'/></td> 
    </tr> 

这仍然留下你的问题是选中框将仍然不会出现在数组中。这可能也可能不是问题。其中之一,你可能真的不在乎:

foreach($incoming as $key => $value) { 
    // if the first $key is 1, do you care that you will never see 0? 
} 

即使你照顾,你可以很容易地纠正问题。两个直接的方法在这里。一,只是做了隐藏输入元素招:

<tr> 
     <td class='bla'> 
     <input type="hidden" name="cBox[0]" value="" /> 
     Checkbox: <input type='checkbox' name='cBox[0]'/> 
     </td> 
    </tr> 
    <tr> 
     <td class='bla'> 
     <input type="hidden" name="cBox[1]" value="" /> 
     Checkbox: <input type='checkbox' name='cBox[1]'/> 
     </td> 
    </tr> 

两个,我觉得最好,填补了从PHP代替空格:

// assume this is what comes in: 
$input = array(
    '1' => 'foo', 
    '3' => 'bar', 
); 

// set defaults: array with keys 0-4 all set to empty string 
$defaults = array_fill(0, 5, ''); 

$input = $input + $defaults; 
print_r($input); 

// If you also want order, sort: 

ksort($input); 
print_r($input); 

See it in action

+0

谢谢乔恩。我会研究这个解决方案。我唯一关心的是独特的名字。我有一个未知数量的输入,因为它们与jquery .clone()一起添加。此外,您的链接不起作用,您可以使用网址缩短吗? – SpaghettiMonster

+1

@SpaghettiMonster:链接固定(复制粘贴失败)。即使克隆,您也可以链接一些额外的jQuery方法来在克隆生成后设置名称。 – Jon

+0

谢谢乔恩。我添加了几行jQuery来计算现有行数,并使用它来增加数组位置,并使用上面的代码。完美运作! :) – SpaghettiMonster

2

尝试

<input type='checkbox' value="XXX" name='cBox[]'/> 
<input type='checkbox' value="YYY" name='cBox[]'/> 
<input type='checkbox' value="ZZZ" name='cBox[]'/> 

复选框工作方式。如果它被选中,只有这个值被发布。

+0

我试过了,我得到的结果是:Array([0] => YYY [1] => ZZZ)。不幸的是,我不能给每个输入的唯一值,因为可以通过我提到的jquery函数动态添加。 – SpaghettiMonster

+1

那么用你需要的值替换YYY,ZZZ。然后检查$ _POST ['cBox'](它是一个数组)是否包含所需的值。 –

0

尝试设置每个复选框的值为1或true。

<input type='checkbox' value='1' name='cBox[1]'/> 

这可能是为什么它不发送任何东西?

4

ONE TRICK将覆盖复选框的值(如果选中)。否则其值将为0。

<form> 
    <input type='hidden' value='0' name="smth"> 
    <input type='checkbox' value='1' name="smth"> 
</form> 
+0

虽然你的逻辑是真实的,但这并不回答这个问题,因为如果你有一个数组然后foreach与密钥对将不正确 –

1

如果您在处理动态复选框数组,你可以试试这个:

HTML:

<label> 
    <input type="hidden" name="cBox[]" value="" /> 
    <input type="checkbox" class="checkbox" value="on" /> 
</label> 
<label> 
    <input type="hidden" name="cBox[]" value="" /> 
    <input type="checkbox" class="checkbox" value="on" /> 
</label> 
<!-- extend --> 

的Javascript(jQuery的):

$(document).on("change", "input.checkbox", function() { 

    var value = $(this).is(":checked") ? $(this).val() : null; 

    $(this).siblings("input[name='cBox[]']").val(value);  
}); 

后端结果(如果只检查第二个):

// PHP $_POST['cBox'] 
Array 
(
    [0] => 
    [1] => on 
) 

在此实现中,复选框用于控制组中的每个隐藏输入。

对于显示页面,您可以通过将值分配给隐藏输入并将复选框标记为checked来呈现每个输入对。

+0

真的帮助完整..谢谢! –

+0

很高兴听到:) –