交易完成后无法更新商品库存数量问题求助
交易完成后商品库存未更新的问题修复
问题根源分析
- 未定义的
$id变量:执行库存更新的SQL语句使用了:id参数,但代码里从未给$id赋值,导致UPDATE语句无法匹配任何商品记录,自然不会修改库存。 - 错误的库存更新逻辑:原代码试图用URL参数
p_quantity扣减库存,但购物车通常包含多个商品,必须遍历每个商品,根据对应ID和购买数量分别扣减,而非依赖单一URL参数。 - 错误的更新时机:原代码在插入销售记录后、查询购物车前就执行库存更新,此时还未获取购物车商品信息,无法精准对应需要扣减库存的商品。
修正后的代码
<?php include 'includes/session.php'; if(isset($_GET['confirmation'])){ $confirmation = $_GET['confirmation']; $date = date('Y-m-d'); $conn = $pdo->open(); try{ // 插入销售主记录 $stmt = $conn->prepare("INSERT INTO sales (user_id, confirmation, status, sales_date) VALUES (:user_id, :confirmation, :status, :sales_date)"); $stmt->execute(['user_id'=>$user['id'], 'confirmation'=>$confirmation, 'status'=>1, 'sales_date'=>$date]); $salesid = $conn->lastInsertId(); // 查询购物车中的商品 $stmt = $conn->prepare("SELECT * FROM cart LEFT JOIN products ON products.id=cart.product_id WHERE user_id=:user_id"); $stmt->execute(['user_id'=>$user['id']]); foreach($stmt as $row){ // 插入销售明细 $stmt_detail = $conn->prepare("INSERT INTO details (sales_id, product_id, quantity) VALUES (:sales_id, :product_id, :quantity)"); $stmt_detail->execute(['sales_id'=>$salesid, 'product_id'=>$row['product_id'], 'quantity'=>$row['quantity']]); // 扣减对应商品的库存 $stmt_update = $conn->prepare("UPDATE products SET p_quantity = p_quantity - :quantity WHERE id = :product_id"); $stmt_update->execute(['quantity'=>$row['quantity'], 'product_id'=>$row['product_id']]); } // 清空购物车 $stmt = $conn->prepare("DELETE FROM cart WHERE user_id=:user_id"); $stmt->execute(['user_id'=>$user['id']]); $_SESSION['success'] = '交易成功,感谢您的购买。'; } catch(PDOException $e){ $_SESSION['error'] = $e->getMessage(); } $pdo->close(); } header('location: profile.php'); ?>
关键修正说明
- 将库存扣减逻辑移至购物车商品遍历循环内,确保每个商品按实际购买数量扣减库存。
- 使用购物车商品的
product_id和quantity作为UPDATE参数,解决了未定义变量和单一参数的问题。 - 合并嵌套的try-catch块,简化代码结构,保证异常能被正确捕获。
内容的提问来源于stack exchange,提问作者Sencho
相关产品推荐
相关产品推荐

