2010-05-10 417 views
0

我正在構建Codeigniter購物車。在購物車詳細信息頁面上,我有一個表單輸入字段,允許用戶鍵入產品所需的數量,並提交按鈕以將信息發佈到更新功能。PHP Codeigniter未定義偏移量錯誤

當購物車中只有一件商品時,更新數量時,所有的商品都應該如此。但是,當有多個項目時,更改項目的數量並單擊提交將導致模型中的以下代碼(特別是陣列中的兩行)出現「未定義偏移1:錯誤」:

function validate_update_cart() 
    { 
     $total = $this->cart->total_items(); 

     $item = $this->input->post('rowid'); 
     $qty = $this->input->post('qty'); 

     for($i=0;$i < $total;$i++) 
     { 

      $data = array( 
        'rowid' => $item[$i], 
        'qty' => $qty[$i] 
       ); 

      $this->cart->update($data); 
     } 
    } 

這是它上面所引用的視圖代碼:

<form action="<?php echo base_url(); ?>home/update" method="post"> 
     <div><input type="hidden" name="rowid[]" value="<?php echo $item['rowid']; ?>"/></div> 
     <div><input type="text" name="qty[]" value="<?php echo $item['qty']; ?>" maxlength="2" class="chg-qty"/></div> 
     <div><input type="submit" value="update" class="update-quantity"/></div> 
</form> 

這是控制器:

function update() 
    { 
    $this->products_model->validate_update_cart(); 
     redirect('cart'); 
    } 

請任何人都可以解釋爲什麼發生這種情況?

非常感謝,

馬特

回答

1

我相信你的問題是,你需要有

<form action="<?php echo base_url(); ?>home/update" method="post"> 
     <div><input type="hidden" name="rowid[]" value="<?php echo $item['rowid']; ?>"/></div> 
     <div><input type="hidden" name="rowid[]" value="<?php echo $item['rowid']; ?>"/></div> 

     <div><input type="text" name="qty[]" value="<?php echo $item['qty']; ?>" maxlength="2" class="chg-qty"/></div> 
     <div><input type="text" name="qty[]" value="<?php echo $item['qty']; ?>" maxlength="2" class="chg-qty"/></div> 

     <div><input type="submit" value="update" class="update-quantity"/></div> 
</form> 

即,2項爲ROWID和數量。

這個link提供了使用HTML輸入的標準和關聯數組的例子。

EDIT基於OP反饋:

這是我是指太例如:

<label><input type="checkbox" name="choice[]" value="1"/> 1</label> 
<label><input type="checkbox" name="choice[]" value="2"/> 2</label> 
<!-- etc... --> 

// meanwhile, on the server... 
$choice = $this->input->post('choice'); 
print_r($choice); // Array ([0] => 1 [1] => 2); 

又如:

<form method="post" action=""> 
    <input maxlength="30" name="friend[]" size="30" type="text" /> 
    <input maxlength="30" name="friend[]" size="30" type="text" /> 
    <input maxlength="30" name="friend[]" size="30" type="text" /> 
    <input type="submit" value="Submit" /> 
</form> 

// ***** Server-Side PHP: ***** 

// Loop through the friend array 
foreach ($_POST['friend'] as $value) { 
    if ($value) { echo $value."<br />"; } 
} 

通知,其中實施例是使用輸入對於他們期望在數組中返回的每個值都使用相同的「blah []」。在你的代碼中,你的視圖中有一個rowid []和一個qty []輸入。對於單個元素,這將工作B/C你有一個元素定義在數組中。當你有2個項目,你顯然是更新總項目變量來表示正確的項目數量,但然後循環嘗試訪問每個數組中不存在的第二個元素(即1),這就是爲什麼你會得到「未定義偏移1「錯誤。

+0

感謝RC,這是一篇有用的文章,雖然我沒有看到任何內容,但會提示您需要按照您的建議輸入兩個輸入內容。這樣做會導致更新數量的兩個輸入字段,這是我不想要的。 – Matt 2010-05-10 13:41:24

+0

我已經更新了我的答案。 – 2010-05-10 14:58:57

+0

哦,我明白你在說什麼 - 謝謝你回到我身邊。讓我試試這個......我會回報 – Matt 2010-05-11 12:43:06

2

代替

for($i=0;$i < $total;$i++) 

使用本

for($i=0;$i < count($item);$i++) 
2

我有同樣的問題;我很確定問題出在購物車視圖 部分。隱藏字段不在foreach {}聲明中 - 這就是爲什麼 您可以在購物車中有一件產品時編輯數量,但當您添加其他產品時 無法編輯產品。這裏有一段代碼 爲我工作。

<?php if ($this->cart->total_items()!=0) :?> 
<div id="cart"> 

    <?php if ($cart=$this->cart->contents()) :?> 
    <table> 
    <caption>Shopping Cart</caption> 
    <thead> 
     <th>Item Name</th> 
     <th>Option</th> 
     <th>Price</th> 
     <th>Qty</th> 
     <th></th> 
    </thead> 
    <?php foreach ($cart as $item): ?> 
    <tr> 
     <td><?=$item['name'];?></td> 
     <td> 
     <?php 
      if ($this->cart->has_options($item['rowid'])) { 
       foreach ($this->cart->product_options($item['rowid']) as $option => $value) { 
        echo $option.": <em> ".$value." </em>"; 
       }; 
      }; 
     ?> 
     </td> 
     <td>$<?=$item['subtotal'];?></td> 
     <?=form_open('index.php/shop/update_cart'); ?> 
     <td> 
     <?=form_input(array('name' => 'qty[]', 'value' => $item['qty'], 'maxlength' => '2', 'size' => '2')); ?> 
     </td> 
     <td class="remove"><?=anchor('index.php/shop/delete/'.$item['rowid'],'X','class="remove"');?></td> 
     <td> <?=form_hidden('rowid[]', $item['rowid']); ?></td> 
    </tr> 
    <?php endforeach;?> 
    <tr class="total"> 
     <td colspan="2"> <strong>Total</strong> </td> 
     <td>$<?=$this->cart->total();?></td> 
    </tr> 
    <tr> 
     <td><?php echo form_submit('submit', 'Update your Cart'); ?></td> 
     <!-- When you want to empty your cart using ajax, add 'class="empty"' as a third parameter. --> 
     <td><?=anchor('index.php/shop/empty_cart', 'Empty Cart', 'class="empty"');?></td> 
     <?=form_close();?> 
    </tr> 
    </table> 
    <?php endif;?> 
</div> 
<?php endif;?>