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
        )
    )
)

并删除第二个项目,它也会删除最后一个项目..

出了什么问题?

有人可以帮助我吗?

4

2 回答 2

1

您正在为循环basket内部取消设置 SESSION 变量。for因此,如果用户尝试删除第二个项目,for循环将继续,之后的所有项目也将被取消设置。

您应该在取消设置正确的项目后退出for循环

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

然后你还想移动最后一行,

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

for循环之外,以便它被执行。

编辑

经过仔细检查,我不确定您为什么要在循环for取消设置 SESSION 变量,但我认为您需要重构代码。跳出for循环将解决您删除多个项目的问题,但也会导致您的表格不完整(在basket您删除的项目之后不会显示任何项目)。您应该在与创建表不同的地方处理项目的删除。我会将取消设置要删除的项目的 SESSION 变量移动到提交此表单时调用的操作。

于 2013-10-02T14:25:24.260 回答
0

尝试像这样删除。

array_splice($_SESSION['basket'], $i, 1);
于 2013-10-02T14:25:40.850 回答