如何在没有javascripts的情况下处理未选中的复选框数组值?

How to deal with unchecked checkbox array value without javascripts?

假设我有这样一个表单,其中复选框是重复字段:

<form action="" method="post">
    <?php for($i=0; $i<3; $i++) { ?>
       <input type="checkbox" name="ch[]" value="1">
    <?php } ?>
    <button type="submit" name="submit">submit</button>
</form>

我在使用 WordPress 并使用自定义元框来处理它。所以我在 metabox 的回调函数中声明了表单,并在另一个与 save_postnew_to_publish 动作钩子挂钩的保存函数中接收值。

这是怎么回事:当我点击按钮时,metabox 回调提交表单,hook 函数接收它。 (可以在 add_meta_box() WordPress Codex 看到)假设我的保存函数包含:

<?php
if( isset($_POST['submit']) ) {
    $chb = $_POST['ch'];
    $result = array();
    foreach ($chb as $cb) {
        $result[] = array( 'isactive' => $cb );
    }
    var_dump($result);
}
?>

这表明,复选框在未选中时不会返回任何值。我考虑了这里提到的所有服务器端解决方案:Post the checkboxes that are unchecked

问题是,无论何时提交表单,它都会将复选框的值放入数组 (),因此我无法检查数组值,例如:

if( !isset( $_POST['ch'] ) || empty( $_POST['ch'] ) ) {
    $chb = 0;
} else {
    $chb = 1;
}

我还尝试了带有 0 值的隐藏字段以及 array_unique(),但似乎对我没有任何作用。

如何处理数组中未选中的复选框,使它们不能为空,并且我的 foreach 可以循环遍历所有复选框并相应地存储数据,并更正?

我想避免使用 JavaScript 解决方案。

如果您使用索引命名复选框,如下所示:

<input type="checkbox" name="chk_<?php echo $i ?>" value="1">

然后你可以像这样遍历它们:

<?php
   $chkBoxes = array();
   foreach ($_POST as $k => $v) {
      if (strpos("chk_",$k) === 0) {
          $cbIndex = str_replace('chk_', '', $k);
          $chkBoxes[$cbIndex] = $v;
      }
   }

然后要测试复选框是否被选中并发送到服务器,您可以使用:

<?php 
    if (isset($chkBoxes[$cbIndex])) 

记住 - 复选框的值只有在选中时才会发送:Does <input type="checkbox" /> only post data if it's checked?

在表单中添加一个带有复选框数量的隐藏字段,并使用索引 $i 作为数组 ch[]:

<form action="" method="post">
    <input type="hidden" name="num" value="<?= $num = 3 ?>">
    <?php for($i=0; $i<$num; $i++) { ?>
       <input type="checkbox" name="ch[<?= $i ?>]" value="1">
    <?php } ?>
    <button type="submit" name="submit">submit</button>
</form>

然后:

<?php
if( isset($_POST['submit']) ) {
    $chb = $_POST['ch'];
    $num = $_POST['num'];
    $result = array();
    for($i=0; $i<$num; $i++) {
        $result[$i]['isactive'] = isset($chb[$i]) ? 1 : 0;
    }
    var_dump($result);
}
?>

首先我抄袭了论坛里很多人的想法!我只合成了路!

  1. 我的函数从位于 $anoigmata class:
    中的我的基地获取数据 function getall() { $data = $this->_db->get('<table_name>', array('ID', '>=', 0)); $results = $data->results(); $rows = $data->count(); return array($results, $rows); }
  2. 创建函数中的代码,用于保存网站上未显示的所有次要选项。

    $fields_Κ = array('history' => serialize(array( 'checkboxes' => Input::get('checkboxes') )), ); $data = $this->_db->insert('ΚΕΛΥΦΟΣ', $fields_Κ); return true;

  3. 显示结果的php-html代码

<form method="post"> <div class="form-group"> <label for="checkboxes[]">checkboxes title</label><br>

  `<?php 
  for ($i=0; $i<$anoigmata->getall()[1]; $i++) {
   echo "
   <input type='hidden' name='checkboxes[$i]' value='0' />
   <input type='checkbox' id='checkboxes[$i]' name='checkboxes[$i]' value='".$anoigmata->getall()[0][$i]->ΕΜΒΑΔΟΝ."' />".$anoigmata->getall()[0][$i]->ΠΕΡΙΓΡΑΦΗ."<br>";}?>`

`</div><button type="submit" class="btn btn-success">Submit</button></form>`

***ΕΜβΑΔ〇N 和 ΠΕΡΙΓΡΑΦΗ 是我正在保存的 table 中的行名称!!!

我希望我能帮到一点..!