You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

交易完成后无法更新商品库存数量问题求助

交易完成后商品库存未更新的问题修复

问题根源分析

  • 未定义的$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:40:29