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

2022-08-30 20:57:50

无法让我的 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[]的数组)。

现在,问题来了。假设第一个复选框未选中,最后 2 个复选框处于选中状态。当我输出值(使用PHP print_r进行调试)时,我将得到:

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

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

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


答案 1

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

如果您处于需要将确切数量的元素作为数组提交的情况,为什么不执行与每个复选框关联的某种类型时所做的相同操作呢?只需将 PHP 数组键名作为元素名称的一部分:id<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);

查看实际效果


答案 2

一个技巧是覆盖复选框值(如果选中)。否则,其值将为 0。

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

推荐