PHP购物车问题求助:仅首个商品可更新数量,其余添加重复
问题分析与解决方案
问题根源
你的代码核心问题在于只查询了购物车的第一行数据,没有完整校验当前商品是否已存在于购物车中:
- 你通过
$row= $result->fetch_array();仅获取了查询结果的第一条记录,后续仅对比这一条的prod_id - 当购物车已有其他商品时,新添加非首个商品会因为和第一条prod_id不匹配,直接执行插入逻辑,导致重复条目
修复后的代码逻辑
正确思路是精准查询当前商品是否在购物车中,而非遍历全表;同时简化数量上限校验,修复SQL注入风险:
... // 先获取并格式化用户输入 $prod_id = $_REQUEST['id']; $quantity = (int)$_REQUEST['quantity']; $name = $_REQUEST['amd']; $price = (float)$_REQUEST['price']; // 精准查询当前商品是否在购物车中(用预处理语句防SQL注入) $checkSql = "SELECT quantity FROM cart WHERE prod_id = ?"; $stmt = mysqli_prepare($conn, $checkSql); mysqli_stmt_bind_param($stmt, "s", $prod_id); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); if ($result->num_rows > 0) { // 商品已存在,获取当前数量 $row = mysqli_fetch_assoc($result); $currentQty = $row['quantity']; // 简化数量校验:判断添加后总数量是否超过5 if ($currentQty + $quantity > 5) { echo "Quantity exceeds limit (max 5 per item)"; } else { // 更新商品数量和总价 $totalAdd = $price * $quantity; $updateSql = "UPDATE cart SET quantity = quantity + ?, price = price + ? WHERE prod_id = ?"; $updateStmt = mysqli_prepare($conn, $updateSql); mysqli_stmt_bind_param($updateStmt, "dss", $quantity, $totalAdd, $prod_id); mysqli_stmt_execute($updateStmt); } } else { // 商品不存在,插入新条目 if ($quantity > 5) { echo "Quantity exceeds limit (max 5 per item)"; } else { $total = $price * $quantity; $insertSql = "INSERT INTO cart (prod_id, name, price, quantity) VALUES (?, ?, ?, ?)"; $insertStmt = mysqli_prepare($conn, $insertSql); mysqli_stmt_bind_param($insertStmt, "ssdi", $prod_id, $name, $total, $quantity); mysqli_stmt_execute($insertStmt); } } ...
关键优化点
- 精准查询:直接通过
prod_id定位目标商品,避免无效遍历全表 - 简化校验逻辑:用
$currentQty + $quantity > 5替代繁琐的多条件判断,逻辑更清晰 - SQL注入防护:使用mysqli预处理语句,杜绝用户输入直接拼接SQL的风险
- 类型转换:对
quantity和price做强制类型转换,确保数据格式合法
内容的提问来源于stack exchange,提问作者Ayy Lmao
相关产品推荐
相关产品推荐

