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

时间:2015-04-09 01:47:33

标签: php wordpress checkbox

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

<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并使用自定义元框来处理它。所以我在元数据的回调函数中声明了表单,并在另一个与save_postnew_to_publish动作挂钩挂钩的保存函数中接收了值。

所以发生了什么:当我点击按钮时,metabox回调提交了表单,并且钩子函数接收它。 (可以在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可以循环遍历所有'em并相应地存储数据,并更正?

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

3 个答案:

答案 0 :(得分:1)

如果您为其中的索引命名复选框,请执行以下操作:

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

答案 1 :(得分:0)

在表单中添加一个隐藏字段,其中包含复选框的数量,并使用索引$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);
}
?>

答案 2 :(得分:0)

首先,我在这个论坛中复制了很多人的想法!我只是合成了这条路!

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

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

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

  4. <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>`
    

    ***ΕΜΒΑΔΟΝ和ΠΕΡΙΓΡΑΦΗ是我正在保存的表中的行名!!!

    我希望我帮了一下......!