2013-10-02 8 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 품목 (# 2)을 제거하고 있습니까? 실제로는 3 번째입니까? – Reinherd

+0

코드를 본질적인 질문으로 분리하는 것을 고려하십시오. 그것은 간단한 질문을하는 많은 코드입니다. – kojiro

+0

코드를 제거하기 위해 어떤 코드를 사용하고 있습니까? – quantme

답변

1

for 루프 내에서 basket의 SESSION 변수를 설정 해제합니다. 따라서 사용자가 두 번째 항목을 제거하려고하면 for 루프가 계속되고 그 이후의 모든 항목도 설정 해제됩니다.

당신은 올바른 항목 그런 다음 또한 마지막 줄을 이동하려는 것

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

,

$_SESSION['basket'] = array_values($_SESSION['basket']);을 설정 해제 후되도록 for 루프의

외부를 for 루프를 종료한다 실행됩니다.

편집

가까이 검사 후 난 당신이 for 루프 내부의 세션 변수 을 설정 해제하는 이유를 잘 모르겠어요,하지만 난 당신이 코드를 리팩토링 할 필요가 있다고 생각합니다. for 루프를 벗어나면 여러 항목이 제거되면서 문제가 해결되지만 테이블이 불완전 해집니다 (제거한 후에는 basket 항목이 표시되지 않음). 테이블 작성과는 별도의 장소에서 항목 제거를 처리해야합니다. 이 양식을 제출할 때 호출하는 작업으로 제거하려는 항목의 SESSION 변수를 설정 해제하는 것으로 이동합니다.

+0

@ YOooouuri이 문제가 해결 된 경우 답을 받아 들여 문제가 해결되었음을 알리십시오. – knoight

0

이렇게 제거하려고합니다.

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

POST removeItem이 for 루프에있는 경우. 항상 첫 번째 버튼을 사용합니다. 그래서 나는 그것을 고칠 필요가있다! – yooouuri