PHP中unset移除SESSION购物车指定键值对出现异常问题
问题:购物车SESSION元素删除后出现异常
我有一个名为cart的SESSION变量,初始结构如下:
array ( 'cart' => array ( 2 => array ( 0 => '2', 1 => 2, ), ), )
我想要移除cart中键为2的元素,让cart变成空数组cart => [],于是用了代码unset($_SESSION["cart"][$id]);($id来自GET请求),但执行后得到的结果却是:
array ( 3 => array ( 0 => NULL, 1 => 1, ), )
不仅键自增成了3,还出现了NULL值。
购物车的生成逻辑在cart.inc.php中,代码如下:
<?php session_start(); // 购物车结构如下 // cart = [item_id: [item_id, amount], item_id: [item_id, amount]] // item_id是外层数组的键,对应的值是包含item_id和商品数量的数组 if (isset($_GET["remove"])) { $id = $_GET["remove"]; // 预期移除键"id"及其对应的值,但实际仅将item_id变为NULL unset($_SESSION["cart"][$id]); } $id = $_GET["id"]; if (isset($_SESSION["cart"])) { // 如果商品已在购物车中,则修改现有商品的值,而非新增 if (isset($_SESSION["cart"][$id])) { // 如果用户修改了商品数量,则执行此逻辑 // 直接将数量改为新值,而非加1 if (isset($_GET["amt"])) { $amt = intval($_GET["amt"]); $_SESSION["cart"][$id][1] = $amt; } else { // 增加商品数量,此处执行+1操作 $_SESSION["cart"][$id][1] = $_SESSION["cart"][$id][1] + 1; } } else { // 购物车已存在,但当前商品不在购物车中 array_push($_SESSION["cart"], [$id, 1]); } } else { // 购物车不存在时,初始化SESSION购物车变量 $_SESSION["cart"] = [$id => [$id, 1]]; } header("location: ../../index.php");
原因分析
问题出在删除操作后的代码逻辑:执行unset($_SESSION["cart"][$id])后,代码没有终止,继续执行了后续的商品添加/更新逻辑。
发起移除请求时,$_GET["id"]大概率未正确传递(或值为NULL),导致后续代码走到这个分支:
// 购物车已存在,但当前商品不在购物车中 array_push($_SESSION["cart"], [$id, 1]);
array_push会给数组添加新的数字索引(之前删除了键2,所以新索引是3),而$id为NULL,就生成了[0 => NULL, 1 => 1]的异常元素。
解决方案
在执行移除操作后,直接终止后续代码执行,避免触发商品添加逻辑:
if (isset($_GET["remove"])) { $id = $_GET["remove"]; // 先检查键是否存在,再执行删除 if (isset($_SESSION["cart"][$id])) { unset($_SESSION["cart"][$id]); } // 删除后直接跳转,必须加exit确保后续代码不执行 header("location: ../../index.php"); exit; }
额外注意事项:
- 确保移除请求中
$_GET["remove"]是有效商品ID,同时避免$_GET["id"]被误传递 - 如果需要,删除后可以清理数组空元素:
$_SESSION["cart"] = array_filter($_SESSION["cart"]);
内容的提问来源于stack exchange,提问作者AlphabetsAlphabets
相关产品推荐
相关产品推荐

