PHP+MYSQL+HTML实现在线购物商城,基于php的电商系统,电子商务网站,零食购物商城

一、项目规划与需求分析

在开始编码前,明确商城需要具备的核心功能至关重要。一个完整的电商系统通常包含以下模块:

  • 用户模块:注册、登录、个人信息管理、密码找回
  • 商品模块:分类展示、搜索、详情页、库存管理
  • 购物车模块:添加商品、修改数量、删除商品
  • 订单模块:下单、支付、订单状态跟踪
  • 后台管理模块:商品、订单、用户的管理

技术选型

  • 后端:PHP(建议使用7.4以上版本)
  • 数据库:MySQL 5.7或以上
  • 前端:HTML5, CSS3, JavaScript(可搭配Bootstrap等框架)
  • 服务器:Apache或Nginx
  • 开发工具:可选择PHPStorm等集成开发环境

二、开发环境搭建与数据库设计

2.1 环境搭建

推荐使用XAMPP或WAMP等集成环境,它们内置了PHP、MySQL和Apache,能快速创建本地开发环境。安装后启动Apache和MySQL服务。

2.2 数据库设计

创建名为shop的数据库,并设计核心数据表:

用户表(users)

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL UNIQUE,
  password VARCHAR(255) NOT NULL,
  email VARCHAR(100) NOT NULL UNIQUE,
  address TEXT,
  tel VARCHAR(20),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

商品表(goods)

CREATE TABLE goods (
  id INT AUTO_INCREMENT PRIMARY KEY,
  categoryid INT NOT NULL DEFAULT 0,
  title VARCHAR(100) NOT NULL,
  amount INT DEFAULT 0,
  mprice DECIMAL(10,2),
  sprice DECIMAL(10,2),
  content TEXT,
  img VARCHAR(255),
  addtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

订单表(orders)

CREATE TABLE orders (
  id INT AUTO_INCREMENT PRIMARY KEY,
  onumber VARCHAR(50) UNIQUE,
  userid INT NOT NULL,
  total DECIMAL(10,2) NOT NULL,
  address VARCHAR(255),
  tel VARCHAR(20),
  zffs VARCHAR(20),
  zt VARCHAR(20) DEFAULT '待付款',
  addtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (userid) REFERENCES users(id)
);

完整的数据库设计还应包括购物车表、收藏表、订单详情表等。

三、核心功能实现

3.1 数据库连接(db_connect.php)

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "shop";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}
?>

3.2 用户注册功能

<?php
include_once 'db_connect.php';
session_start();

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = trim($_POST['username']);
    $password = password_hash($_POST['password'], PASSWORD_DEFAULT);
    $email = trim($_POST['email']);
    $tel = trim($_POST['tel']);
    $address = trim($_POST['address']);

    // 检查用户名是否已存在
    $check_sql = "SELECT id FROM users WHERE username = ?";
    $stmt = $conn->prepare($check_sql);
    $stmt->bind_param("s", $username);
    $stmt->execute();
    $result = $stmt->get_result();
    
    if ($result->num_rows > 0) {
        $error = "用户名已存在";
    } else {
        // 插入新用户
        $insert_sql = "INSERT INTO users (username, password, email, tel, address) VALUES (?, ?, ?, ?, ?)";
        $stmt = $conn->prepare($insert_sql);
        $stmt->bind_param("sssss", $username, $password, $email, $tel, $address);
        
        if ($stmt->execute()) {
            $_SESSION['user_id'] = $conn->insert_id;
            $_SESSION['username'] = $username;
            header("Location: index.php");
            exit();
        } else {
            $error = "注册失败,请重试";
        }
    }
}
?>

3.3 商品展示页面(index.php)

<?php
include_once 'db_connect.php';
session_start();

// 查询商品数据
$sql = "SELECT id, title, sprice, content, img FROM goods WHERE amount > 0 ORDER BY addtime DESC LIMIT 12";
$result = $conn->query($sql);
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>零食商城</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="css/style.css">
</head>
<body>
    <!-- 导航栏 -->
    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
        <div class="container">
            <a class="navbar-brand" href="index.php">零食商城</a>
            <div class="navbar-nav ms-auto">
                <?php if(isset($_SESSION['username'])): ?>
                    <a class="nav-link" href="cart.php">购物车</a>
                    <a class="nav-link" href="logout.php">退出</a>
                <?php else: ?>
                    <a class="nav-link" href="login.php">登录</a>
                    <a class="nav-link" href="register.php">注册</a>
                <?php endif; ?>
            </div>
        </div>
    </nav>

    <!-- 商品列表 -->
    <div class="container mt-4">
        <div class="row">
            <?php while($row = $result->fetch_assoc()): ?>
            <div class="col-md-3 mb-4">
                <div class="card h-100">
                    <img src="<?php echo $row['img']; ?>" class="card-img-top" alt="<?php echo $row['title']; ?>">
                    <div class="card-body">
                        <h5 class="card-title"><?php echo $row['title']; ?></h5>
                        <p class="card-text"><?php echo mb_substr($row['content'], 0, 30); ?>...</p>
                        <p class="text-danger">¥<?php echo $row['sprice']; ?></p>
                        <a href="detail.php?id=<?php echo $row['id']; ?>" class="btn btn-primary">查看详情</a>
                        <a href="cart_action.php?action=add&id=<?php echo $row['id']; ?>" class="btn btn-success">加入购物车</a>
                    </div>
                </div>
            </div>
            <?php endwhile; ?>
        </div>
    </div>
</body>
</html>

3.4 购物车功能实现

购物车页面(cart.php)

<?php
session_start();
if (!isset($_SESSION['user_id'])) {
    header("Location: login.php");
    exit();
}

