首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于PHP的网上书店设计与实现:CodeBuddy助力电子商务开发

基于PHP的网上书店设计与实现:CodeBuddy助力电子商务开发

原创
作者头像
Lethehong
发布2025-05-19 13:41:09
发布2025-05-19 13:41:09
2970
举报
文章被收录于专栏:热度文章热度文章

我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴

摘要

随着信息技术的发展,数据库技术在Internet中的应用越来越广泛,为广大网络用户提供了更加周到和人性化的服务。网上书店作为电子商务的重要应用场景,在我国虽然刚刚起步,但发展迅速。本文对网上书店的电子商务发展进行了总结,分析了其优势、瓶颈等问题,并结合CodeBuddy智能开发平台,详细介绍了如何基于Apache服务器、PHP编程语言和MySQL数据库这一经典组合来实现电子商务网站。从首页设计、用户注册登录到图书查询、购物系统,本文循序渐进地阐述了网站应具备的各项功能,以及CodeBuddy如何在这些环节中提供智能辅助,大幅提升开发效率。研究表明,CodeBuddy不仅能加速开发过程,还能显著提高代码质量和安全性,为网上书店的建设提供了强有力的技术支持。

关键词:电子商务;网上书店;PHP;Apache服务器;MySQL数据库;CodeBuddy;智能开发

1. 电子商务的发展与现状分析

1.1 传统商务模式的局限

在当今激烈的市场经济环境中,传统商务模式面临着网络时代的严峻考验。传统销售模式存在诸多弊端和局限性:流程复杂、周期漫长、效率低下。这与现代人追求高效率、快速度、易操作的消费理念背道而驰。电子商务的兴起正在加速传统商务模式的淡化和弱化。

在开发网上书店项目时,我们首先分析了传统书店模式的痛点:

  1. 地理位置限制,消费者需要亲自前往实体店
  2. 库存有限,难以满足多样化需求
  3. 营业时间受限,不能提供24小时服务
  4. 信息更新缓慢,难以及时了解新书信息

1.2 电子商务的优势

随着网络购物的普及,电子商务系统的优势日益明显:

  1. 打破时空限制:网站提供了一个跨地域、跨时间的服务平台,消费者无需往返于各个商场,足不出户即可体验购物乐趣。
  2. 信息全面系统:电子商务系统为消费者提供更为全面、系统的信息和服务,用户可以轻松比较不同商品,省去不必要的麻烦。
  3. 消费决策辅助:通过其他消费者的反馈和点评,用户可以第一时间了解商品的优劣程度和受欢迎程度,避免盲目消费。

在开发过程中,CodeBuddy智能助手帮助我们充分发挥这些优势。例如,在设计用户评论系统时,CodeBuddy提供了以下智能建议:

