当前位置:首页>php>PHP+MySQL搭建员工信息管理系统(Centos7版)

PHP+MySQL搭建员工信息管理系统(Centos7版)

  • 2026-10-11 05:51:56
PHP+MySQL搭建员工信息管理系统(Centos7版)

学完 PHP 基础和 MySQL 语法后总觉得知识点很散,想练手又不知道做什么项目?不妨从最经典的「人员信息管理系统」开始 —— 整个项目核心就是数据库的增删查改,逻辑简单不绕弯,但能完整覆盖 Web 开发最基础的流程:前端提交数据、PHP 接收处理、与 MySQL 数据库交互。

这篇文章就带大家用原生 PHP + MySQL 搭一个极简的人员管理系统,没有复杂框架,没有多余封装,每一行代码都对应最基础的语法操作,非常适合用来巩固 MySQL 操作和 PHP 后端开发手感。

如图所示:

现在开始进入环境搭建环节。

文章大纲

一、安装 Apache
二、安装 PHP 7.4(基于 REMI 第三方源)
三、MySQL数据准备
四、PHP代码
五、浏览器访问
六、整体架构分析(扩展)
一、安装 Apache(httpd)
1. 安装 Apache 主程序
yum install -y httpd
命令解释:
通过 yum 包管理器安装 Apache 服务(软件包名为 httpd),-y 参数表示对安装过程中的所有确认提示自动回答 “是”,无需手动交互。
系统变化:
1.自动下载并安装 httpd 主程序及其依赖包;
2.生成 Apache 默认配置文件(路径 /etc/httpd/conf/httpd.conf)、默认站点目录 /var/www/html;
3.注册 systemd 服务单元,后续可通过 systemctl 命令管理服务启停。
2. 启动 Apache 服务
systemctl start httpd.service
systemctl start httpd.service
命令解释:
通过 systemd 启动 httpd 服务,.service 后缀可省略。
系统变化:
1.httpd 进程正式启动,默认监听服务器的 80 端口(HTTP 协议);
2.同局域网内设备可通过 HTTP 协议访问服务器 IP,查看 Apache 默认欢迎页。
3. 防火墙永久开放 80 端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
命令解释:
在 firewalld 防火墙的 public 公共区域中,永久放行 TCP 协议的 80 端口。
--zone=public:指定防火墙规则生效的区域(默认公共区域);
--permanent:规则永久生效,重启防火墙或服务器后不会丢失。
系统变化:
防火墙配置文件中新增 80/tcp 放行规则,但尚未立即生效。
4. 重载防火墙使规则生效
firewall-cmd --reload
命令解释:
热重载 firewalld 防火墙规则,让永久配置的规则立即生效,无需重启防火墙服务。
系统变化:
此前配置的 80 端口放行规则正式生效,外部流量可通过 80 端口访问本机 Apache 服务。
5. 查看当前已放行的端口
firewall-cmd --list-ports
命令解释:
列出当前防火墙已开放的所有端口,用于验证 80 端口是否成功放行。
系统变化:
终端输出当前生效的端口列表,正常执行后会显示 80/tcp。
6. 访问验证地址
http://192.168.1.6:80
显示出Apache主页表示安装成功。
说明与问题提示:
 这是本地服务器的访问地址,但该写法存在协议与端口不匹配问题:
80 端口是 HTTP 协议的默认端口,HTTPS 协议默认对应 443 端口;
使用 https:// 前缀 + 80 端口访问时,会出现文档中 “URL 拼写可能存在错误” 的报错,浏览器无法正常建立连接。

