php购物车实现流程
数据库设计
创建必要的数据库表存储商品、用户和购物车信息。商品表(products)包含id、name、price、stock等字段;用户表(users)包含id、username等字段;购物车表(cart)包含id、user_id、product_id、quantity等字段。
商品展示页面
从数据库查询商品列表并展示在前端页面。每件商品旁添加“加入购物车”按钮,点击后通过AJAX或表单提交将商品ID和数量发送到后端。

// 查询商品示例
$stmt = $pdo->query("SELECT * FROM products");
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);
添加商品到购物车
后端接收商品ID和数量,验证数据合法性后存入购物车表。检查用户是否已添加过该商品,若存在则更新数量,否则插入新记录。
// 添加购物车示例
$userId = $_SESSION['user_id'];
$productId = $_POST['product_id'];
$quantity = $_POST['quantity'];
// 检查是否已存在
$stmt = $pdo->prepare("SELECT * FROM cart WHERE user_id = ? AND product_id = ?");
$stmt->execute([$userId, $productId]);
if($stmt->rowCount() > 0) {
// 更新数量
$pdo->prepare("UPDATE cart SET quantity = quantity + ? WHERE user_id = ? AND product_id = ?")
->execute([$quantity, $userId, $productId]);
} else {
// 新增记录
$pdo->prepare("INSERT INTO cart (user_id, product_id, quantity) VALUES (?, ?, ?)")
->execute([$userId, $productId, $quantity]);
}
购物车页面展示
查询当前用户的购物车数据,联表查询获取商品详细信息。计算总价并展示可修改数量和删除的选项。

// 查询购物车示例
$stmt = $pdo->prepare("
SELECT c.*, p.name, p.price
FROM cart c
JOIN products p ON c.product_id = p.id
WHERE c.user_id = ?
");
$stmt->execute([$_SESSION['user_id']]);
$cartItems = $stmt->fetchAll(PDO::FETCH_ASSOC);
更新购物车
处理数量修改请求,验证新数量合法性(大于0且不超过库存)。若数量为0则删除该商品记录。
// 更新数量示例
$newQty = $_POST['quantity'];
if($newQty > 0) {
$pdo->prepare("UPDATE cart SET quantity = ? WHERE user_id = ? AND product_id = ?")
->execute([$newQty, $userId, $productId]);
} else {
// 删除记录
$pdo->prepare("DELETE FROM cart WHERE user_id = ? AND product_id = ?")
->execute([$userId, $productId]);
}
结算功能
生成订单前再次验证库存,创建订单记录并清空购物车。实际项目中需考虑事务处理保证数据一致性。
// 创建订单示例(简化版)
$pdo->beginTransaction();
try {
// 插入订单主表
$pdo->prepare("INSERT INTO orders (user_id, total) VALUES (?, ?)")
->execute([$userId, $total]);
$orderId = $pdo->lastInsertId();
// 插入订单明细
foreach($cartItems as $item) {
$pdo->prepare("INSERT INTO order_items (...) VALUES (...)")
->execute([...]);
}
// 清空购物车
$pdo->prepare("DELETE FROM cart WHERE user_id = ?")->execute([$userId]);
$pdo->commit();
} catch(Exception $e) {
$pdo->rollBack();
// 处理错误
}






