php商城购物车实现
PHP 商城购物车实现
数据库设计
购物车功能通常需要与数据库交互,存储用户选择的商品信息。以下是一个简单的购物车表设计:
CREATE TABLE `cart` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`quantity` int(11) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
添加商品到购物车
通过 PHP 处理用户添加商品到购物车的请求,需要验证用户登录状态和商品信息。
<?php
session_start();
require_once 'db_config.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['product_id'])) {
$productId = $_POST['product_id'];
$quantity = isset($_POST['quantity']) ? (int)$_POST['quantity'] : 1;
if (!isset($_SESSION['user_id'])) {
echo json_encode(['status' => 'error', 'message' => '请先登录']);
exit;
}
$userId = $_SESSION['user_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'] + $quantity;
$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 (?, ?, ?)");
$insertStmt->execute([$userId, $productId, $quantity]);
}
echo json_encode(['status' => 'success', 'message' => '商品已添加到购物车']);
}
?>
显示购物车内容
从数据库获取当前用户的购物车信息并显示。
<?php
session_start();
require_once 'db_config.php';
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
$userId = $_SESSION['user_id'];
$stmt = $pdo->prepare("
SELECT p.id, p.name, p.price, p.image, c.quantity
FROM cart c
JOIN products p ON c.product_id = p.id
WHERE c.user_id = ?
");
$stmt->execute([$userId]);
$cartItems = $stmt->fetchAll();
$total = 0;
foreach ($cartItems as $item) {
$total += $item['price'] * $item['quantity'];
}
?>
<!-- HTML 显示购物车内容 -->
<div class="cart-container">
<?php foreach ($cartItems as $item): ?>
<div class="cart-item">
<img src="<?= htmlspecialchars($item['image']) ?>" alt="<?= htmlspecialchars($item['name']) ?>">
<h3><?= htmlspecialchars($item['name']) ?></h3>
<p>价格: <?= $item['price'] ?> 元</p>
<p>数量: <?= $item['quantity'] ?></p>
<p>小计: <?= $item['price'] * $item['quantity'] ?> 元</p>
<button class="remove-item" data-id="<?= $item['id'] ?>">删除</button>
</div>
<?php endforeach; ?>
<div class="cart-total">
<h3>总计: <?= $total ?> 元</h3>
</div>
</div>
更新购物车数量
通过 AJAX 实现购物车商品数量的增减。
// 前端 JavaScript 代码
$(document).on('click', '.update-quantity', function() {
var productId = $(this).data('id');
var newQuantity = $(this).siblings('.quantity-input').val();
$.ajax({
url: 'update_cart.php',
method: 'POST',
data: {
product_id: productId,
quantity: newQuantity
},
success: function(response) {
location.reload();
}
});
});
// update_cart.php
<?php
session_start();
require_once 'db_config.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['product_id'], $_POST['quantity'])) {
$productId = $_POST['product_id'];
$quantity = (int)$_POST['quantity'];
$userId = $_SESSION['user_id'];
if ($quantity <= 0) {
// 删除商品
$stmt = $pdo->prepare("DELETE FROM cart WHERE user_id = ? AND product_id = ?");
$stmt->execute([$userId, $productId]);
} else {
// 更新数量
$stmt = $pdo->prepare("UPDATE cart SET quantity = ? WHERE user_id = ? AND product_id = ?");
$stmt->execute([$quantity, $userId, $productId]);
}
echo json_encode(['status' => 'success']);
}
?>
删除购物车商品
实现从购物车中移除商品的功能。
<?php
session_start();
require_once 'db_config.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['product_id'])) {
$productId = $_POST['product_id'];
$userId = $_SESSION['user_id'];
$stmt = $pdo->prepare("DELETE FROM cart WHERE user_id = ? AND product_id = ?");
$stmt->execute([$userId, $productId]);
echo json_encode(['status' => 'success', 'message' => '商品已移除']);
}
?>
会话存储实现
对于不需要持久化存储的简单购物车,可以使用 PHP 会话(Session)来存储购物车数据。
<?php
session_start();
// 添加商品到会话购物车
if (isset($_POST['product_id'])) {
$productId = $_POST['product_id'];
if (!isset($_SESSION['cart'])) {
$_SESSION['cart'] = [];
}
if (isset($_SESSION['cart'][$productId])) {
$_SESSION['cart'][$productId]++;
} else {
$_SESSION['cart'][$productId] = 1;
}
}
// 显示会话购物车内容
if (isset($_SESSION['cart']) && !empty($_SESSION['cart'])) {
foreach ($_SESSION['cart'] as $productId => $quantity) {
// 这里可以查询数据库获取商品详情
echo "商品ID: $productId, 数量: $quantity <br>";
}
}
?>
安全考虑
实现购物车功能时需要注意以下安全事项:
- 验证用户身份,防止未授权访问
- 对用户输入进行过滤和验证
- 使用预处理语句防止 SQL 注入
- 对输出内容进行转义,防止 XSS 攻击
- 重要操作如结算需要 CSRF 保护
性能优化
对于大型商城,购物车功能可能需要考虑以下优化:
- 使用 Redis 等缓存技术存储购物车数据
- 实现延迟加载,分批加载购物车商品
- 对数据库查询进行优化,添加适当索引
- 实现客户端本地存储临时购物车数据
以上代码和方案可以根据实际项目需求进行调整和扩展,构建完整的商城购物车功能。