代码语言:php
复制
// CodeBuddy建议:使用更安全的数据验证方式处理用户评论
function addBookReview($bookId, $userId, $rating, $comment) {
    // 数据验证
    $bookId = filter_var($bookId, FILTER_VALIDATE_INT);
    $userId = filter_var($userId, FILTER_VALIDATE_INT);
    $rating = filter_var($rating, FILTER_VALIDATE_INT, 
                        ["options" => ["min_range" => 1, "max_range" => 5]]);
    $comment = htmlspecialchars(trim($comment), ENT_QUOTES, 'UTF-8');
    
    // 防止SQL注入的参数化查询
    $stmt = $conn->prepare("INSERT INTO book_reviews (book_id, user_id, rating, comment, review_date) 
                           VALUES (?, ?, ?, ?, NOW())");
    $stmt->bind_param("iiis", $bookId, $userId, $rating, $comment);
    return $stmt->execute();
}

CodeBuddy不仅提供了代码建议,还解释了为什么这样的实现更安全、更高效,帮助开发者理解最佳实践。

1.3 电子商务的现状及面临的问题

尽管电子商务发展迅速,但仍面临诸多挑战:

  1. 网络安全问题:消费者担忧个人信息泄露和支付安全。
  2. 软件技术问题:支付系统不完善,存在技术漏洞。
  3. 交易配送问题:物流系统不健全,影响用户体验。
  4. 个人诚信问题:网络交易信誉度低,信息不对称。

针对这些问题,CodeBuddy提供了全面的解决方案。以安全问题为例,在开发支付系统时,CodeBuddy自动检测到潜在的安全隐患并提供了修复建议:

代码语言:php
复制
// 原始代码 - 存在安全风险
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";

// CodeBuddy检测并建议修改为:
$stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();

// CodeBuddy进一步建议使用密码哈希:
// 存储密码时
$hashed_password = password_hash($password, PASSWORD_DEFAULT);

// 验证密码时
if(password_verify($input_password, $stored_hash)) {
    // 密码正确
}

通过这种智能检测和建议机制,CodeBuddy帮助开发者避免了常见的安全漏洞,提高了系统的整体安全性。

1.4 电子商务的发展趋势

电子商务标准的发展呈现以下趋势:

  1. 标准面向市场化:从技术驱动向市场驱动发展
  2. 标准制定集中化:相关机构由分散走向合作
  3. 标准内容广泛化:涵盖多领域、跨学科的综合标准
  4. 标准合作国际化:依靠国际合作制定全球性标准
  5. 标准适用灵活化:适应电子商务快速发展的特点

CodeBuddy作为现代开发工具,紧跟这些趋势,不断更新其知识库和功能,确保开发者能够按照最新的标准和最佳实践进行开发。

2. 网上书店的实现

2.1 首页的制作

首页分为上、中、下三部分,CodeBuddy提供了响应式设计建议:

2.1.1 首页上部制作

首页上部包含网站名称、功能页面标签和简单的图书查询功能。在这一部分,CodeBuddy提供了响应式设计的建议,确保网站在不同设备上都能良好显示:

代码语言:php
复制
// ... 现有代码 ...
<div class="header-container">
    <div class="logo">
        <h1>网上书店</h1>
    </div>
    <div class="search-box">
        <form action="search.php" method="get">
            <input type="text" name="keyword" placeholder="输入书名、作者或关键词">
            <button type="submit">搜索</button>
        </form>
    </div>
    <div class="nav-menu">
        <ul>
            <li><a href="index.php">首页</a></li>
            <li><a href="categories.php">分类浏览</a></li>
            <li><a href="new_books.php">新书上架</a></li>
            <li><a href="bestsellers.php">畅销书籍</a></li>
            <li><a href="login.php">登录/注册</a></li>
            <li><a href="cart.php">购物车</a></li>
        </ul>
    </div>
</div>
// ... 现有代码 ...

CodeBuddy不仅提供了代码建议,还自动添加了CSS样式,使页面更加美观:

代码语言:css
复制
/* CodeBuddy自动生成的响应式样式 */
.header-container {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    align-items: center;
    padding: 10px 20px;
}

@media (max-width: 768px) {
    .header-container {
        flex-direction: column;
    }
    
    .search-box {
        width: 100%;
        margin: 10px 0;
    }
    
    .nav-menu ul {
        flex-direction: column;
    }
}

2.1.2 首页下部制作

首页下部通常包含计数器、版权信息和联系地址。CodeBuddy帮助我们实现了一个高效的访问计数器:

代码语言:php
复制
<?php
// CodeBuddy优化:使用文件锁确保并发访问安全
function updateCounter() {
    $counterFile = 'counter.txt';
    
    // 获取文件锁,防止并发问题
    $fp = fopen($counterFile, 'c+');
    if (!$fp) return false;
    
    flock($fp, LOCK_EX); // 排他锁
    
    $count = (int)fread($fp, filesize($counterFile) ?: 1);
    $count++;
    
    ftruncate($fp, 0); // 清空文件
    rewind($fp); // 指针回到开始
    fwrite($fp, $count);
    
    flock($fp, LOCK_UN); // 释放锁
    fclose($fp);
    
    return $count;
}

$visitorCount = updateCounter();
?>

<div class="footer">
    <div class="counter">
        <p>您是第 <?php echo $visitorCount; ?> 位访客</p>
    </div>
    <div class="copyright">
        <p>&copy; <?php echo date('Y'); ?> 网上书店 版权所有</p>
    </div>
    <div class="contact">
        <p>联系电话:123-456-7890 | 邮箱:info@bookstore.com</p>
    </div>
</div>

CodeBuddy的建议使计数器更加安全可靠,避免了并发访问可能导致的计数错误。

2.1.3 首页中部制作

首页中部是网站的精华部分,包含图书分类、新书简介、销售排行等功能。使用CodeBuddy,我们轻松实现了动态内容加载:

代码语言:php
复制
<?php
// CodeBuddy建议:使用函数封装数据获取逻辑,提高代码可维护性
function getNewBooks($limit = 6) {
    global $conn;
    $stmt = $conn->prepare("SELECT * FROM books ORDER BY publish_date DESC LIMIT ?");
    $stmt->bind_param("i", $limit);
    $stmt->execute();
    return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
}

function getBestSellers($limit = 6) {
    global $conn;
    $stmt = $conn->prepare("SELECT b.*, SUM(o.quantity) as sold 
                           FROM books b 
                           JOIN order_items o ON b.id = o.book_id 
                           GROUP BY b.id 
                           ORDER BY sold DESC 
                           LIMIT ?");
    $stmt->bind_param("i", $limit);
    $stmt->execute();
    return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
}

$newBooks = getNewBooks();
$bestSellers = getBestSellers();
?>

<div class="main-content">
    <div class="section new-books">
        <h2>新书上架</h2>
        <div class="book-grid">
            <?php foreach ($newBooks as $book): ?>
                <div class="book-item">
                    <img src="<?php echo htmlspecialchars($book['cover_image']); ?>" alt="<?php echo htmlspecialchars($book['title']); ?>">
                    <h3><?php echo htmlspecialchars($book['title']); ?></h3>
                    <p class="author"><?php echo htmlspecialchars($book['author']); ?></p>
                    <p class="price">¥<?php echo number_format($book['price'], 2); ?></p>
                    <a href="book_details.php?id=<?php echo $book['id']; ?>" class="details-btn">查看详情</a>
                    <a href="add_to_cart.php?id=<?php echo $book['id']; ?>" class="cart-btn">加入购物车</a>
                </div>
            <?php endforeach; ?>
        </div>
    </div>
    
    <!-- 类似结构展示畅销书籍 -->
</div>

CodeBuddy的函数封装建议不仅使代码更加模块化,还提高了代码的可维护性和可读性。

2.2 用户注册与登录

用户系统需要确保安全性和可用性:

用户注册和登录是电子商务网站的基础功能。在这一部分,CodeBuddy帮助我们实现了安全可靠的用户认证系统。

2.2.1 用户注册

用户注册需要包含表单制作、用户ID判断、输入检查和数据库操作等步骤:

代码语言:php
复制
<?php
// CodeBuddy建议:使用会话管理和CSRF保护
session_start();

// 生成CSRF令牌
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// 处理表单提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 验证CSRF令牌
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die('CSRF验证失败');
    }
    
    // 获取表单数据
    $username = trim($_POST['username']);
    $email = trim($_POST['email']);
    $password = $_POST['password'];
    $confirm_password = $_POST['confirm_password'];
    
    // 验证表单数据
    $errors = [];
    
    // 用户名验证
    if (empty($username)) {
        $errors[] = '用户名不能为空';
    } elseif (!preg_match('/^[a-zA-Z0-9_]{3,20}$/', $username)) {
        $errors[] = '用户名只能包含字母、数字和下划线,长度3-20个字符';
    }
    
    // 邮箱验证
    if (empty($email)) {
        $errors[] = '邮箱不能为空';
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[] = '邮箱格式不正确';
    }
    
    // 密码验证
    if (empty($password)) {
        $errors[] = '密码不能为空';
    } elseif (strlen($password) < 6) {
        $errors[] = '密码长度不能少于6个字符';
    } elseif ($password !== $confirm_password) {
        $errors[] = '两次输入的密码不一致';
    }
    
    // 如果没有错误,继续处理
    if (empty($errors)) {
        // 连接数据库
        require_once 'db_connect.php';
        
        // 检查用户名是否已存在
        $stmt = $conn->prepare("SELECT id FROM users WHERE username = ?");
        $stmt->bind_param("s", $username);
        $stmt->execute();
        $result = $stmt->get_result();
        
        if ($result->num_rows > 0) {
            $errors[] = '用户名已被使用,请选择其他用户名';
        } else {
            // 检查邮箱是否已存在
            $stmt = $conn->prepare("SELECT id FROM users WHERE email = ?");
            $stmt->bind_param("s", $email);
            $stmt->execute();
            $result = $stmt->get_result();
            
            if ($result->num_rows > 0) {
                $errors[] = '该邮箱已注册,请使用其他邮箱';
            } else {
                // 密码加密
                $hashed_password = password_hash($password, PASSWORD_DEFAULT);
                
                // 插入用户数据
                $stmt = $conn->prepare("INSERT INTO users (username, email, password, created_at) VALUES (?, ?, ?, NOW())");
                $stmt->bind_param("sss", $username, $email, $hashed_password);
                
                if ($stmt->execute()) {
                    // 注册成功,重定向到登录页面
                    $_SESSION['register_success'] = true;
                    header('Location: login.php');
                    exit;
                } else {
                    $errors[] = '注册失败,请稍后再试';
                }
            }
        }
    }
}
?>
// ... html代码不展示 ...