二、安装 PHP 7.4(基于 REMI 第三方源)
1. 安装 EPEL 扩展源(RPM 包方式)
rpm -Uvh https://archives.fedoraproject.org/pub/archive/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm
命令解释:通过 rpm 命令直接安装 EPEL(企业 Linux 扩展软件包)源的发行包。
-U:升级模式,若软件包未安装则执行安装,已安装则升级;
-v:显示详细安装过程日志;
-h:安装过程中显示进度条。
系统变化:
若安装成功,会在 /etc/yum.repos.d/ 目录下生成 EPEL 源的 repo 配置文件,yum 可从此源下载额外的第三方软件包。
⚠️ 潜在报错(对应反爬拦截问题)
 当前该地址启用了 Anubis 人机验证反爬机制,直接通过 rpm/wget 命令下载会被拦截,无法正常获取 rpm 包,最终导致安装失败。需要先通过浏览器完成验证后手动下载,或更换国内的 EPEL 镜像地址。
2. yum 方式安装 EPEL 源
yum install epel-release
命令解释:
通过 yum 包管理器安装 epel-release 包。
说明:这一步与上一条命令功能完全重复 —— 上一条 rpm 命令已经完成了 epel-release 的安装,此命令属于冗余步骤,执行后只会提示 “软件包已安装,无需重复操作”,不会产生额外系统变化。
3. 安装 REMI 源(RPM 包方式)
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
命令解释:
通过 rpm 命令安装 REMI 第三方软件源(该源提供多版本 PHP 安装包),-i 表示纯安装模式(不执行升级逻辑)。
系统变化:
若安装成功,会在 /etc/yum.repos.d/ 目录下生成 REMI 源的 repo 配置文件。
⚠️ 潜在报错(对应文件类型不支持问题)
 当前该地址返回 “不支持该文件类型” 报错,链接可能已失效、重定向或被访问限制,无法直接下载 rpm 包,会导致此命令执行失败。建议更换 REMI 源的国内镜像地址。
4. 安装 PHP 7.4 核心程序
yum --enablerepo=remi install php74-php
命令解释:临时启用 remi 软件源,安装 PHP 7.4 的核心运行包。
--enablerepo=remi:临时启用指定的 yum 源(仅本次命令生效),REMI 源默认处于禁用状态;
php74-php:REMI 源中 PHP 7.4 的主包命名格式。
系统变化:
PHP 7.4 核心程序被安装到 /opt/remi/php74/ 目录下;
生成对应的 php.ini 配置文件、CLI 执行文件等;
此时系统默认 PATH 路径中无法直接调用 php 命令。
5. 安装 PHP 常用扩展
yum --enablerepo=remi install php74-php php74-php-gd php74-php-xml php74-php-sockets php74-php-session php74-php-snmp php74-php-mysql
命令解释:批量安装 PHP 7.4 的常用功能扩展,各扩展核心作用如下:
php74-php-gd:图像处理扩展,用于生成验证码、图片裁剪等;
php74-php-xml:XML 解析与生成扩展;
php74-php-sockets:Socket 网络通信扩展;
php74-php-session:会话状态管理扩展;
php74-php-snmp:SNMP 网络管理协议扩展;
php74-php-mysql:MySQL 数据库连接扩展。
系统变化:对应扩展的 .so 模块文件被安装到 PHP 扩展目录,PHP 运行时可加载对应功能。
6. 创建 PHP 命令全局软链接
ln -s /opt/remi/php74/root/usr/bin/php /usr/bin/php
命令解释:创建软链接(类似 Windows 快捷方式),将 REMI 安装的 PHP 可执行文件链接到系统全局 PATH 路径 /usr/bin/ 下。
系统变化:在终端任意路径下直接输入 php 命令即可调用 PHP 7.4,无需输入完整的绝对路径。
7. 查看 PHP 版本
php -v
命令解释:查看当前 PHP 的版本信息,用于验证安装是否成功、软链接是否生效。
系统变化:终端输出 PHP 版本号(预期为 PHP 7.4.x)、构建信息等内容。
8. 验证数据库相关模块
php -m | grep -E "mysqlnd|pdo"
命令解释:列出所有已加载的 PHP 模块,并通过 grep 筛选出 mysqlnd、PDO 相关的数据库驱动模块。
php -m:列出 PHP CLI 模式下已加载的全部扩展模块;
grep -E "mysqlnd|pdo":使用正则匹配,过滤出包含 mysqlnd 或 pdo 的行。
系统变化:终端输出匹配到的模块名,正常会显示 mysqlnd、pdo_mysql 等,代表数据库驱动已正常加载。

