2013-10-02 4 views
0

Я создаю интернет-магазин с PHP и использую сеансы для сохранения временных параметров.Удалить элемент из массива

<form method="post" action="basket.php"> 
    <table border="1" style="width:400px;"> 
    <tr> 
     <td style="width:35%;">Product</td> 
     <td style="width:30%;">Aantal</td> 
     <td style="width:25%;">Totale prijs</td> 
     <td style="width:10%;"></td> 
    </tr> 
    <?php 
    for($i = 0; $i < count($_SESSION['basket']); $i++) {  
     $id  = $_SESSION['basket'][$i]['itemId']; 
     $number = $_SESSION['basket'][$i]['number']; 

     $result = $mysqli->query('SELECT * FROM items WHERE id = "' . $id . '"'); 
     $row = $result->fetch_assoc(); 

     $total = $number * $row['price']; 
     ?> 
    <tr> 
     <td> 
     <a href="view_item.php?id=<?php echo $id; ?>"> 
      <?php echo $row['name']; ?>  
     </a> 
     </td> 
     <td><?php echo $number; ?></td> 
     <td>&euro; <?php echo $total; ?></td> 
     <td><input type="submit" name="removeItem[]" value="Verwijder" /></td> 
    </tr> 
    <?php 
    if (isset($_POST['removeItem'])) { 
     unset($_SESSION['basket'][$i]); 
    } 

    $_SESSION['basket'] = array_values($_SESSION['basket']); 
    } 
    ?> 
    </table> 
</form> 

Когда я установил 3 элемента в сеанс.

Array 
(
    [basket] => Array 
    (
     [0] => Array 
     (
      [itemId] => 1 
      [number] => 1 
      [timestamp] => 1380722942 
     ) 
     [1] => Array 
     (
      [itemId] => 1 
      [number] => 1 
      [timestamp] => 1380722944 
     ) 
     [2] => Array 
     (
      [itemId] => 1 
      [number] => 1 
      [timestamp] => 1380722945 
     ) 
    ) 
) 

И удалить второй элемент, он удаляет последний элемент также ..

Что идет не так?

Может кто-нибудь мне помочь?

+0

Обратите внимание, что второй элемент является предметом № 1. Может быть, вы удаляете второй предмет (# 2), который на самом деле третий? – Reinherd

+0

Рассмотрите вопрос о сворачивании кода на главный вопрос. Это много кода, чтобы задать простой вопрос. – kojiro

+0

Какой код вы используете, чтобы удалить его? – quantme

ответ

1

Вы снимаете значение переменной SESSION для basket внутри цикла for. Поэтому, если пользователь пытается удалить второй элемент, цикл for будет продолжен, и все элементы после этого также будут отменены.

Вы должны выйти из цикла for после его отключения правильного пункта

if (isset($_POST['removeItem'])) { 
    unset($_SESSION['basket'][$i]); 
    break; 
} 

Вы бы тогда также нужно переместить последнюю строку,

$_SESSION['basket'] = array_values($_SESSION['basket']);,

за пределами for петли, так что он выполняется.

EDIT

После более близкого осмотра я не знаю, почему вы переменную величину SESSION внутриfor петля, но я думаю, что вам нужно реорганизовать свой код. Прерывание цикла for решит вашу проблему с удалением нескольких элементов, но также приведет к тому, что ваша таблица будет неполной (никакие элементы в basket после того, как вы удалите, будут отображаться). Вы должны обработать удаление элемента в отдельном месте, чем создание таблицы. Я бы переместил значение SESSION для элемента, который вы хотите удалить, в действие, которое вы вызываете при отправке этой формы.

+0

@Yooouuri Если это решило вашу проблему, пожалуйста, примите его в качестве ответа, чтобы было известно, что ваша проблема исправлена ​​:) – knoight

0

Попробуйте удалить вот так.

array_splice($_SESSION['basket'], $i, 1); 
+0

Если POST removeItem находится в цикле for. Он всегда принимает первую кнопку. Так что мне нужно это исправить! – yooouuri

Смежные вопросы