// 获取购物车数据
$cart = isset($_SESSION['cart']) ? $_SESSION['cart'] : array();
?>
<!-- 购物车HTML界面 -->
<table class="table">
    <thead>
        <tr>
            <th>商品</th>
            <th>单价</th>
            <th>数量</th>
            <th>小计</th>
            <th>操作</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach($cart as $id => $item): ?>
        <tr>
            <td><?php echo $item['title']; ?></td>
            <td>¥<?php echo $item['price']; ?></td>
            <td>
                <input type="number" value="<?php echo $item['quantity']; ?>" 
                       onchange="updateQuantity(<?php echo $id; ?>, this.value)">
            </td>
            <td>¥<?php echo $item['price'] * $item['quantity']; ?></td>
            <td><button onclick="removeItem(<?php echo $id; ?>)" class="btn btn-danger">删除</button></td>
        </tr>
        <?php endforeach; ?>
    </tbody>
</table>

购物车操作(cart_action.php)

<?php
session_start();
include_once 'db_connect.php';

$action = $_GET['action'] ?? '';
$product_id = $_GET['id'] ?? 0;

switch($action) {
    case 'add':
        // 查询商品信息
        $sql = "SELECT * FROM goods WHERE id = ?";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("i", $product_id);
        $stmt->execute();
        $product = $stmt->get_result()->fetch_assoc();
        
        // 添加到购物车
        if (!isset($_SESSION['cart'])) {
            $_SESSION['cart'] = array();
        }
        
        if (isset($_SESSION['cart'][$product_id])) {
            $_SESSION['cart'][$product_id]['quantity']++;
        } else {
            $_SESSION['cart'][$product_id] = array(
                'title' => $product['title'],
                'price' => $product['sprice'],
                'quantity' => 1
            );
        }
        break;
        
    case 'update':
        $quantity = $_POST['quantity'] ?? 0;
        if ($quantity > 0) {
            $_SESSION['cart'][$product_id]['quantity'] = $quantity;
        }
        break;
        
    case 'remove':
        unset($_SESSION['cart'][$product_id]);
        break;
}

header("Location: cart.php");
exit();
?>

四、后台管理系统实现

4.1 商品管理(admin/goods_manage.php)

<?php
// 权限验证
session_start();
if (!isset($_SESSION['admin'])) {
    header("Location: login.php");
    exit();
}

include_once '../db_connect.php';

// 商品添加和编辑处理
if ($_POST) {
    $data = array();
    $data["title"] = "'".$_POST["title"]."'";
    $data["categoryid"] = "'".$_POST["categoryid"]."'";
    $data["amount"] = "'".$_POST["amount"]."'";
    $data["sprice"] = "'".$_POST["sprice"]."'";
    $data["content"] = "'".$_POST["content"]."'";
    
    // 处理图片上传
    if(!empty($_FILES['img']['name'])){
        $file = $_FILES['img'];
        $fileName = time() . '.' . pathinfo($file['name'], PATHINFO_EXTENSION);
        move_uploaded_file($file['tmp_name'], '../uploads/' . $fileName);
        $data["img"] = "'".$fileName."'";
    }
    
    if ($_REQUEST["id"]) {
        // 更新商品
        db_mdf("goods", $data, $_REQUEST["id"]);
    } else {
        // 添加新商品
        db_add("goods", $data);
    }
    
    header("Location: goods_manage.php");
    exit();
}

// 获取商品列表
$goods_list = db_get_list("SELECT * FROM goods ORDER BY addtime DESC");
?>

五、安全性与性能优化

5.1 安全防护措施

  1. SQL注入防护:使用预处理语句
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $hashed_password);
  1. XSS攻击防护:对输出进行转义
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
  1. 密码加密存储
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
  1. Session安全设置
ini_set('session.cookie_httponly', 1);
ini_set('session.use_only_cookies', 1);

5.2 性能优化建议

  1. 数据库优化:为常用查询字段添加索引
  2. 缓存机制:使用Redis或Memcached缓存热点数据
  3. 图片优化:压缩图片并使用CDN加速
  4. 前端优化:合并CSS/JS文件,使用浏览器缓存

六、测试与部署

6.1 功能测试

  • 用户注册登录流程测试
  • 购物车添加、删除、更新测试
  • 订单创建和支付流程测试
  • 后台管理功能测试

6.2 部署上线

  1. 选择稳定的Web服务器(如Apache或Nginx)
  2. 配置PHP和MySQL环境
  3. 上传代码并配置数据库连接
  4. 设置文件权限(uploads目录需可写)
  5. 配置HTTPS证书确保数据传输安全

七、项目总结与扩展方向

通过以上步骤,我们完成了一个功能完整的PHP零食购物商城。这个系统具备了电商平台的核心功能,包括用户管理、商品展示、购物车、订单处理等。

未来扩展方向

  1. 移动端适配:开发响应式设计或独立的移动应用
  2. 第三方登录:集成微信、QQ等社交账号登录
  3. 推荐系统:基于用户行为实现个性化推荐
  4. 多商户支持:允许多个商家入驻平台
  5. 营销工具:优惠券、秒杀、拼团等促销功能

这个项目不仅提供了完整的电商功能实现,还考虑了安全性和性能优化,为后续的功能扩展奠定了良好基础。开发过程中要注意代码的可维护性和安全性,确保系统的稳定运行。

版权声明:本文为JienDa博主的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
若内容若侵犯到您的权益,请发送邮件至:platform_service@jienda.com我们将第一时间处理!
所有资源仅限于参考和学习,版权归JienDa作者所有,更多请访问JienDa首页。

给TA赞助
共{{data.count}}人
人已赞助
后端

Spring Web MVC从入门到实战

2025-12-19 21:50:46

后端

从零开始打造高性能数据结构——手把手教你实现环形缓冲

2025-12-19 22:24:12

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索