三、MySQL数据准备
MySQL80安装教程参考:CentOS 7安装MySQL 8.0(完整版)
安装之后开始准备数据。

MySQL 8.0 默认的 caching_sha2_password 密码认证插件与 PHP 7.4 不兼容,必须按以下方式创建用户,否则会连接失败。

-- 1. 创建人员管理数据库

CREATE DATABASE person_manage DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 2. 创建专用业务用户(必须指定 mysql_native_password 认证,兼容PHP7.4)

CREATE USER 'pm_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Admin@123456';

-- 3. 授权用户访问该数据库

GRANT ALL PRIVILEGES ON person_manage.* TO 'pm_user'@'localhost';

FLUSH PRIVILEGES;

-- 4. 切换到目标数据库

USE person_manage;

-- 5. 创建人员信息表

CREATE TABLE persons (

   id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',

   name VARCHAR(50) NOT NULL COMMENT '姓名',

   age INT COMMENT '年龄',

   gender VARCHAR(10) COMMENT '性别',

   phone VARCHAR(20) COMMENT '手机号',

   email VARCHAR(100) COMMENT '邮箱',

   create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='人员信息表';

-- 退出

exit;


四、PHP代码
一、整体目录结构与分层说明
目录结构(部署在 Apache 默认站点根目录 /var/www/html/ 下)
/var/www/html/
├── index.php                         # 入口文件:路由分发 + 环境初始化
├── config/
│   └── database.php              # 配置层:数据库参数 + PDO连接实例(全局唯一)
├── model/
│   └── PersonModel.php       # 模型层:封装所有人员表的SQL读写操作
├── controller/
│   └── PersonController.php  # 控制层:接收请求、参数校验、调度业务
└── view/
    ├── layout.php                    # 视图公共部分:页面头部、CSS样式
    └── list.php                         # 视图页面:表单 + 人员列表展示
分层职责与调用关系(核心规范)
入口层 index.php:唯一入口,接收所有请求,根据 action 参数分发到对应控制器方法,不写任何业务逻辑。
配置层 config:集中管理数据库连接信息,全局只初始化一次数据库连接,避免重复创建连接。
模型层 Model:只负责和数据库交互,所有 SQL 语句都写在这里;不处理业务、不输出页面。
控制层 Controller:业务调度中心,接收前端参数、做参数校验、调用模型读写数据、控制页面跳转;不直接写 SQL、不写 HTML。
视图层 View:只负责数据渲染和页面展示,只做变量输出和循环,不写业务逻辑、不操作数据库。
调用链路:浏览器请求 → index.php 入口 → 调用 PersonController 对应方法 → 方法内调用 PersonModel 操作数据库 → 控制器加载视图 → 返回 HTML 给浏览器。
二、拆分后各文件完整代码
1. 配置层:config/database.php
文件路径:/var/www/html/config/database.php
核心职责:统一维护数据库配置,创建全局唯一的 PDO 连接实例,所有模型都复用这个连接。
<?php
/**
 * 数据库配置与连接文件
 * 全局唯一PDO实例,避免重复创建数据库连接
 */
// 数据库连接参数(集中配置,修改一处全局生效)
$db_config = [
    'host'    => 'localhost',
    'dbname'  => 'person_manage',
    'user'    => 'pm_user',
    'pass'    => 'Admin@123456', // 修改为你的数据库密码
    'charset' => 'utf8mb4'
];
// 创建PDO数据库连接实例,全局复用
try {
    $pdo = new PDO(
        "mysql:host={$db_config['host']};dbname={$db_config['dbname']};charset={$db_config['charset']}",
        $db_config['user'],
        $db_config['pass'],
        [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, // 异常模式报错
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,       // 默认关联数组返回
            PDO::ATTR_EMULATE_PREPARES   => false                   // 禁用模拟预处理,强化防注入
        ]
    );
} catch (PDOException $e) {
    die("数据库连接失败:" . $e->getMessage());
}
2. 模型层:model/PersonModel.php
文件路径:/var/www/html/model/PersonModel.php
核心职责:封装 persons 表的所有增删改查 SQL 操作,是数据库和业务层的中间层。控制器只调用方法,不接触 SQL。
<?php
/**
 * 人员数据模型
 * 所有人员表的数据库操作都封装在此,外部仅调用方法即可
 */
class PersonModel
{
    private $pdo;
    // 构造方法:注入数据库连接实例,依赖注入规范
    public function __construct($pdo)
    {
        $this->pdo = $pdo;
    }
    /**
     * 添加人员
     * @param array $data 人员信息数组 [name, age, gender, phone, email]
     * @return bool 执行结果
     */
    public function addPerson($data)
    {
        $sql = "INSERT INTO persons (name, age, gender, phone, email) VALUES (?, ?, ?, ?, ?)";
        $stmt = $this->pdo->prepare($sql);
        return $stmt->execute([
            $data['name'],
            $data['age'],
            $data['gender'],
            $data['phone'],
            $data['email']
        ]);
    }
    /**
     * 根据ID删除人员
     * @param int $id 人员ID
     * @return bool 执行结果
     */
    public function deletePersonById($id)
    {
        $sql = "DELETE FROM persons WHERE id = ?";
        $stmt = $this->pdo->prepare($sql);
        return $stmt->execute([$id]);
    }
    /**
     * 根据ID更新人员信息
     * @param int $id 人员ID
     * @param array $data 更新的人员信息
     * @return bool 执行结果
     */
    public function updatePersonById($id, $data)
    {
        $sql = "UPDATE persons SET name=?, age=?, gender=?, phone=?, email=? WHERE id=?";
        $stmt = $this->pdo->prepare($sql);
        return $stmt->execute([
            $data['name'],
            $data['age'],
            $data['gender'],
            $data['phone'],
            $data['email'],
            $id
        ]);
    }
    /**
     * 根据ID查询单条人员信息
     * @param int $id 人员ID
     * @return array|false 人员信息数组,不存在返回false
     */
    public function getPersonById($id)
    {
        $sql = "SELECT * FROM persons WHERE id = ?";
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute([$id]);
        return $stmt->fetch();
    }
    /**
     * 查询所有人员列表(按ID倒序)
     * @return array 人员列表二维数组
     */
    public function getAllPersons()
    {
        $sql = "SELECT * FROM persons ORDER BY id DESC";
        $stmt = $this->pdo->query($sql);
        return $stmt->fetchAll();
    }
}
3. 控制层:controller/PersonController.php
文件路径:/var/www/html/controller/PersonController.php
核心职责:业务逻辑调度中心,接收前端请求参数、做参数校验、调用模型完成数据操作、控制页面跳转与视图渲染。
<?php
/**
 * 人员控制器
 * 处理所有人员相关的请求:添加、删除、编辑、列表展示
 */
class PersonController
{
    private $personModel;
    // 构造方法:注入人员模型实例
    public function __construct($personModel)
    {
        $this->personModel = $personModel;
    }
    /**
     * 处理添加人员请求
     */
    public function add()
    {
        // 接收并过滤参数
        $data = [
            'name'   => trim($_POST['name']),
            'age'    => intval($_POST['age']),
            'gender' => trim($_POST['gender']),
            'phone'  => trim($_POST['phone']),
            'email'  => trim($_POST['email'])
        ];
        // 参数校验:姓名必填
        if (empty($data['name'])) {
            echo "<script>alert('姓名不能为空');history.back();</script>";
            exit;
        }
        // 调用模型执行添加
        $this->personModel->addPerson($data);
        // 操作完成后跳转回列表页(PRG模式,防止重复提交)
        header("Location: index.php");
        exit;
    }
    /**
     * 处理删除人员请求
     */
    public function delete()
    {
        $id = intval($_GET['id']);
        if ($id <= 0) {
            echo "<script>alert('参数错误');history.back();</script>";
            exit;
        }
        $this->personModel->deletePersonById($id);
        header("Location: index.php");
        exit;
    }
    /**
     * 处理编辑人员提交
     */
    public function edit()
    {
        $id = intval($_POST['id']);
        if ($id <= 0) {
            echo "<script>alert('参数错误');history.back();</script>";
            exit;
        }
        $data = [
            'name'   => trim($_POST['name']),
            'age'    => intval($_POST['age']),
            'gender' => trim($_POST['gender']),
            'phone'  => trim($_POST['phone']),
            'email'  => trim($_POST['email'])
        ];
        if (empty($data['name'])) {
            echo "<script>alert('姓名不能为空');history.back();</script>";
            exit;
        }
        $this->personModel->updatePersonById($id, $data);
        header("Location: index.php");
        exit;
    }
    /**
     * 渲染列表页面(默认首页)
     * 读取人员数据,加载视图
     */
    public function index()
    {
        // 获取待编辑的人员信息(编辑模式下)
        $edit_person = null;
        if ($_GET['action'] === 'edit' && isset($_GET['id'])) {
            $id = intval($_GET['id']);
            $edit_person = $this->personModel->getPersonById($id);
        }
        // 获取全部人员列表
        $person_list = $this->personModel->getAllPersons();
        // 加载视图页面,把数据传递过去
        require_once __DIR__ . '/../view/list.php';
    }
}
4. 视图层
4.1 公共布局:view/layout.php
文件路径:/var/www/html/view/layout.php
核心职责:页面公共头部、CSS 样式统一管理,所有页面复用,避免重复代码。
<?php
/**
 * 页面公共布局:头部 + 样式
 * 所有视图页面引入此文件即可,统一修改样式全局生效
 */
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>人员信息管理系统</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: "Microsoft YaHei", Arial, sans-serif;
        }
        body {
            background-color: #f0f2f5;
            padding: 30px 20px;
        }
        .container {
            max-width: 1100px;
            margin: 0 auto;
            background: #fff;
            border-radius: 8px;
            box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
            padding: 25px 30px;
        }
        h1 {
            text-align: center;
            color: #333;
            margin-bottom: 25px;
            font-size: 24px;
        }
        .form-box {
            background-color: #f8f9fa;
            padding: 20px;
            border-radius: 6px;
            margin-bottom: 25px;
            border: 1px solid #e9ecef;
        }
        .form-box h3 {
            margin-bottom: 15px;
            color: #444;
            font-size: 16px;
        }
        .form-row {
            display: flex;
            gap: 15px;
            flex-wrap: wrap;
            margin-bottom: 15px;
        }
        .form-item {
            flex: 1;
            min-width: 150px;
        }
        .form-item label {
            display: block;
            font-size: 14px;
            color: #555;
            margin-bottom: 6px;
        }
        .form-item input {
            width: 100%;
            padding: 8px 10px;
            border: 1px solid #dcdfe6;
            border-radius: 4px;
            font-size: 14px;
            outline: none;
        }
        .form-item input:focus {
            border-color: #409eff;
        }
        .btn {
            padding: 8px 20px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            font-size: 14px;
            transition: background 0.2s;
        }
        .btn-primary {
            background-color: #409eff;
            color: #fff;
        }
        .btn-primary:hover {
            background-color: #66b1ff;
        }
        .btn-danger {
            background-color: #f56c6c;
            color: #fff;
        }
        .btn-danger:hover {
            background-color: #f78989;
        }
        .btn-warning {
            background-color: #e6a23c;
            color: #fff;
            text-decoration: none;
            display: inline-block;
        }
        .btn-warning:hover {
            background-color: #ebb563;
        }
        .table-box h3 {
            margin-bottom: 12px;
            color: #333;
            font-size: 16px;
        }
        table {
            width: 100%;
            border-collapse: collapse;
        }
        th, td {
            padding: 12px 8px;
            text-align: center;
            border-bottom: 1px solid #ebeef5;
            font-size: 14px;
        }
        th {
            background-color: #f5f7fa;
            color: #333;
            font-weight: 600;
        }
        tr:hover {
            background-color: #fafafa;
        }
        .empty-tip {
            text-align: center;
            color: #909399;
            padding: 40px 0;
        }
        .op-btns a {
            margin: 0 5px;
            padding: 5px 10px;
            border-radius: 3px;
            font-size: 13px;
            text-decoration: none;
        }
    </style>
