【问题标题】:How to deal with unchecked checkbox array value without javascripts?如何在没有 javascripts 的情况下处理未选中的复选框数组值?
【发布时间】:2015-06-14 05:17:34
【问题描述】:

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

<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

问题是,每当提交表单时,它都会将复选框的值传递给 array(),所以我无法检查数组值,例如:

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

我还尝试了带有 0 值的隐藏字段,伴随着 array_unique(),但似乎没有什么对我有用。

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

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

【问题讨论】:

  • @Fred-ii- 就这样吧。这不是问题。它正在提交表单,我拥有价值。我刚刚制作了表格,以最大限度地减少核心问题。
  • @Marty 我已经提到过我还尝试了带有0 值的隐藏字段,并附有array_unique(),但对我来说似乎没有任何效果。 有两个同名字段它将出现六个同名字段,array_unique() 采用 1-1-1 组合并输出 1-0-1。 :(
  • @Fred-ii- 请不要接受它。即使缺少type,我仍然拥有价值。我检查了有无。
  • @MayeenulIslam 是的,我的错 :) 如果您以名称输出数组索引,则可以使用该解决方案,例如name="ch[0]".

标签: php wordpress checkbox


【解决方案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?

【讨论】:

  • 我们实际上是这样解决了这个问题,但我对此并不满意。这就是我问这个问题的原因。无论如何,这似乎是唯一的解决方案。 :\
【解决方案2】:

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

<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);
}
?>

【讨论】:

    【解决方案3】:

    首先,我复制了这个论坛内许多人的想法!我只是合成方式!

    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 函数中的代码,用于保存网站上未显示的所有辅助选项。

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 2018-05-29
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 2018-04-25
      • 2013-07-04
      相关资源
      最近更新 更多