如何用PHP做一个购物车页面
购物车是电商平台的核心功能之一,它允许用户临时存储选择的商品,调整数量,并最终完成购买,本文将详细介绍如何使用PHP和MySQL实现一个功能完整的购物车页面,包括商品添加、数量修改、删除、总价计算以及与数据库的交互。
准备工作:环境与数据库设计
在开始之前,确保你已经搭建了PHP运行环境(如XAMPP、WAMP或LAMP),并创建了一个MySQL数据库,我们需要设计两张核心表:products
(商品表)和cart
(购物车表)。
商品表(products)
用于存储商品信息,结构如下:
CREATE TABLE `products` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `price` decimal(10,2) NOT NULL, `image` varchar(255) DEFAULT NULL, `description` text, PRIMARY KEY (`id`) );
插入一些测试数据:
INSERT INTO `products` (`id`, `name`, `price`, `image`, `description`) VALUES (1, 'iPhone 13', 5999.00, 'iphone13.jpg', '苹果iPhone 13,A15芯片'), (2, 'MacBook Pro', 12999.00, 'macbook.jpg', '14英寸M1 Pro芯片'), (3, 'AirPods Pro', 1999.00, 'airpods.jpg', '主动降噪无线耳机');
购物车表(cart)
用于存储用户的购物车商品,结构如下:
CREATE TABLE `cart` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, -- 关联用户(本文简化为固定用户ID) `product_id` int(11) NOT NULL, `quantity` int(11) NOT NULL DEFAULT 1, `added_at` timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `user_product` (`user_id`,`product_id`) );
购物车页面实现步骤
我们将分模块实现购物车功能:商品列表展示、添加商品到购物车、购物车页面渲染、修改商品数量、删除商品以及总价计算。
数据库连接(config.php)
首先创建一个数据库连接文件,方便后续调用:
<?php $host = 'localhost'; $dbname = 'your_database'; $username = 'root'; $password = ''; try { $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("数据库连接失败: " . $e->getMessage()); } ?>
商品列表页面(index.php)
展示所有商品,并提供“加入购物车”按钮:
<?php require_once 'config.php'; // 获取所有商品 $stmt = $pdo->query("SELECT * FROM products"); $products = $stmt->fetchAll(PDO::FETCH_ASSOC); ?> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8">商品列表</title> <style> .product { border: 1px solid #ddd; padding: 10px; margin: 10px; float: left; width: 200px; } .product img { width: 100%; height: 150px; object-fit: cover; } .product h3 { margin: 10px 0; } .product .price { color: red; font-weight: bold; } </style> </head> <body> <h1>商品列表</h1> <div class="products"> <?php foreach ($products as $product): ?> <div class="product"> <img src="images/<?php echo $product['image']; ?>" alt="<?php echo $product['name']; ?>"> <h3><?php echo $product['name']; ?></h3> <p class="price">¥<?php echo $product['price']; ?></p> <a href="add_to_cart.php?id=<?php echo $product['id']; ?>">加入购物车</a> </div> <?php endforeach; ?> </div> </body> </html>
添加商品到购物车(add_to_cart.php)
处理用户点击“加入购物车”的逻辑,包括检查商品是否已在购物车中(若存在则增加数量,否则新增记录):
<?php require_once 'config.php'; session_start(); if (!isset($_SESSION['user_id'])) { $_SESSION['user_id'] = 1; // 简化:固定用户ID,实际应通过登录获取 } $product_id = $_GET['id'] ?? 0; if ($product_id <= 0) { die("商品ID无效"); } // 检查商品是否已在购物车 $stmt = $pdo->prepare("SELECT * FROM cart WHERE user_id = ? AND product_id = ?"); $stmt->execute([$_SESSION['user_id'], $product_id]); $existing_item = $stmt->fetch(PDO::FETCH_ASSOC); if ($existing_item) { // 已存在,数量+1 $stmt = $pdo->prepare("UPDATE cart SET quantity = quantity + 1 WHERE user_id = ? AND product_id = ?"); $stmt->execute([$_SESSION['user_id'], $product_id]); } else { // 不存在,新增记录 $stmt = $pdo->prepare("INSERT INTO cart (user_id, product_id, quantity) VALUES (?, ?, 1)"); $stmt->execute([$_SESSION['user_id'], $product_id]); } header("Location: cart.php"); exit; ?>
购物车页面(cart.php)
展示购物车中的商品,包括商品名称、单价、数量、小计,并提供修改数量、删除商品的功能:
<?php require_once 'config.php'; session_start(); if (!isset($_SESSION['user_id'])) { die("请先登录"); } $user_id = $_SESSION['user_id']; $cart_items = []; $total_price = 0; // 获取购物车商品及商品详情 $stmt = $pdo->prepare(" SELECT c.*, p.name, p.price, p.image FROM cart c JOIN products p ON c.product_id = p.id WHERE c.user_id = ? "); $stmt->execute([$user_id]); $cart_items = $stmt->fetchAll(PDO::FETCH_ASSOC); // 计算总价 foreach ($cart_items as $item) { $total_price += $item['price'] * $item['quantity']; } ?> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8">购物车</title> <style> .cart { max-width: 800px; margin: 0 auto; } .cart-item { border-bottom: 1px solid #eee; padding: 15px; display: flex; align-items: center; } .cart-item img { width: 80px; height: 80px; object-fit: cover; margin-right: 15px; } .cart-item .details { flex: 1; } .cart-item .price { color: red; font-weight: bold; } .cart-item .quantity { display: flex; align-items: center; gap: 10px; } .cart-item .quantity input { width: 50px; text-align: center; } .cart-item .remove { color: red; text-decoration: none; } .total { text-align: right; margin-top: 20px; font-size: 18px; font-weight: bold; } </style> </head> <body> <h1>我的购物车</h1> <div class="cart"> <?php if (empty($cart_items)): ?> <p>购物车为空,快去添加商品吧!</p> <?php else: ?> <?php foreach ($cart_items as $item): ?> <div class="cart-item"> <img src="images/<?php echo $item['image']; ?>" alt="<?php echo $item['name']; ?>"> <div class="details"> <h3><?php echo $item['name']; ?></h3> <p class="price">¥<?php echo $item['price']; ?></p> </div> <div class="quantity"> <form action="update_quantity.php" method="post"> <input type="hidden" name="cart_id" value="<?php echo $item['id']; ?>"> <input type="number" name="quantity" value="<?php echo $item['quantity']; min: 1;" min="1"> <button type="submit">更新</button> </form> </div> <a href="remove_from_cart.php?id=<?php echo $item['id']; ?>" class="remove">删除</a> </div> <?php endforeach
还没有评论,来说两句吧...