我正在创建一个使用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>€ <?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)
您在basket
循环内取消for
的SESSION变量。因此,如果用户尝试删除第二个项目,for
循环将继续,之后的所有项目也将被取消设置。
取消设置正确的项目后,您应退出for
循环
if (isset($_POST['removeItem'])) {
unset($_SESSION['basket'][$i]);
break;
}
然后你还想移动最后一行,
$_SESSION['basket'] = array_values($_SESSION['basket']);
,
在for
循环之外,以便它被执行。
修改强>
经过仔细检查后,我不确定你为什么要在for
循环中取消内部的SESSION变量,但我认为你需要重构你的代码。打破for
循环可以解决您的问题,即删除了多个项目,但也会导致您的表格不完整(在您移除的项目显示后,basket
中没有项目)。您应该在创建表的单独位置处理项目的删除。我会移动取消您要删除的项目的SESSION变量到您提交此表单时调用的操作。
答案 1 :(得分:0)
尝试像这样删除。
array_splice($_SESSION['basket'], $i, 1);