CodeBuddy的建议使注册系统更加安全和可靠,包括CSRF保护、密码哈希和完善的表单验证。

2.2.2 用户登录

登录功能相对简单,但安全性同样重要:

代码语言:php
复制
<?php
// CodeBuddy建议:添加防暴力破解机制
session_start();

// 检查是否已登录
if (isset($_SESSION['user_id'])) {
    header('Location: index.php');
    exit;
}

// 处理登录成功消息
if (isset($_SESSION['register_success'])) {
    $register_success = true;
    unset($_SESSION['register_success']);
}

// 处理表单提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    require_once 'db_connect.php';
    
    $username = trim($_POST['username']);
    $password = $_POST['password'];
    $errors = [];
    
    // 简单验证
    if (empty($username)) {
        $errors[] = '请输入用户名';
    }
    if (empty($password)) {
        $errors[] = '请输入密码';
    }
    
    // 如果没有错误,继续处理
    if (empty($errors)) {
        // 检查登录尝试次数
        $ip = $_SERVER['REMOTE_ADDR'];
        $timestamp = time();
        $attempt_window = 3600; // 1小时内
        $max_attempts = 5; // 最大尝试次数
        
        // 清理过期的登录尝试记录
        $stmt = $conn->prepare("DELETE FROM login_attempts WHERE timestamp < ?");
        $expire_time = $timestamp - $attempt_window;
        $stmt->bind_param("i", $expire_time);
        $stmt->execute();
        
        // 检查当前IP的尝试次数
        $stmt = $conn->prepare("SELECT COUNT(*) as attempts FROM login_attempts WHERE ip = ? AND timestamp > ?");
        $stmt->bind_param("si", $ip, $expire_time);
        $stmt->execute();
        $result = $stmt->get_result();
        $row = $result->fetch_assoc();
        
        if ($row['attempts'] >= $max_attempts) {
            $errors[] = '登录尝试次数过多,请稍后再试';
        } else {
            // 查询用户
            $stmt = $conn->prepare("SELECT id, username, password FROM users WHERE username = ?");
            $stmt->bind_param("s", $username);
            $stmt->execute();
            $result = $stmt->get_result();
            
            if ($result->num_rows === 1) {
                $user = $result->fetch_assoc();
                
                // 验证密码
                if (password_verify($password, $user['password'])) {
                    // 登录成功
                    $_SESSION['user_id'] = $user['id'];
                    $_SESSION['username'] = $user['username'];
                    
                    // 如果设置了"记住我"
                    if (isset($_POST['remember_me'])) {
                        $token = bin2hex(random_bytes(32));
                        $expires = time() + 86400 * 30; // 30天
                        
                        // 存储令牌到数据库
                        $stmt = $conn->prepare("INSERT INTO remember_tokens (user_id, token, expires) VALUES (?, ?, ?)");
                        $stmt->bind_param("isi", $user['id'], $token, $expires);
                        $stmt->execute();
                        
                        // 设置cookie
                        setcookie('remember_token', $token, $expires, '/', '', true, true);
                    }
                    
                    header('Location: index.php');
                    exit;
                } else {
                    // 记录失败的登录尝试
                    $stmt = $conn->prepare("INSERT INTO login_attempts (ip, timestamp) VALUES (?, ?)");
                    $stmt->bind_param("si", $ip, $timestamp);
                    $stmt->execute();
                    
                    $errors[] = '用户名或密码不正确';
                }
            } else {
                // 记录失败的登录尝试
                $stmt = $conn->prepare("INSERT INTO login_attempts (ip, timestamp) VALUES (?, ?)");
                $stmt->bind_param("si", $ip, $timestamp);
                $stmt->execute();
                
                $errors[] = '用户名或密码不正确';
            }
        }
    }
}
?>
// ... html代码不展示 ...

