最直接的方式是用 $_session 存购物车数据,因其天然隔离用户会话;需首行调用 session_start(),初始化空 cart 数组,按 product_id 键存数量或关联信息,操作前用 isset() 判断键存在,清空时建议 unset 后重置 session id。

用 $_SESSION 存购物车数据最直接
PHP 没有内置购物车,得自己存。最稳妥的方式就是用 $_SESSION,因为它是用户会话级的,天然隔离不同用户的数据,不用额外处理登录态绑定问题。
注意:必须在所有使用 $_SESSION 的脚本开头调用 session_start(),否则写不进去、读不出来,常见错误是“购物车为空”但代码里明明 $_SESSION['cart'] 赋了值——八成是漏了这句。
建议初始化时统一检查并设默认结构:
session_start();
if (!isset($_SESSION['cart']) || !is_array($_SESSION['cart'])) {
$_SESSION['cart'] = [];
}
添加商品要防重复叠加和整数校验
用户点“加入购物车”,本质是往 $_SESSION['cart'] 里塞或更新一条记录。关键不是简单 array_push,而是按 product_id 做键索引,避免同一商品多条记录。
常见错误:没做数量校验,用户传个 quantity=abc 或 -5,直接写进数组,后续计算总价崩掉。
- 用
filter_var($qty, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]])强制转正整数 - 用
$product_id作为数组下标:$_SESSION['cart'][$product_id] = $quantity; - 如果想保留商品名称、价格等快照信息,可以存关联数组:
$_SESSION['cart'][$product_id] = ['qty' => $qty, 'name' => $name, 'price' => $price];
更新和删除必须用 isset() 判断键存在
用户改数量或删商品时,容易直接写 unset($_SESSION['cart'][$id]) 或 $_SESSION['cart'][$id]['qty'] = $new_qty,但万一 $id 根本不在购物车里,PHP 会报 Notice: Undefined index(尤其在开发环境开启 error_reporting(E_ALL) 时)。
安全写法永远先判断:
// 更新数量
if (isset($_SESSION['cart'][$product_id])) {
$_SESSION['cart'][$product_id]['qty'] = max(1, (int)$new_qty);
}
// 删除
if (isset($_SESSION['cart'][$product_id])) {
unset($_SESSION['cart'][$product_id]);
}
别依赖前端传来的 $product_id 一定合法——它可能被篡改,后端得自己兜底。
清空购物车别只 unset 数组
很多人写 $_SESSION['cart'] = []; 就以为清完了,其实没问题;但更彻底的做法是 unset($_SESSION['cart']),再重新初始化。区别在于:前者保留空数组结构,后者真正“删除这个键”。
影响在于:如果后续逻辑靠 empty($_SESSION['cart']) 判断是否为空,两者都行;但如果用了 array_key_exists('cart', $_SESSION),前者返回 true,后者 false。
另外,清空后建议重置 session ID(可选):session_regenerate_id(true);,防止会话固定攻击——虽然对简单购物车不是强需求,但一旦加登录,这步就该补上。
实际项目里,购物车的持久化、库存同步、并发修改(比如用户开两个标签页同时加同一商品)才是真难点,$_SESSION 只解决最基础的“临时存一下”问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











