Неопределенная ошибка смещения PHP Codeigniter - PullRequest
0 голосов
/ 10 мая 2010

Я строю корзину для покупок Codeigniter. На странице сведений о корзине у меня есть поле ввода формы, позволяющее пользователю ввести требуемое количество продукта, и кнопка отправки для публикации информации в функции обновления.

Когда в корзине есть только один товар, при обновлении количества все работает как надо. Однако если имеется более одного элемента, изменение количества элемента и нажатие кнопки «Отправить» приводит к a Неопределенное смещение 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');
    }

Пожалуйста, кто-нибудь может объяснить, почему это происходит?

Большое спасибо,

Мэтт

Ответы [ 3 ]

2 голосов
/ 22 сентября 2011

вместо

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

используйте это

 for($i=0;$i < count($item);$i++) 
2 голосов
/ 27 июля 2012

У меня была такая же проблема; Я уверен, что проблема в представлении корзины покупок раздел. Скрытое поле не находится внутри оператора 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;?>
1 голос
/ 10 мая 2010

Я считаю, что ваша проблема в том, что вам нужно иметь

<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 и кол-во.

Эта ссылка содержит примеры использования как стандартных, так и ассоциативных массивов с входами HTML.

РЕДАКТИРОВАТЬ на основе обратной связи 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 []. Для одного элемента это будет работать, потому что у вас есть один элемент, определенный в массиве. когда у вас есть 2 элемента, и вы, очевидно, обновляете переменную общего количества элементов, чтобы представить правильное количество элементов, но затем циклически пытаетесь получить доступ ко второму элементу (т.е. 1 ) в каждом массиве, который не существует, почему вы получаете сообщение «Undefined Offset 1».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...