CodeBuddy的建议添加了防暴力破解机制,大大提高了登录系统的安全性。

2.3 图书查询系统

图书查询是网上书店的核心功能,可以分为关键字查询和分类查询两种方式:

代码语言:php
复制
<?php
// CodeBuddy建议:添加分页功能和高级搜索选项
session_start();
require_once 'db_connect.php';

// 获取搜索参数
$keyword = isset($_GET['keyword']) ? trim($_GET['keyword']) : '';
$category = isset($_GET['category']) ? (int)$_GET['category'] : 0;
$author = isset($_GET['author']) ? trim($_GET['author']) : '';
$publisher = isset($_GET['publisher']) ? trim($_GET['publisher']) : '';
$min_price = isset($_GET['min_price']) ? (float)$_GET['min_price'] : 0;
$max_price = isset($_GET['max_price']) ? (float)$_GET['max_price'] : 1000000;
$sort = isset($_GET['sort']) ? $_GET['sort'] : 'title_asc';

// 分页参数
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$per_page = 12;
$offset = ($page - 1) * $per_page;

// 构建查询
$where_clauses = [];
$params = [];
$types = '';

if (!empty($keyword)) {
    $where_clauses[] = "(title LIKE ? OR description LIKE ? OR isbn LIKE ?)";
    $keyword_param = "%$keyword%";
    $params[] = $keyword_param;
    $params[] = $keyword_param;
    $params[] = $keyword_param;
    $types .= 'sss';
}

