当前位置:首页 > PHP

php商城购物车实现

2026-01-29 06:16:37PHP

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 保护

性能优化

对于大型商城,购物车功能可能需要考虑以下优化:

php商城购物车实现

  • 使用 Redis 等缓存技术存储购物车数据
  • 实现延迟加载,分批加载购物车商品
  • 对数据库查询进行优化,添加适当索引
  • 实现客户端本地存储临时购物车数据

以上代码和方案可以根据实际项目需求进行调整和扩展,构建完整的商城购物车功能。

标签: 购物车商城
分享给朋友:

相关文章

php session实现购物车

php session实现购物车

PHP Session 实现购物车 初始化 Session 确保在使用 Session 前调用 session_start() 函数。通常放在 PHP 文件的最顶部。 <?php sessio…

vue商城首页实现

vue商城首页实现

Vue 商城首页实现步骤 项目初始化 使用 Vue CLI 创建项目,安装必要依赖(如 Vue Router、Vuex、Axios 等)。确保项目结构清晰,划分组件目录、路由配置目录等。 vue c…

vue:实现商城分类

vue:实现商城分类

实现商城分类的步骤 在Vue中实现商城分类功能,可以通过组件化设计和状态管理来实现。以下是具体的实现方法。 创建分类组件 创建一个独立的分类组件,用于展示商城的分类列表。可以使用v-for指令动态渲…

基于vue商城实现原理

基于vue商城实现原理

Vue商城实现原理 Vue商城的实现主要基于Vue.js框架及其生态系统,结合后端API完成数据交互。核心原理包括组件化开发、状态管理、路由控制和前后端分离架构。 组件化开发 Vue商城采用组件化架…

vue实现商城左侧导航

vue实现商城左侧导航

实现商城左侧导航的步骤 使用Vue实现商城左侧导航需要结合组件化开发、状态管理和样式设计。以下是具体实现方法: 数据结构设计 左侧导航通常需要分类数据,建议使用嵌套数组结构: data() {…

react实现商城建站

react实现商城建站

技术选型与初始化 使用 create-react-app 快速初始化项目,搭配 TypeScript 提升代码健壮性。核心依赖包括: React Router:管理路由(如商品详情、购物车页)。…