php购物车实现方法
PHP购物车实现方法
使用Session存储购物车数据
通过PHP的$_SESSION超全局变量存储购物车数据,适合简单场景。初始化购物车时需先启动Session:
session_start();
if (!isset($_SESSION['cart'])) {
$_SESSION['cart'] = array();
}
添加商品到购物车时检查是否存在,避免重复:
function addToCart($productId, $quantity) {
if (isset($_SESSION['cart'][$productId])) {
$_SESSION['cart'][$productId] += $quantity;
} else {
$_SESSION['cart'][$productId] = $quantity;
}
}
移除商品直接unset对应键值:
function removeFromCart($productId) {
unset($_SESSION['cart'][$productId]);
}
数据库持久化存储
对于需要长期保存的购物车数据,可结合数据库实现。创建购物车表结构示例:
CREATE TABLE cart (
user_id INT,
product_id INT,
quantity INT,
added_at TIMESTAMP,
PRIMARY KEY (user_id, product_id)
);
添加商品时使用INSERT ON DUPLICATE KEY UPDATE语法:

$stmt = $pdo->prepare("
INSERT INTO cart (user_id, product_id, quantity, added_at)
VALUES (?, ?, ?, NOW())
ON DUPLICATE KEY UPDATE quantity = quantity + VALUES(quantity)
");
$stmt->execute([$userId, $productId, $quantity]);
购物车页面展示
从Session或数据库获取数据后渲染HTML:
$cartItems = $_SESSION['cart']; // 或从数据库查询
foreach ($cartItems as $productId => $quantity) {
$product = getProductById($productId); // 自定义商品查询函数
echo "<div>{$product['name']} x {$quantity} = {$product['price'] * $quantity}</div>";
}
订单结算处理
生成订单时验证库存并创建订单记录:
$pdo->beginTransaction();
try {
// 检查库存
foreach ($cartItems as $productId => $quantity) {
$stmt = $pdo->prepare("SELECT stock FROM products WHERE id = ? FOR UPDATE");
$stmt->execute([$productId]);
if ($stmt->fetch()['stock'] < $quantity) {
throw new Exception("库存不足");
}
}
// 创建订单
$orderId = createOrder($userId, $cartItems);
$pdo->commit();
clearCart(); // 清空购物车
} catch (Exception $e) {
$pdo->rollBack();
handleError($e->getMessage());
}
前端交互增强
使用Ajax实现无刷新操作购物车:

$('.add-to-cart').click(function() {
$.post('/cart/add', {product_id: $(this).data('id')}, function() {
updateCartCount();
});
});
实时更新购物车数量可通过定期查询或WebSocket推送:
// 后端接口
header('Content-Type: application/json');
echo json_encode(['count' => count($_SESSION['cart'])]);
安全注意事项
所有输入参数必须过滤防止SQL注入:
$productId = filter_input(INPUT_POST, 'product_id', FILTER_VALIDATE_INT);
if (!$productId) {
die("非法参数");
}
重要操作需验证用户权限:
if ($_SESSION['user_id'] != $userId) {
header("HTTP/1.1 403 Forbidden");
exit;
}






