php 购物车实现
数据库设计
购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(用户ID)、product_id(商品ID)、quantity(数量)、created_at(创建时间)。
CREATE TABLE cart (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (product_id) REFERENCES products(id)
);
添加商品到购物车
通过表单或AJAX请求将商品ID和用户ID提交到后端处理。PHP脚本接收数据后,检查商品是否已存在购物车中。若存在则更新数量,否则插入新记录。
<?php
// 连接数据库
$pdo = new PDO('mysql:host=localhost;dbname=shop', 'username', 'password');
// 获取用户ID和商品ID
$userId = $_POST['user_id'];
$productId = $_POST['product_id'];
// 检查是否已存在
$stmt = $pdo->prepare("SELECT * FROM cart WHERE user_id = ? AND product_id = ?");
$stmt->execute([$userId, $productId]);
$existingItem = $stmt->fetch();
if ($existingItem) {
// 更新数量
$newQuantity = $existingItem['quantity'] + 1;
$updateStmt = $pdo->prepare("UPDATE cart SET quantity = ? WHERE id = ?");
$updateStmt->execute([$newQuantity, $existingItem['id']]);
} else {
// 新增记录
$insertStmt = $pdo->prepare("INSERT INTO cart (user_id, product_id, quantity) VALUES (?, ?, 1)");
$insertStmt->execute([$userId, $productId]);
}
echo json_encode(['success' => true]);
?>
显示购物车内容
查询购物车表并关联商品表获取详细信息,如商品名称、价格等。通过循环输出HTML内容展示购物车列表。
<?php
$userId = $_SESSION['user_id']; // 假设用户已登录
$stmt = $pdo->prepare("
SELECT cart.*, products.name, products.price
FROM cart
JOIN products ON cart.product_id = products.id
WHERE cart.user_id = ?
");
$stmt->execute([$userId]);
$cartItems = $stmt->fetchAll();
foreach ($cartItems as $item) {
echo "<div class='cart-item'>";
echo "<h3>{$item['name']}</h3>";
echo "<p>Price: {$item['price']}</p>";
echo "<p>Quantity: {$item['quantity']}</p>";
echo "</div>";
}
?>
更新购物车数量
通过AJAX请求传递商品ID和新的数量值。PHP脚本验证数据后更新数据库。
<?php
$cartId = $_POST['cart_id'];
$newQuantity = $_POST['quantity'];
// 验证数量大于0
if ($newQuantity > 0) {
$stmt = $pdo->prepare("UPDATE cart SET quantity = ? WHERE id = ?");
$stmt->execute([$newQuantity, $cartId]);
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => 'Invalid quantity']);
}
?>
删除购物车商品
通过传递购物车项ID删除指定记录。PHP脚本执行DELETE操作。
<?php
$cartId = $_POST['cart_id'];
$stmt = $pdo->prepare("DELETE FROM cart WHERE id = ?");
$stmt->execute([$cartId]);
echo json_encode(['success' => true]);
?>
计算总价
在显示购物车时,通过SQL查询或PHP循环计算所有商品的总价。
<?php
$total = 0;
foreach ($cartItems as $item) {
$total += $item['price'] * $item['quantity'];
}
echo "<p>Total: {$total}</p>";
?>
会话存储(无数据库方案)
对于无需持久化的场景,可使用$_SESSION临时存储购物车数据。适合小型或临时购物车需求。
<?php
session_start();
if (!isset($_SESSION['cart'])) {
$_SESSION['cart'] = [];
}
// 添加商品
$_SESSION['cart'][$productId] = [
'quantity' => ($_SESSION['cart'][$productId]['quantity'] ?? 0) + 1
];
?>





