php购物车功能实现
数据库设计
创建必要的数据库表存储商品和购物车信息。商品表(products)通常包含id、name、price、stock等字段,购物车表(cart)包含user_id、product_id、quantity等字段。
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
price DECIMAL(10,2),
stock INT
);
CREATE TABLE cart (
user_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (user_id, product_id)
);
添加商品到购物车
通过表单或AJAX请求将商品添加到购物车。需要验证商品是否存在和库存是否充足。
// 添加商品到购物车
session_start();
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['product_id'])) {
$productId = (int)$_POST['product_id'];
$quantity = isset($_POST['quantity']) ? (int)$_POST['quantity'] : 1;
// 验证商品信息
$pdo = new PDO('mysql:host=localhost;dbname=shop', 'username', 'password');
$stmt = $pdo->prepare("SELECT * FROM products WHERE id = ?");
$stmt->execute([$productId]);
$product = $stmt->fetch();
if ($product && $product['stock'] >= $quantity) {
if (!isset($_SESSION['cart'][$productId])) {
$_SESSION['cart'][$productId] = 0;
}
$_SESSION['cart'][$productId] += $quantity;
// 可选的数据库存储
$stmt = $pdo->prepare("INSERT INTO cart VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE quantity = quantity + VALUES(quantity)");
$stmt->execute([$_SESSION['user_id'], $productId, $quantity]);
}
}
显示购物车内容
从session或数据库读取购物车数据并展示商品列表和总价。
// 显示购物车内容
session_start();
if (!empty($_SESSION['cart'])) {
$pdo = new PDO('mysql:host=localhost;dbname=shop', 'username', 'password');
$total = 0;
foreach ($_SESSION['cart'] as $productId => $quantity) {
$stmt = $pdo->prepare("SELECT * FROM products WHERE id = ?");
$stmt->execute([$productId]);
$product = $stmt->fetch();
if ($product) {
$subtotal = $product['price'] * $quantity;
$total += $subtotal;
echo "{$product['name']} - {$product['price']} x $quantity = $subtotal<br>";
}
}
echo "总价: $total";
}
更新购物车数量
提供修改商品数量的功能,通常通过表单或AJAX实现。
// 更新购物车数量
session_start();
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['product_id'])) {
$productId = (int)$_POST['product_id'];
$quantity = (int)$_POST['quantity'];
if ($quantity > 0) {
$_SESSION['cart'][$productId] = $quantity;
// 更新数据库
$pdo = new PDO('mysql:host=localhost;dbname=shop', 'username', 'password');
$stmt = $pdo->prepare("UPDATE cart SET quantity = ? WHERE user_id = ? AND product_id = ?");
$stmt->execute([$quantity, $_SESSION['user_id'], $productId]);
} else {
unset($_SESSION['cart'][$productId]);
// 从数据库删除
$stmt = $pdo->prepare("DELETE FROM cart WHERE user_id = ? AND product_id = ?");
$stmt->execute([$_SESSION['user_id'], $productId]);
}
}
清空购物车
提供清空购物车的功能,移除所有商品。
// 清空购物车
session_start();
if (isset($_POST['empty_cart'])) {
$_SESSION['cart'] = array();
// 清空数据库记录
$pdo = new PDO('mysql:host=localhost;dbname=shop', 'username', 'password');
$stmt = $pdo->prepare("DELETE FROM cart WHERE user_id = ?");
$stmt->execute([$_SESSION['user_id']]);
}
结账处理
将购物车内容转为订单,减少库存数量。
// 结账处理
session_start();
if (!empty($_SESSION['cart'])) {
$pdo = new PDO('mysql:host=localhost;dbname=shop', 'username', 'password');
try {
$pdo->beginTransaction();
// 创建订单
$stmt = $pdo->prepare("INSERT INTO orders (user_id, total, created_at) VALUES (?, ?, NOW())");
$stmt->execute([$_SESSION['user_id'], $total]);
$orderId = $pdo->lastInsertId();
// 添加订单商品
foreach ($_SESSION['cart'] as $productId => $quantity) {
$stmt = $pdo->prepare("INSERT INTO order_items (order_id, product_id, quantity, price)
SELECT ?, id, ?, price FROM products WHERE id = ?");
$stmt->execute([$orderId, $quantity, $productId]);
// 更新库存
$stmt = $pdo->prepare("UPDATE products SET stock = stock - ? WHERE id = ?");
$stmt->execute([$quantity, $productId]);
}
$pdo->commit();
$_SESSION['cart'] = array();
echo "订单创建成功";
} catch (Exception $e) {
$pdo->rollBack();
echo "订单创建失败: " . $e->getMessage();
}
}
以上代码展示了PHP购物车的基本功能实现,可根据实际需求进行调整和扩展。使用session存储购物车数据适合小型应用,大型应用建议结合数据库存储。注意处理并发问题和添加适当的安全措施如CSRF防护。