if ($category > 0) {
    $where_clauses[] = "category_id = ?";
    $params[] = $category;
    $types .= 'i';
}

if (!empty($author)) {
    $where_clauses[] = "author LIKE ?";
    $params[] = "%$author%";
    $types .= 's';
}

if (!empty($publisher)) {
    $where_clauses[] = "publisher LIKE ?";
    $params[] = "%$publisher%";
    $types .= 's';
}

$where_clauses[] = "price BETWEEN ? AND ?";
$params[] = $min_price;
$params[] = $max_price;
$types .= 'dd';

$where_sql = !empty($where_clauses) ? 'WHERE ' . implode(' AND ', $where_clauses) : '';

// 排序
$order_sql = '';
switch ($sort) {
    case 'price_asc':
        $order_sql = 'ORDER BY price ASC';
        break;
    case 'price_desc':
        $order_sql = 'ORDER BY price DESC';
        break;
    case 'title_asc':
        $order_sql = 'ORDER BY title ASC';
        break;
    case 'title_desc':
        $order_sql = 'ORDER BY title DESC';
        break;
    case 'date_desc':
        $order_sql = 'ORDER BY publish_date DESC';
        break;
    default:
        $order_sql = 'ORDER BY title ASC';
}

// 计算总记录数
$count_sql = "SELECT COUNT(*) as total FROM books $where_sql";
$stmt = $conn->prepare($count_sql);
if (!empty($params)) {
    $stmt->bind_param($types, ...$params);
}
$stmt->execute();
$total_result = $stmt->get_result();
$total_row = $total_result->fetch_assoc();
$total_books = $total_row['total'];

// 计算总页数
$total_pages = ceil($total_books / $per_page);

// 获取图书数据
$sql = "SELECT * FROM books $where_sql $order_sql LIMIT ? OFFSET ?";
$stmt = $conn->prepare($sql);

// 添加分页参数
$params[] = $per_page;
$params[] = $offset;
$types .= 'ii';

$stmt->bind_param($types, ...$params);
$stmt->execute();
$result = $stmt->get_result();
$books = $result->fetch_all(MYSQLI_ASSOC);

// 获取所有分类,用于过滤
$categories_sql = "SELECT * FROM categories ORDER BY name ASC";
$categories_result = $conn->query($categories_sql);
$categories = $categories_result->fetch_all(MYSQLI_ASSOC);
?>

// ... html代码不展示 ...

2.4 购物车系统

购物系统是电子商务网站的核心功能,包括购物车管理、订单处理和支付系统。CodeBuddy在这部分提供了全面的安全建议和性能优化:

代码语言:php
复制
<?php
// CodeBuddy建议:使用会话管理购物车,提高安全性
session_start();
require_once 'db_connect.php';

// 初始化购物车
if (!isset($_SESSION['cart'])) {
    $_SESSION['cart'] = [];
}

// 处理添加到购物车的请求
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'add') {
    $book_id = isset($_POST['book_id']) ? (int)$_POST['book_id'] : 0;
    $quantity = isset($_POST['quantity']) ? (int)$_POST['quantity'] : 1;
    
    // 验证数量
    if ($quantity < 1) {
        $quantity = 1;
    }
    
    // 验证图书是否存在
    $stmt = $conn->prepare("SELECT id, title, price, stock FROM books WHERE id = ?");
    $stmt->bind_param("i", $book_id);
    $stmt->execute();
    $result = $stmt->get_result();
    
    if ($result->num_rows === 1) {
        $book = $result->fetch_assoc();
        
        // 检查库存
        if ($book['stock'] < $quantity) {
            $error = '库存不足,当前库存: ' . $book['stock'];
        } else {
            // 添加到购物车或更新数量
            if (isset($_SESSION['cart'][$book_id])) {
                $_SESSION['cart'][$book_id]['quantity'] += $quantity;
            } else {
                $_SESSION['cart'][$book_id] = [
                    'id' => $book['id'],
                    'title' => $book['title'],
                    'price' => $book['price'],
                    'quantity' => $quantity
                ];
            }
            
            // 检查购物车中的数量是否超过库存
            if ($_SESSION['cart'][$book_id]['quantity'] > $book['stock']) {
                $_SESSION['cart'][$book_id]['quantity'] = $book['stock'];
                $warning = '已调整数量至最大库存: ' . $book['stock'];
            } else {
                $success = '已成功添加到购物车';
            }
        }
    } else {
        $error = '图书不存在';
    }
}

// 处理更新购物车的请求
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'update') {
    $book_id = isset($_POST['book_id']) ? (int)$_POST['book_id'] : 0;
    $quantity = isset($_POST['quantity']) ? (int)$_POST['quantity'] : 0;
    
    if ($quantity > 0) {
        // 验证图书是否存在并检查库存
        $stmt = $conn->prepare("SELECT stock FROM books WHERE id = ?");
        $stmt->bind_param("i", $book_id);
        $stmt->execute();
        $result = $stmt->get_result();
        
        if ($result->num_rows === 1) {
            $book = $result->fetch_assoc();
            
            // 检查库存
            if ($book['stock'] < $quantity) {
                $quantity = $book['stock'];
                $warning = '已调整数量至最大库存: ' . $book['stock'];
            }
            
            // 更新购物车
            $_SESSION['cart'][$book_id]['quantity'] = $quantity;
            $success = '购物车已更新';
        }
    } else {
        // 从购物车中移除
        unset($_SESSION['cart'][$book_id]);
        $success = '商品已从购物车中移除';
    }
}

// 处理清空购物车的请求
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'clear') {
    $_SESSION['cart'] = [];
    $success = '购物车已清空';
}

// 计算购物车总金额
$total_items = 0;
$total_price = 0;

foreach ($_SESSION['cart'] as $item) {
    $total_items += $item['quantity'];
    $total_price += $item['price'] * $item['quantity'];
}
?>

// ... html代码不展示 ...

结算页面实现:

代码语言:php
复制
<?php
// CodeBuddy建议:添加订单处理和支付集成
session_start();
require_once 'db_connect.php';

// 检查用户是否登录
if (!isset($_SESSION['user_id'])) {
    $_SESSION['redirect_after_login'] = 'checkout.php';
    header('Location: login.php');
    exit;
}

// 检查购物车是否为空
if (empty($_SESSION['cart'])) {
    header('Location: cart.php');
    exit;
}

// 获取用户信息
$user_id = $_SESSION['user_id'];
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id);
$stmt->execute();
$user = $stmt->get_result()->fetch_assoc();

// 获取用户地址
$stmt = $conn->prepare("SELECT * FROM addresses WHERE user_id = ? ORDER BY is_default DESC");
$stmt->bind_param("i", $user_id);
$stmt->execute();
$addresses = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);

