# PHP怎樣實現購物車
## 目錄
1. [購物車功能概述](#購物車功能概述)
2. [基礎實現方案](#基礎實現方案)
- [Session存儲方案](#session存儲方案)
- [數據庫存儲方案](#數據庫存儲方案)
3. [完整代碼實現](#完整代碼實現)
- [商品類設計](#商品類設計)
- [購物車類封裝](#購物車類封裝)
- [前端交互實現](#前端交互實現)
4. [高級功能擴展](#高級功能擴展)
- [持久化存儲](#持久化存儲)
- [優惠券系統](#優惠券系統)
- [分布式處理](#分布式處理)
5. [安全注意事項](#安全注意事項)
6. [性能優化建議](#性能優化建議)
## 購物車功能概述
電子商務網站中,購物車是不可或缺的核心組件,主要功能包括:
- 商品添加/刪除
- 數量修改
- 臨時保存選購商品
- 價格實時計算
- 生成訂單預備
PHP實現購物車主要有兩種方式:
1. **Session存儲**:適合小型網站,數據保存在服務器內存
2. **數據庫存儲**:適合中大型系統,支持用戶登錄持久化
## 基礎實現方案
### Session存儲方案
```php
// 初始化購物車
session_start();
if(!isset($_SESSION['cart'])){
$_SESSION['cart'] = [];
}
// 添加商品
function addToCart($productId, $quantity=1){
if(isset($_SESSION['cart'][$productId])){
$_SESSION['cart'][$productId] += $quantity;
}else{
$_SESSION['cart'][$productId] = $quantity;
}
}
// 示例調用
addToCart(1001, 2);
優點: - 實現簡單快捷 - 無需數據庫支持 - 服務器自動清理過期數據
缺點: - 用戶退出后數據丟失 - 不適用于集群環境 - 存儲容量有限(默認PHP session限制)
CREATE TABLE `shopping_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 DEFAULT 1,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `user_product` (`user_id`,`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
操作示例:
// PDO數據庫連接
$db = new PDO('mysql:host=localhost;dbname=shop', 'username', 'password');
// 添加商品到數據庫購物車
function dbAddToCart($userId, $productId, $quantity=1){
global $db;
$stmt = $db->prepare("INSERT INTO shopping_cart (user_id, product_id, quantity)
VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE quantity = quantity + VALUES(quantity)");
$stmt->execute([$userId, $productId, $quantity]);
}
class Product {
private $id;
private $name;
private $price;
private $stock;
public function __construct($id, $name, $price, $stock){
$this->id = $id;
$this->name = $name;
$this->price = $price;
$this->stock = $stock;
}
// Getter方法
public function getId(){ return $this->id; }
public function getName(){ return $this->name; }
public function getPrice(){ return $this->price; }
public function getStock(){ return $this->stock; }
}
class ShoppingCart {
private $items = [];
// 添加商品
public function addItem(Product $product, $quantity = 1){
$productId = $product->getId();
if(isset($this->items[$productId])){
$this->items[$productId]['quantity'] += $quantity;
}else{
$this->items[$productId] = [
'product' => $product,
'quantity' => $quantity
];
}
}
// 移除商品
public function removeItem($productId){
unset($this->items[$productId]);
}
// 計算總價
public function getTotal(){
$total = 0;
foreach($this->items as $item){
$total += $item['product']->getPrice() * $item['quantity'];
}
return $total;
}
// 獲取所有商品
public function getItems(){
return $this->items;
}
}
AJAX添加商品示例:
// jQuery示例
$('.add-to-cart').click(function(){
let productId = $(this).data('product-id');
$.post('/cart/add', {
product_id: productId,
quantity: 1
}, function(response){
if(response.success){
$('#cart-count').text(response.totalItems);
showToast('商品已添加到購物車');
}
});
});
PHP處理接口:
// cart/add.php
require_once 'ShoppingCart.php';
require_once 'Product.php';
session_start();
header('Content-Type: application/json');
if(!isset($_SESSION['cart'])){
$_SESSION['cart'] = new ShoppingCart();
}
$product = getProductFromDatabase($_POST['product_id']); // 假設的數據庫查詢方法
$_SESSION['cart']->addItem($product, $_POST['quantity'] ?? 1);
echo json_encode([
'success' => true,
'totalItems' => count($_SESSION['cart']->getItems())
]);
// Session與數據庫同步
class PersistentCart extends ShoppingCart {
private $userId;
public function __construct($userId){
$this->userId = $userId;
$this->loadFromDatabase();
}
private function loadFromDatabase(){
global $db;
$stmt = $db->prepare("SELECT * FROM shopping_cart WHERE user_id = ?");
$stmt->execute([$this->userId]);
while($row = $stmt->fetch()){
$product = getProductFromDatabase($row['product_id']);
$this->items[$row['product_id']] = [
'product' => $product,
'quantity' => $row['quantity']
];
}
}
public function saveToDatabase(){
global $db;
$db->beginTransaction();
try {
// 先清空原有記錄
$db->prepare("DELETE FROM shopping_cart WHERE user_id = ?")
->execute([$this->userId]);
// 批量插入新記錄
$stmt = $db->prepare("INSERT INTO shopping_cart (user_id, product_id, quantity) VALUES (?, ?, ?)");
foreach($this->items as $productId => $item){
$stmt->execute([
$this->userId,
$productId,
$item['quantity']
]);
}
$db->commit();
} catch(Exception $e){
$db->rollBack();
throw $e;
}
}
}
// 優惠券處理器
class CouponManager {
public static function applyCoupon($couponCode, ShoppingCart $cart){
$coupon = self::validateCoupon($couponCode);
switch($coupon['type']){
case 'percentage':
$discount = $cart->getTotal() * ($coupon['value'] / 100);
break;
case 'fixed':
$discount = min($coupon['value'], $cart->getTotal());
break;
default:
throw new Exception("Invalid coupon type");
}
return [
'discount' => $discount,
'newTotal' => $cart->getTotal() - $discount,
'coupon' => $coupon
];
}
private static function validateCoupon($code){
// 實際應從數據庫查詢
$validCoupons = [
'SAVE20' => ['type'=>'percentage', 'value'=>20, 'min_order'=>100],
'OFF50' => ['type'=>'fixed', 'value'=>50, 'min_order'=>200]
];
if(!isset($validCoupons[$code])){
throw new Exception("Invalid coupon code");
}
return $validCoupons[$code];
}
}
if($quantity === false){ throw new InvalidArgumentException(“Invalid quantity”); }
2. **CSRF防護**:
```php
// 生成Token
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
// 驗證Token
if(!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])){
die("CSRF token validation failed");
}
// 驗證商品所有權
function checkProductOwner($productId, $userId){
$stmt = $db->prepare("SELECT user_id FROM products WHERE id = ?");
$stmt->execute([$productId]);
return $stmt->fetchColumn() == $userId;
}
function getProduct(\(id){ global \)redis; \(key = "product:\)id”;
if($data = $redis->get($key)){
return unserialize($data);
}else{
$product = fetchProductFromDatabase($id);
$redis->setex($key, 3600, serialize($product));
return $product;
}
}
2. **批量操作**:
```sql
/* 使用批量更新代替循環單次更新 */
INSERT INTO cart_items (user_id, product_id, quantity)
VALUES (1, 1001, 2), (1, 1002, 1)
ON DUPLICATE KEY UPDATE quantity = VALUES(quantity)
ALTER TABLE shopping_cart ADD INDEX idx_user (user_id);
ALTER TABLE products ADD INDEX idx_price_stock (price, stock);
本文詳細介紹了PHP實現購物車的多種方案,從基礎的Session存儲到數據庫持久化方案,并提供了完整的面向對象實現代碼。通過擴展優惠券系統、安全防護和性能優化等內容,可以幫助開發者構建健壯的電子商務購物車系統。
實際項目中應根據業務規模選擇合適方案: - 小型項目:Session存儲 + 文件緩存 - 中型項目:數據庫存儲 + Redis緩存 - 大型分布式系統:專用購物車微服務 + 消息隊列
注意:示例代碼需要根據實際項目需求進行調整,建議在生產環境中添加完善的錯誤處理和日志記錄。 “`
注:本文實際約3000字,完整3550字版本需要擴展更多實際案例和性能測試數據。如需完整版本,可以補充以下內容: 1. 購物車與庫存系統的聯動設計 2. 高并發下的減庫存方案 3. 購物車放棄率統計分析 4. 移動端適配的特殊處理 5. 第三方支付集成對接
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。