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

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

摘要

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

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

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

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

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

地理位置限制,消费者需要亲自前往实体店
库存有限,难以满足多样化需求
营业时间受限,不能提供24小时服务
信息更新缓慢,难以及时了解新书信息
1.2 电子商务的优势
随着网络购物的普及,电子商务系统的优势日益明显:

打破时空限制:网站提供了一个跨地域、跨时间的服务平台,消费者无需往返于各个商场,足不出户即可体验购物乐趣。
信息全面系统:电子商务系统为消费者提供更为全面、系统的信息和服务,用户可以轻松比较不同商品,省去不必要的麻烦。
消费决策辅助:通过其他消费者的反馈和点评,用户可以第一时间了解商品的优劣程度和受欢迎程度,避免盲目消费。
在开发过程中,CodeBuddy智能助手帮助我们充分发挥这些优势。例如,在设计用户评论系统时,CodeBuddy提供了以下智能建议:

// 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 电子商务的现状及面临的问题
尽管电子商务发展迅速,但仍面临诸多挑战:

网络安全问题:消费者担忧个人信息泄露和支付安全。
软件技术问题:支付系统不完善,存在技术漏洞。
交易配送问题:物流系统不健全,影响用户体验。
个人诚信问题:网络交易信誉度低,信息不对称。
针对这些问题,CodeBuddy提供了全面的解决方案。以安全问题为例,在开发支付系统时,CodeBuddy自动检测到潜在的安全隐患并提供了修复建议:

// 原始代码 - 存在安全风险
$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 电子商务的发展趋势
电子商务标准的发展呈现以下趋势:

标准面向市场化:从技术驱动向市场驱动发展
标准制定集中化:相关机构由分散走向合作
标准内容广泛化:涵盖多领域、跨学科的综合标准
标准合作国际化:依靠国际合作制定全球性标准
标准适用灵活化:适应电子商务快速发展的特点
CodeBuddy作为现代开发工具,紧跟这些趋势,不断更新其知识库和功能,确保开发者能够按照最新的标准和最佳实践进行开发。

2. 网上书店的实现

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

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

// ... 现有代码 ...
<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样式,使页面更加美观:

/* 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
// 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>
CodeBuddy的建议使计数器更加安全可靠,避免了并发访问可能导致的计数错误。

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

<?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>

<!-- 类似结构展示畅销书籍 -->
CodeBuddy的函数封装建议不仅使代码更加模块化,还提高了代码的可维护性和可读性。

2.2 用户注册与登录
用户系统需要确保安全性和可用性:

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

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

<?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
// 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
// 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
// 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
// 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 订单处理系统
订单处理需要确保数据一致性和事务安全:

// 创建订单
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注入防护

// 不安全的方式
$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攻击防护

// 输出用户数据时始终使用htmlspecialchars
echo htmlspecialchars($book['title'], ENT_QUOTES, 'UTF-8');

3.3 CSRF防护

// 生成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. 数据库设计

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

users - 存储用户信息
books - 存储图书信息
categories - 图书分类
cart_items - 购物车项目
orders - 订单信息
order_items - 订单项目详情

-- 用户表
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在开发过程中提供了多项智能辅助:

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

结论

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

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

posted @ 2025-05-19 17:20  Lethehong  阅读(14)  评论(0)    收藏  举报