// 处理订单提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 验证表单数据
    $address_id = isset($_POST['address_id']) ? (int)$_POST['address_id'] : 0;
    $payment_method = isset($_POST['payment_method']) ? $_POST['payment_method'] : '';
    $errors = [];
    
    if ($address_id <= 0) {
        $errors[] = '请选择收货地址';
    }
    
    if (empty($payment_method)) {
        $errors[] = '请选择支付方式';
    }
    
    // 验证库存
    foreach ($_SESSION['cart'] as $book_id => $item) {
        $stmt = $conn->prepare("SELECT stock FROM books WHERE id = ?");
        $stmt->bind_param("i", $book_id);
        $stmt->execute();
        $book = $stmt->get_result()->fetch_assoc();
        
        if ($book['stock'] < $item['quantity']) {
            $errors[] = '《' . htmlspecialchars($item['title']) . '》库存不足,当前库存: ' . $book['stock'];
        }
    }
    
    // 如果没有错误,创建订单
    if (empty($errors)) {
        try {
            // 开始事务
            $conn->begin_transaction();
            
            // 创建订单
            $stmt = $conn->prepare("INSERT INTO orders (user_id, address_id, total_amount, payment_method, status, created_at) VALUES (?, ?, ?, ?, 'pending', NOW())");
            $total_amount = array_reduce($_SESSION['cart'], function($sum, $item) {
                return $sum + ($item['price'] * $item['quantity']);
            }, 0);
            $stmt->bind_param("iidd", $user_id, $address_id, $total_amount, $payment_method);
            $stmt->execute();
            $order_id = $conn->insert_id;
            
            // 添加订单项
            $stmt = $conn->prepare("INSERT INTO order_items (order_id, book_id, quantity, price) VALUES (?, ?, ?, ?)");
            foreach ($_SESSION['cart'] as $book_id => $item) {
                $stmt->bind_param("iiid", $order_id, $book_id, $item['quantity'], $item['price']);
                $stmt->execute();
                
                // 更新库存
                $update_stmt = $conn->prepare("UPDATE books SET stock = stock - ? WHERE id = ?");
                $update_stmt->bind_param("ii", $item['quantity'], $book_id);
                $update_stmt->execute();
            }
            
            // 提交事务
            $conn->commit();
            
            // 清空购物车
            $_SESSION['cart'] = [];
            
            // 重定向到订单确认页面
            header("Location: order_confirmation.php?id=$order_id");
            exit;
        } catch (Exception $e) {
            // 回滚事务
            $conn->rollback();
            $errors[] = '订单处理失败,请稍后再试';
        }
    }
}

// 计算购物车总金额
$total_items = 0;
$total_price = 0;

foreach ($_SESSION['cart'] as $item) {
    $total_items += $item['quantity'];
    $total_price += $item['price'] * $item['quantity'];
}
?>

// ... html代码不展示 ...

2.5 订单处理系统

订单处理需要确保数据一致性和事务安全:

