一、项目规划与需求分析
在开始编码前,明确商城需要具备的核心功能至关重要。一个完整的电商系统通常包含以下模块:
- 用户模块:注册、登录、个人信息管理、密码找回
- 商品模块:分类展示、搜索、详情页、库存管理
- 购物车模块:添加商品、修改数量、删除商品
- 订单模块:下单、支付、订单状态跟踪
- 后台管理模块:商品、订单、用户的管理
技术选型:
- 后端: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 安全防护措施
- SQL注入防护:使用预处理语句
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $hashed_password);
- XSS攻击防护:对输出进行转义
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
- 密码加密存储
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
- Session安全设置
ini_set('session.cookie_httponly', 1);
ini_set('session.use_only_cookies', 1);
5.2 性能优化建议
- 数据库优化:为常用查询字段添加索引
- 缓存机制:使用Redis或Memcached缓存热点数据
- 图片优化:压缩图片并使用CDN加速
- 前端优化:合并CSS/JS文件,使用浏览器缓存
六、测试与部署
6.1 功能测试
- 用户注册登录流程测试
- 购物车添加、删除、更新测试
- 订单创建和支付流程测试
- 后台管理功能测试
6.2 部署上线
- 选择稳定的Web服务器(如Apache或Nginx)
- 配置PHP和MySQL环境
- 上传代码并配置数据库连接
- 设置文件权限(uploads目录需可写)
- 配置HTTPS证书确保数据传输安全
七、项目总结与扩展方向
通过以上步骤,我们完成了一个功能完整的PHP零食购物商城。这个系统具备了电商平台的核心功能,包括用户管理、商品展示、购物车、订单处理等。
未来扩展方向:
- 移动端适配:开发响应式设计或独立的移动应用
- 第三方登录:集成微信、QQ等社交账号登录
- 推荐系统:基于用户行为实现个性化推荐
- 多商户支持:允许多个商家入驻平台
- 营销工具:优惠券、秒杀、拼团等促销功能
这个项目不仅提供了完整的电商功能实现,还考虑了安全性和性能优化,为后续的功能扩展奠定了良好基础。开发过程中要注意代码的可维护性和安全性,确保系统的稳定运行。
若内容若侵犯到您的权益,请发送邮件至:platform_service@jienda.com我们将第一时间处理!
所有资源仅限于参考和学习,版权归JienDa作者所有,更多请访问JienDa首页。