</head>
<body>
<div class="container">
    <h1>人员信息管理系统</h1>
4.2 列表页面:view/list.php
文件路径:/var/www/html/view/list.php
核心职责:纯展示层,只负责把控制器传过来的数据渲染成 HTML,不包含任何业务逻辑和数据库操作。
<?php
/**
 * 人员列表视图
 * 仅做数据渲染,依赖控制器传入的 $edit_person 和 $person_list 变量
 */
// 引入公共头部布局
require_once __DIR__ . '/layout.php';
?>
    <!-- 添加/编辑表单 -->
    <div class="form-box">
        <h3><?php echo $edit_person ? '编辑人员信息' : '添加新人员'; ?></h3>
        <form method="post" action="index.php">
            <input type="hidden" name="action" value="<?php echo $edit_person ? 'edit' : 'add'; ?>">
            <?php if ($edit_person): ?>
                <input type="hidden" name="id" value="<?php echo $edit_person['id']; ?>">
            <?php endif; ?>
            <div class="form-row">
                <div class="form-item">
                    <label>姓名 <span style="color:red">*</span></label>
                    <input type="text" name="name" required 
                           value="<?php echo htmlspecialchars($edit_person['name'] ?? ''); ?>">
                </div>
                <div class="form-item">
                    <label>年龄</label>
                    <input type="number" name="age" 
                           value="<?php echo $edit_person['age'] ?? ''; ?>">
                </div>
                <div class="form-item">
                    <label>性别</label>
                    <input type="text" name="gender" placeholder="男/女"
                           value="<?php echo htmlspecialchars($edit_person['gender'] ?? ''); ?>">
                </div>
                <div class="form-item">
                    <label>手机号</label>
                    <input type="text" name="phone"
                           value="<?php echo htmlspecialchars($edit_person['phone'] ?? ''); ?>">
                </div>
                <div class="form-item">
                    <label>邮箱</label>
                    <input type="email" name="email"
                           value="<?php echo htmlspecialchars($edit_person['email'] ?? ''); ?>">
                </div>
            </div>
            <button type="submit" class="btn btn-primary">
                <?php echo $edit_person ? '确认修改' : '添加人员'; ?>
            </button>
            <?php if ($edit_person): ?>
                <a href="index.php" class="btn btn-danger" style="text-decoration:none; display:inline-block; margin-left:8px;">取消编辑</a>
            <?php endif; ?>
        </form>
    </div>
    <!-- 人员列表 -->
    <div class="table-box">
        <h3>人员列表(共 <?php echo count($person_list); ?> 条记录)</h3>
        <table>
            <thead>
            <tr>
                <th>ID</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>性别</th>
                <th>手机号</th>
                <th>邮箱</th>
                <th>创建时间</th>
                <th>操作</th>
            </tr>
            </thead>
            <tbody>
            <?php if (empty($person_list)): ?>
                <tr>
                    <td colspan="8" class="empty-tip">暂无人员数据,请在上方表单添加</td>
                </tr>
            <?php else: ?>
                <?php foreach ($person_list as $p): ?>
                <tr>
                    <td><?php echo $p['id']; ?></td>
                    <td><?php echo htmlspecialchars($p['name']); ?></td>
                    <td><?php echo $p['age']; ?></td>
                    <td><?php echo htmlspecialchars($p['gender']); ?></td>
                    <td><?php echo htmlspecialchars($p['phone']); ?></td>
                    <td><?php echo htmlspecialchars($p['email']); ?></td>
                    <td><?php echo $p['create_time']; ?></td>
                    <td class="op-btns">
                        <a href="?action=edit&id=<?php echo $p['id']; ?>" class="btn-warning">编辑</a>
                        <a href="?action=delete&id=<?php echo $p['id']; ?>" 
                           class="btn-danger"
                           onclick="return confirm('确定要删除该人员信息吗?删除后无法恢复')">删除</a>
                    </td>
                </tr>
                <?php endforeach; ?>
            <?php endif; ?>
            </tbody>
        </table>
    </div>
