POST数组未显示未选中的复选框

时间:2011-11-02 22:55:01

标签: php html forms checkbox

无法让我的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>

我在底部有一个按钮绑定到一个jquery函数,它向表单添加了5个空行(因此输入名称为cBox []的数组)。

现在,问题。让我们说第一个复选框未选中,最后两个复选框被选中。当我输出值(使用PHP print_r进行调试)时,我会得到:

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

由于某种原因,该数组不包含任何未选中复选框的值。

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

6 个答案:

答案 0 :(得分:20)

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

如果您需要提交一个确切数量的元素作为数组,为什么不执行与每个复选框相关联的某种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

答案 1 :(得分:4)

ONE TRICK是覆盖复选框值,如果选中。否则它的值将为0.

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

答案 2 :(得分:2)

尝试

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

复选框以这种方式工作。如果选中,则仅发布该值。

答案 3 :(得分:1)

如果您正在处理动态复选框数组,可以尝试:

HTML:

Get-ADComputer -Filter "$filterType -eq '$($computer.$filterType)'" | Format-Table

Javascript(jQuery):

<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 -->

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

$(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 ) 来渲染每个输入对。

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

在控制器中:

request()->merge(['cBox' => request()->input('cBox', [])]);