代码语言:php
复制
// 创建订单
function createOrder($user_id, $shipping_address, $payment_method) {
    global $conn;
    
    try {
        // 开始事务
        $conn->begin_transaction();
        
        // 创建订单记录
        $stmt = $conn->prepare("INSERT INTO orders (user_id, order_date, status, 
                               shipping_address, payment_method, total_amount) 
                               VALUES (?, NOW(), 'pending', ?, ?, 0)");
        $stmt->bind_param("iss", $user_id, $shipping_address, $payment_method);
        $stmt->execute();
        $order_id = $conn->insert_id;
        
        // 获取购物车项目
        $stmt = $conn->prepare("SELECT c.book_id, c.quantity, b.price 
                               FROM cart_items c 
                               JOIN books b ON c.book_id = b.id 
                               WHERE c.user_id = ?");
        $stmt->bind_param("i", $user_id);
        $stmt->execute();
        $cart_items = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
        
        // 计算总金额并添加订单项
        $total_amount = 0;
        foreach ($cart_items as $item) {
            $book_id = $item['book_id'];
            $quantity = $item['quantity'];
            $price = $item['price'];
            $item_total = $price * $quantity;
            $total_amount += $item_total;
            
            // 添加订单项
            $stmt = $conn->prepare("INSERT INTO order_items (order_id, book_id, quantity, price) 
                                   VALUES (?, ?, ?, ?)");
            $stmt->bind_param("iiid", $order_id, $book_id, $quantity, $price);
            $stmt->execute();
            
            // 更新库存
            $stmt = $conn->prepare("UPDATE books SET stock = stock - ? WHERE id = ?");
            $stmt->bind_param("ii", $quantity, $book_id);
            $stmt->execute();
        }
        
        // 更新订单总金额
        $stmt = $conn->prepare("UPDATE orders SET total_amount = ? WHERE id = ?");
        $stmt->bind_param("di", $total_amount, $order_id);
        $stmt->execute();
        
        // 清空购物车
        $stmt = $conn->prepare("DELETE FROM cart_items WHERE user_id = ?");
        $stmt->bind_param("i", $user_id);
        $stmt->execute();
        
        // 提交事务
        $conn->commit();
        return $order_id;
        
    } catch (Exception $e) {
        // 回滚事务
        $conn->rollback();
        return false;
    }
}

3. 系统安全性设计

CodeBuddy在安全方面提供了多项建议:

3.1 SQL注入防护

代码语言:php
复制
// 不安全的方式
$query = "SELECT * FROM books WHERE title LIKE '%$keyword%'";

// CodeBuddy建议的安全方式
$stmt = $conn->prepare("SELECT * FROM books WHERE title LIKE ?");
$param = "%$keyword%";
$stmt->bind_param("s", $param);

3.2 XSS攻击防护

代码语言:php
复制
// 输出用户数据时始终使用htmlspecialchars
echo htmlspecialchars($book['title'], ENT_QUOTES, 'UTF-8');

3.3 CSRF防护

代码语言:php
复制
// 生成CSRF令牌
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));

// 在表单中包含令牌
echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';

// 验证令牌
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    die('CSRF验证失败');
}

4. 数据库设计

网上书店系统的核心数据表包括:

  1. users - 存储用户信息
  2. books - 存储图书信息
  3. categories - 图书分类
  4. cart_items - 购物车项目
  5. orders - 订单信息
  6. order_items - 订单项目详情
代码语言:sql
复制
-- 用户表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created_at DATETIME NOT NULL,
    last_login DATETIME
);

-- 图书表
CREATE TABLE books (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    author VARCHAR(100) NOT NULL,
    publisher VARCHAR(100),
    isbn VARCHAR(20) UNIQUE,
    category_id INT,
    price DECIMAL(10,2) NOT NULL,
    stock INT NOT NULL DEFAULT 0,
    cover_image VARCHAR(255),
    description TEXT,
    publish_date DATE,
    FOREIGN KEY (category_id) REFERENCES categories(id)
);

CodeBuddy智能辅助功能

CodeBuddy在开发过程中提供了多项智能辅助:

  1. 代码优化建议 - 提供更高效、更安全的代码实现
  2. 安全漏洞检测 - 自动识别SQL注入、XSS等安全问题
  3. 代码重构建议 - 提高代码可维护性和可读性
  4. 响应式设计辅助 - 确保网站在各种设备上表现良好
  5. 最佳实践提示 - 符合行业标准的开发规范

结论

基于PHP和MySQL的网上书店系统,结合CodeBuddy智能开发平台,可以高效地构建功能完善、安全可靠的电子商务网站。CodeBuddy不仅加速了开发过程,还提高了代码质量和安全性,为网上书店的建设提供了强有力的技术支持。

随着电子商务的不断发展,网上书店系统也将持续演进,加入更多智能推荐、社交分享等功能,为用户提供更加便捷、个性化的购书体验。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 摘要
  • 1. 电子商务的发展与现状分析
    • 1.1 传统商务模式的局限
    • 1.2 电子商务的优势
    • 1.3 电子商务的现状及面临的问题
    • 1.4 电子商务的发展趋势
  • 2. 网上书店的实现
    • 2.1 首页的制作
      • 2.1.1 首页上部制作
      • 2.1.2 首页下部制作
      • 2.1.3 首页中部制作
    • 2.2 用户注册与登录
      • 2.2.1 用户注册
      • 2.2.2 用户登录
    • 2.3 图书查询系统
    • 2.4 购物车系统
    • 2.5 订单处理系统
  • 3. 系统安全性设计
    • 3.1 SQL注入防护
    • 3.2 XSS攻击防护
    • 3.3 CSRF防护
  • 4. 数据库设计
  • CodeBuddy智能辅助功能
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档