2011-12-29 35 views
0

我正在循環一堆數組類型字段。我有兩個複選框,名稱爲「taxable []」和「ship []」在php中循環檢查框,意外的結果

我正在將這些複選框輸入到mysql中,並注意到表單中的其他所有字段都正確提交,除了這些。

如果我有6行復選框,我取消選中第一行。最後一行復選框會受到影響。

同樣,如果我取消選中前兩行,最後兩行會受到影響。

我把它分解成了下面的簡單php ..並循環了我的複選框,我看到循環的最後一個迭代是沒有設置複選框,而不是第一個循環。任何想法這裏發生了什麼。我還檢查了數組的大小,並且它匹配每種類型的字段數。

echo sizeof($post["prodID"]); 

    for($i = 0; $i<sizeof($post["prodID"]); $i++){   

     echo $i.' taxable '.$post["taxable"][$i].' '.$i.' ship '.$post["ship"][$i].' <br />'; 

     continue; 
    } 

HTML表單:

<? foreach($products as $prod): ?> 
       <tr class="<?= $prod["activeText"] ?>"> 
        <td><?= $prod["productid"] ?></td> 
        <td><input type="text" name="name[]" value="<?= $prod["itemname"] ?>"/></td> 
        <td><textarea name="description[]"><?= $prod["description"] ?></textarea></td> 
        <td><input type="text" name="cost[]" value="<?= $prod["cost"] ?>"/></td> 
        <td><input type="text" name="price[]" value="<?= $prod["price"] ?>"/></td> 
        <?php $checked = ($prod["taxable"] == 1) ? "checked='checked'" : ""; ?> 
        <td style="padding:0px;"><input style="position:relative; right:-10px;"type="checkbox" name="taxable[]" <?= $checked ?>/></td> 
        <td> 
         <select name="tax[]"> 
          <?php foreach($taxes as $tax){ 
           $selected = ($prod["inventoryTaxRateID"] == $tax["inventoryTaxRateID"]) ? 'selected="selected"' : ''; 
          ?> 
          <option <?= $selected ?> value="<?= $tax["inventoryTaxRateID"] ?>"><?= $tax["name"] ?></option> 
          <?php } ?> 
         </select> 
        </td> 
        <?php $ship = ($prod["ship"] == 1) ? 'checked' : '' ?> 
        <td><input type="checkbox" name="ship[]" <?= $ship ?> /></td> 
        <td><input type="text" name="sandh[]" value="<?= $prod["shipping_handling"] ?>"/></td> 

        <td><?= $prod["activeText"] ?></td> 
        <td> 
         <? if($prod["inactive"] !== null): ?> 
          <input type="button" name="changeStatus" value="<?= $prod["buttonText"] ?>" onclick="window.location='<?= base_url() ?>management/productManager/activate/<?= $prod["inventoryItemID"] ?>/<?= $prod["activeStatus"] ?>/<?= $category ?>'" /> 
         <? endif; ?> 
         <input type="hidden" name="prodID[]" value="<?= $prod["inventoryItemID"] ?>" /> 
         <input type="hidden" name="cat[]" value="<?= $prod["cat"] ?>" /> 
        </td> 
       </tr> 
       <? endforeach; ?> 
+0

請張貼表單的HTML。 – dotancohen 2011-12-29 19:40:43

+0

注意:'continue;'在循環結束時不需要:) – piotrekkr 2011-12-29 19:45:19

+0

在我的循環底部有額外的代碼,我沒有在示例中包含 – ionfish 2011-12-29 19:47:10

回答

4

這是因爲PHP只接收選定的複選框。未選中複選框不會被瀏覽器發送。示例

<input type="checkbox" name="ship[]" value="1" /> 
<input type="checkbox" name="ship[]" value="2" /> 
<input type="checkbox" name="ship[]" value="3" /> 
<input type="checkbox" name="ship[]" value="4" /> 

如果您選擇第一個和最後一個複選框,瀏覽器將只發送第一個和最後一個複選框。 PHP將看到$_POST['ship']

Array(
    [0] => 1 
    [1] => 4 
) 
+0

我明白這一點,但即使使用此代碼即時獲得不正確的結果: $ post [「ship」] [$ i] =(isset($ post [「ship」] [$ i]))? 1:0; – ionfish 2011-12-29 19:44:55

+0

'$ post'是由你設定還是你的意思是'$ _POST []'? – piotrekkr 2011-12-29 19:47:45

+0

它是由我先前在代碼 – ionfish 2011-12-29 19:49:16

0

您可以添加索引到輸入名稱,這可能會解決您的問題。

即。

<input type="checkbox" name="ship[0]" value="ship1" /> 
<input type="checkbox" name="ship[1]" value="ship2" /> 
<input type="checkbox" name="ship[2]" value="ship3" /> 
<input type="checkbox" name="ship[3]" value="ship4" /> 

如果您選擇了船1和船3,$ _ POST [「船」] [0],$ _ POST [「船」] [2]將被設置,而其他人將不會是在$ _POST數組,因爲它們沒有與表單一起提交。

可以再通過使用array_keys迭代($ _ POST [ '船'])

即。

if(is_array($_POST['ship'])) 
{ 
    foreach(array_keys($_POST['ship']) as $index) 
    { 
     echo $_POST['ship'][$index]."<br />"; 
    } 
} 

這應該呼應所有選擇值