</div>
</body>
</html>
5. 入口文件:index.php
文件路径:/var/www/html/index.php
核心职责:系统唯一入口,初始化配置、实例化模型与控制器、根据 action 参数分发请求,是所有功能的总调度入口。
<?php
/**
 * 系统入口文件
 * 所有请求统一进入此处,根据action参数分发到对应控制器方法
 */
// 1. 引入数据库配置与连接
require_once __DIR__ . '/config/database.php';
// 2. 引入模型与控制器
require_once __DIR__ . '/model/PersonModel.php';
require_once __DIR__ . '/controller/PersonController.php';
// 3. 实例化模型与控制器(依赖注入)
$personModel = new PersonModel($pdo);
$controller = new PersonController($personModel);
// 4. 路由分发:根据请求参数调用对应方法
$action = $_REQUEST['action'] ?? 'index';
switch ($action) {
    case 'add':
        $controller->add();
        break;
    case 'delete':
        $controller->delete();
        break;
    case 'edit':
        // POST提交走编辑处理,GET走页面回显
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            $controller->edit();
        } else {
            $controller->index();
        }
        break;
    default:
        // 默认显示列表页
        $controller->index();
        break;
}
三、部署步骤与权限设置
1. 创建目录结构
cd /var/www/html/
mkdir -p config model controller view
2. 按上面的路径逐个创建文件并写入代码
3. 设置目录权限(Apache 运行用户为 apache)
chown -R apache:apache /var/www/html/
chmod -R 755 /var/www/html/
# 临时关闭SELinux,避免权限报错
setenforce 0
五、浏览器访问
 访问验证
浏览器输入服务器 IP 地址:http://你的服务器IP/ 。
到此,由PHP+MySQL搭建的简易管理系统已搭建完成,快动手试试吧。
六、整体架构分析(扩展)

整体架构静态框图

1.先建立全局位置感:每一层只和相邻层打交道,依赖单向向下,不会反向调用。

2.PHP ↔ MySQL 底层交互原理图(PDO 预处理执行流程)
3.垂直方向:一次请求的完整链路(从外到内)
4.水平方向:PHP 代码内部的分层依赖关系

核心原则:依赖只能从上往下传,不能反向依赖。

  • 模型层 不能 调用控制器,也不能输出页面
  • 控制器 不能 直接写 SQL,也不能写大量 HTML
  • 视图层 不能 直接操作数据库,只能用控制器传过来的变量
亲爱的读者,文章到此结束,感谢您阅读我的文章。
感谢您的支持和关注,期待与您在未来的文章中再次相见。

点分享

点收藏

点点赞

点在看

最新文章

随机文章