2014-02-24 84 views
1

我在表單中有一些共享相同名稱的字段,它們是從數據庫表中自動生成的,我不知道會有多少字段。PHP和HTML在提交後記得同名的複選框值

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

回答

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]'))你的方法

+0

我試過了,我確實不能。我最終找到了解決方案,如果感興趣,請參閱主文章。 –

+1

如果你不介意改變你的方法,那麼甚至有更簡單的解決方案。只需在你的第一個代碼中修改:'($ cat-> id == Input :: post('cat'))'to:(in_array($ cat-> id,$ _POST ['cat']))' – MSadura

+0

謝謝,好的解決方案。 –

1

這是一些代碼,顯示了複選框會發生什麼。

關於它們的重要一點是未經檢查的人不會在$ _POST中發送價值!只有經過檢查的人才會這樣做。我提供了一些代碼來說明這一點。

$ _POST的'var_dump'允許您查看錶單中'checkboxes'真正返回的內容。

它是測試代碼。

它適用於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> 
+0

感謝您的回覆。你很好地解釋了複選框是如何工作的,但在我看來,對於我想實現的目標而言,代碼太多了,有更多的可能性來做我想做的事情,我選擇了更短的代碼。您對@MarkS解決方案有什麼看法?我覺得它非常好,很乾淨。 –