提交后,PHP和HTML会记住具有相同名称的复选框值

时间:2014-02-24 19:38:43

标签: php html post checkbox form-submit

我在表单中有一些共享相同名称的字段,它们是从数据库表中自动生成的,我不知道会有多少字段。

   <div class="row w40 fl">
    <label for="code" class="label">codice <span class="form-notice">*</span></label>
    <input type="text" class="input" name="code" id="code" placeholder="Codice" value="<?= Input::post('code') ?>">
</div>

<div class="row w40 fr">
    <label for="name" class="label">nome <span class="form-notice">*</span></label>
    <input type="text" class="input" name="name" id="name" placeholder="Nome" value="<?= Input::post('name') ?>">
</div>

<?php foreach($categories as $cat): ?>
    <div class="w20 fl">
        <label for=""><?= ucwords($cat->name) ?></label>
        <input type="checkbox" name="cat[]" value="<?= $cat->id ?>" <?= ($cat->id == Input::post('cat')) ? 'checked' : '' ?>>
    </div>
<?php endforeach; ?>

问题是如果在提交后发生错误,则所有已检查的输入都将丢失。如果他们有不同的名字就没有任何问题,但他们总是不同。

所以在提交之后,我怎么能记住检查过的并检查它们?假设用户检查其中5个,填写所有表单输入但留下一个空白。显然会弹出一个错误,但是当所有其他输入都有用户输入的数据时,复选框不会,至少我不知道怎么做。

请注意,Input::post('code')表示(isset($_POST['code'])) ? $_POST['code'] : ''

谢谢,希望你能建议我一个解决方案。

好的,所以经过更多的研究后,这是解决方案。

if ( isset($_POST['cat']) ) {
    foreach ($_POST['cat'] as $cbCat) {
        $selectedCat[$cbCat] = 'checked';
    }
}

<?php foreach($categories as $cat): ?>
    <div class="w20 fl">
        <label for="cat-<?= $cat->id ?>"><?= ucwords($cat->name) ?></label>
        <input type="checkbox" id="cat-<?= $cat->id ?>" name="cat[]" value="<?= $cat->id ?>" <?= (isset($selectedCat[$cat->id])) ? $selectedCat[$cat->id] : '' ?> >
    </div>
<?php endforeach; ?>

2 个答案:

答案 0 :(得分:1)

可能的解决方案: cat[]是一个数组,因此您可以给它数字索引来识别哪个复选框是哪个:

<?php $i=1;
foreach($categories as $cat): ?>
    <div class="w20 fl">
        <label for=""><?= ucwords($cat->name) ?></label>
        <input type="checkbox" name="cat[<?php echo $i ?>]" value="<?= $cat->id ?>" <?= ($cat->id == Input::post('cat[$i]')) ? 'checked' : '' ?>>
    </div>
<?php i++ ;?>
<?php endforeach; ?>

我只是不确定你是否可以将这个Input::post('cat[$i]'))变量传递给你的moethod

答案 1 :(得分:1)

以下是一些代码,显示复选框会发生什么。

关于他们的重要一点是,未经检查的人不会在$ _POST中发送价值!只有CHECKED的人才这样做。我提供了一些证明这一点的代码。

$ _POST的'var_dump'允许您查看“复选框”表单中真正返回的内容。

它是经过测试的代码。

它适用于windowx XP上的PHP 5.3.18。

<?php

// we will have five checkboxes and each will have a separate value as follows...
$checkboxValues = array('cbx01', 'cbx02', 'cbx03', 'cbx04', 'cbx05');

// This array keyed on the checkbox VALUE will be checked or not...
// This is ALL the checkboxes!
$checkboxIsChecked = array('cbx01' => false,
                           'cbx02' => false,
                           'cbx03' => false,
                           'cbx04' => false,
                           'cbx05' => false);

/*
 * Determine the 'cat' checkboxes that are actually currently checked!
 *
 * We can know this because the $_POST['cat'] array
 * will contain VALUES for the Checkboxes that the user ACTUALLY checked!
 *
 * The UNCHECKED Checkboxes do NOT send any VALUE so they are MISSING from the array!
 *
 * i.e. if checkbox value: 'cbx02' and  'cbx04' are checked by the user then
 * the 'cat' array will be :
 *   0 => 'cbx02'
 *   1 => 'cbx04'
 *
 * All the other checkboxes will be 'unchecked'.
 *
 *
 */
var_dump($_POST); // you can see what comes in!

if (isset($_POST['cat'])) { // may have some checked 'cat' checkboxes...

  foreach ($_POST['cat'] as $checkboxValue) {
    // mark the appropriate checkbox as 'CHECKED' i.e cbx03
    $checkboxIsChecked[$checkboxValue] = true;
  }
}

?>
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Show Checkboxes and the input from them.</title>
  </head>

  <body>
    <div class="main" id="main">

        <!-- heading -->
        <strong><?php echo 'Test checkbox setting...'?></strong><br/>

        <form method="POST" action="">

        <?php foreach($checkboxValues as $cbxValue): ?>
          <div>
            <?php $labelId = $cbxValue . '_id'; // generate a label ?>
            <label for="<?php echo $labelId?>"><?= ucwords('A '. $cbxValue . ' thingy!') ?></label>
            <input type="checkbox"
                    name="cat[]"
                    id="<?php echo $labelId?>"
                    value="<?php echo $cbxValue?>"
                    <?php echo $checkboxIsChecked[$cbxValue] ? 'checked' : '' ?>>
          </div>
          <?php endforeach; ?>

          <input type="submit" value="GO"/>
        </form>
    </div>
  </body>
</html>