很多人在初学 PHP 后端时会遇到一个很典型的困惑:语法、变量、函数、循环,好像都看懂了,但一旦要自己做一个“用户填写表单 -> 后端接收 -> 存入数据库 -> 页面显示结果”的小项目,就完全不知道该先写哪一行。
这套《【全6集】PHP 后端完整教程|前端基础 + MySQL + PHP + 表单验证 + 正则表达式》之所以值得认真过一遍,不是因为它能把 PHP 语法讲出多少花来,而是它用一个非常务实的顺序,帮你把一条完整的数据链路打通了:前端页面负责收集用户输入,后端语言负责接收和处理,MySQL 负责持久化存储,表单验证和正则表达式负责守好数据质量的边界。
换个更直白的说法:你缺的不是单独某个知识点,而是一条能把所有零散知识点挂上去的骨架。这篇文章就来拆开这套教程的编排逻辑,讲清楚每个模块到底解决了什么真实问题,哪些环节容易踩坑,以及学完之后你应该能做到什么程度。
1. 先看懂课程骨架:为什么是“前端基础 + MySQL + PHP + 表单验证 + 正则表达式”
很多人乍一看这个目录会觉得奇怪:学 PHP 后端,为什么要先学前端基础?既然有专门一集讲表单验证,为什么还要单独加一集正则表达式?这两个问题如果没想明白,学起来就会像在拼凑碎片,学完前两集就丢了第三集。
1.1 这其实是一条完整的数据流向,不是一个随意拼出来的课程清单
你可以在脑子里把任意一个后端小项目拆成这么几层:
- 用户看到一个页面,填写表单,点击提交。
- 浏览器把数据以 HTTP 请求的方式发给服务器。
- 服务器上的 PHP 脚本获取到请求数据。
- PHP 把数据整理、验证、清洗后,交给 MySQL 保存。
- MySQL 返回结果,PHP 再生成响应,浏览器渲染结果。
这套 6 集教程里的每一个板块,恰好都对应这条链路里的一环:
- 前端基础:解决“用户怎么输入、怎么提交”的问题。
- PHP 基础:解决“服务器怎么接收、怎么处理”的问题。
- MySQL:解决“数据存在哪里、怎么存储、怎么读取”的问题。
- 表单验证与正则表达式:解决“数据在进入存储之前,怎么判断是否合法”的问题。
所以你学习的时候,最好也按照这个顺序建立自己的项目骨架。哪怕你最终目标是做后端,也不要跳过前端基础这一集。因为只有亲手写过一次表单的action和method,你才能真正理解为什么后端要用POST接收数据,为什么某些数据会出现在 URL 上,为什么浏览器会提示“确认重新提交表单”。
1.2 接口是什么?这是入门阶段最容易被含糊过去的概念
学习前期,很多人会反复看到“后端提供接口”“前端调用接口”这样的说法,但没人真正解释清楚“接口”到底是个什么东西。
其实在 PHP 后端入门阶段,你可以把接口理解成一个有明确输入和输出约定的地址。
举个例子:
- 前端表单提交到
register.php。 register.php就是后端“接收用户注册请求”的接口。- 约定好:前端通过
POST方式提交username、email、password三个字段。 - 后端接收到数据后,经过验证和存储,返回一个 JSON 格式的结果:
{"code": 1, "msg": "注册成功"}。
在这个过程里,前端和后端并不关心彼此内部是怎么写的,只关心请求地址、请求方式、参数格式和返回格式。这个“约定”,就是接口的本质。
当你理解了接口,再看“前端基础和 PHP 后端”的关系时,就不会再把它们当成两门割裂的课。前端基础不只是让你会写一个漂亮的页面,而是让你知道:一个请求是怎么从浏览器出发,经过什么格式的编码,最终到达服务器某个文件里的。
1.3 谁是这套教程的读者,谁不需要在这上面花时间
从我自己的经验看,这套课程最适合的人群是:
- 学过 HTML / CSS / JS 基础语法,但不知道这些东西怎么和“后端”协作的初学者。
- 把 PHP 语法看了一遍,但脑子里没有“服务端接收请求、处理请求、返回响应”这个心智模型的开发者。
- 想要在毕业设计、课设、个人小项目中,独立完成一个带数据库存储、表单提交、简单权限校验功能的后端。
反过来,下面这几类人就不太适合在这套课程上投入时间:
- 已经独立完成过多个带 MySQL 存储的 PHP 项目,熟悉 MVC 分层和常见框架的人。
- 目的是快速进入 ThinkPHP、Laravel、Symfony 这类现代框架开发的人。框架本身已经封装了大量路由、请求、验证和数据库操作,你需要的是框架思维,而不是从最底层表单开始。
- 想学高性能后端架构、高并发处理的人。这套课程的重点是“跑通正确流程”,不是性能优化。
一句话:这是入门和筑基的课,不是进阶和高性能的课。它的价值在于让你少走“什么都会但串不起来”的弯路。
2. MySQL 不是背命令,而是先学会设计存储边界
在整个后端链路里,数据库往往是初学者第一个感到“陌生”的模块。PHP 代码写错了会立刻报错,前端页面写错了刷新就能看到,但 MySQL 出错时,问题经常藏在连接失败、数据没写入、查出来是乱码这些不容易判断的位置。
2.1 安装和基础配置:先确认三件事,再写第一行 SQL
不管你用 Windows、macOS 还是 Linux,安装 MySQL 之后,先不要急着建表。建议按下面这个顺序做一次健康检查:
- 确认服务已经启动。在命令行执行
mysql -uroot -p,能成功进入 MySQL 命令行,说明服务端正常。 - 确认端口和字符集。PHP 连接 MySQL 时,默认走
3306端口。如果本地跑过多个数据库服务占用了端口,要手动调整。字符集尽量在初始阶段就设置为utf8mb4,否则后面中文存储容易出现乱码。 - 确认认证插件兼容性。MySQL 8.x 默认的认证插件和 PHP 旧版本驱动之间可能有兼容问题,典型报错是“Authentication plugin 'caching_sha2_password' cannot be loaded”。遇到这个问题,可以在 MySQL 里将该用户的认证方式改为
mysql_native_password,或者升级 PHP 的数据库驱动版本。
这一步看起来很简单,但在实操中,很多人卡住的位置恰恰不是 SQL 语法,而是“为什么 PHP 连不上 MySQL”。这通常是网络层和配置层的问题,不是 SQL 层的问题。
2.2 建库建表:先别急着写业务代码,先把数据结构定下来
后端开发里有一个非常常见的坏习惯:一上来就写 PHP 逻辑,等到需要存数据了,才临时在数据库里建一张表,边写边加字段。
这套教程把 MySQL 放在 PHP 前面,是有道理的。因为你在写任何一行“插入用户”的代码之前,必须先想清楚:
- 要存哪些字段?
- 每个字段是什么类型?
- 哪些字段不能为空?
- 哪些字段不能重复?
- 用户密码到底要存成什么样子?
以用户表为例,一个最小化的结构大概是:
CREATE TABLE `user` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL, `email` VARCHAR(100) NOT NULL, `password_hash` VARCHAR(255) NOT NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;这里有几个设计点值得解释:
id用AUTO_INCREMENT自增主键,保证每条记录有唯一标识。username和email都限制长度,避免用户输入超长内容拖垮数据库性能。email建唯一索引,保证同一个邮箱不能重复注册。- 用户密码千万不要直接存明文,最少也要用
password_hash()生成哈希值再存储。 - 默认使用
InnoDB引擎,支持事务和外键约束,适合业务类数据。
这种设计的好处是:当你写 PHP 代码时,不用一边写一边纠结“这个字段有没有”“要不要加唯一索引”,数据边界已经固定下来了,代码逻辑自然就清晰了。
2.3 连接数据库的常见方式和最容易被漏掉的错误检查
PHP 连接 MySQL 最常见的方式是 PDO 或 MySQLi。如果你刚开始学,我更建议直接使用 PDO,原因有两个:
- PDO 支持预处理语句,能明显降低 SQL 注入风险。
- PDO 的统一性更好,以后切换数据库驱动时,代码改动比 MySQLi 小。
一个常见的 PDO 连接示例是:
<?php $host = '127.0.0.1'; $port = '3306'; $dbname = 'your_database'; $user = 'root'; $pass = 'your_password'; $charset = 'utf8mb4'; $dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=$charset"; try { $pdo = new PDO($dsn, $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "数据库连接成功"; } catch (PDOException $e) { echo "连接失败: " . $e->getMessage(); // 生产环境里不要把这种信息直接输出给用户 } ?>当你发现“连接失败”时,排错顺序应该是:
- 看 MySQL 服务是否已启动。
- 看用户名、密码、主机、端口是否匹配。
- 看数据库名是否存在。
- 看 PHP 是否加载了对应的 PDO MySQL 扩展。
- 看防火墙或远程访问权限是否阻止了连接。
很多情况下,报错报的不是 SQL 问题,而是连接参数和环境扩展问题。把这一步的排查链路写下来,比死记几个 SQL 命令更能解决实际问题。
3. PHP 后端不只是写语法,而是处理请求、操作数据、返回响应的编排过程
当课程进入 PHP 环节时,很多人的学习方式会出问题:开始反复刷语法题、背函数、写各种独立的小例子。这当然不是坏事,但如果你想真正做到“后端开发”,必须立刻把视角从“PHP 语法”切换到“PHP 在服务端里的角色”。
3.1 理解 PHP 的“收到请求 -> 处理 -> 返回响应”循环
后端脚本本质上只做四件事:
- 接收请求(
$_GET、$_POST、$_FILES或解析 JSON 请求体)。 - 处理业务逻辑(验证数据、调用数据库、组装结果)。
- 根据结果生成响应(HTML 页面、JSON 数据、重定向)。
- 结束本次请求,等待下一次请求。
以用户注册为例,流程就是:
<?php // 1. 判断请求方式 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 2. 接收数据 $username = trim($_POST['username'] ?? ''); $email = trim($_POST['email'] ?? ''); $password = $_POST['password'] ?? ''; // 3. 这里应该做表单验证和正则验证,后面会讲 // 4. 写入数据库(使用预处理语句) $stmt = $pdo->prepare("INSERT INTO user (username, email, password_hash) VALUES (?, ?, ?)"); $stmt->execute([$username, $email, password_hash($password, PASSWORD_DEFAULT)]); // 5. 返回响应(可以跳转或输出 JSON) echo json_encode(['code' => 1, 'msg' => '注册成功']); exit; } ?>注意这里有几个关键点:
- 不要直接使用
$_POST['username'],因为你不能保证用户一定提交了这个字段。先用?? ''给一个默认值,再trim()去掉首尾空格,可以避免“未定义索引”的报错。 - 写入数据库时,不要用字符串拼接 SQL。如果直接把
$username拼到 SQL 里,一旦用户输入带引号的恶意内容,就容易引发 SQL 注入。预处理语句是你规范 SQL 格式的有力工具。 - 密码要
password_hash()加密存储,验证密码时用password_verify()校验,不要自己发明加密算法。
3.2 GET 和 POST 的选择:看起来是小事,其实决定了接口语义
表单提交时,前端要做的一个选择是method="get"还是method="post"。很多人只是机械地记得“搜索用 GET,注册用 POST”,但没有理解背后的原因。
从后端角度理解会更清楚:
GET请求参数会出现在 URL 上,适合查询、查看、无副作用操作。优点是方便分享和缓存,缺点是敏感信息会暴露在地址栏和日志中。POST请求参数放在请求体里,适合创建、修改、删除等有副作用的操作。优点是数据不暴露在 URL,能承载更大体积的数据,更适合表单提交。
所以,注册、登录、修改密码、添加商品这种改变服务器状态的请求,都应该用POST。如果注册表单用了GET,用户填写的密码会直接出现在浏览器地址栏里,这是基础但严重的错误。
3.3 输出 JSON 还是 HTML?取决于你的前端和后端协作方式
在传统 PHP 开发中,后端可以直接在 PHP 文件里拼接 HTML 输出。而在前后端分离的项目中,后端通常只输出 JSON 数据,由前端 JavaScript 负责渲染页面。
这两种方式没有绝对的好坏,取决于项目规模和团队结构。初学者很容易被“纯 PHP 混 HTML”和“前后端分离”这两种模式搞糊涂。
- 如果做的是课设、小型企业站、个人博客,传统模式下 PHP 直接渲染 HTML 更简单直接,也更容易调试。
- 如果做的是前后端完全分离的应用,PHP 就需要提供一组 API 接口,统一返回 JSON,由 Vue / React 这类前端框架去消费数据。
学习这套教程时,建议先把“PHP 渲染 HTML”这种传统方式跑通,理解数据是怎么从数据库到后端、再到浏览器的。之后再尝试让后端返回 JSON,用前端代码请求接口、动态渲染页面。这样你对“接口”的理解会有一次真正的升级。
4. 表单验证的核心不是“出提示”,而是让脏数据进不了数据库
表单验证是这套课程里看起来“最简单”、实际最容易出问题的一个模块。很多教程只会教你写几个if判断,然后在页面里弹出提示,但真正重要的工程问题常常被忽略:前端验证可以被绕过,服务端验证才是最后一道防线。
4.1 客户端验证和服务端验证要配合,而不是二选一
浏览器端的 JavaScript 验证有一个明显优势:即时反馈。用户不用等页面刷新,就能知道“邮箱格式不对”“密码太短”。这样用户体验好,也能减少无效请求。
但前端验证存在一个致命弱点:用户可以通过禁用 JavaScript、手动构造请求、使用接口调试工具等方法,绕过页面表单直接向后端提交数据。
所以服务端验证不能省。哪怕前端已经做了格式检查,后端依然要重新检查一遍。这是因为:
- 你无法保证所有请求都来自你的前端页面。
- 恶意请求可以直接携带任意参数。
- 数据库本身不会判断字段是否合法,只能靠存储类型、约束和后端业务逻辑共同把关。
4.2 一套从简到繁的验证顺序
我建议在实际开发中,不要东一个验证、西一个验证,而是按固定顺序来:
- 必填验证:接收到的字段是否存在,是否为空字符串。
- 格式验证:类型、长度、是否匹配邮箱/手机号/URL 等格式。
- 逻辑验证:字段值是否在合理范围内,比如年龄要在 0 到 120 之间。
- 唯一性验证:如果字段有唯一索引,比如邮箱,先查询是否已经存在。
- 安全验证:过滤危险字符、控制长度、做转义。
一个简化但完整的服务端验证逻辑,看起来是这样:
<?php $errors = []; if (empty($username)) { $errors[] = '用户名不能为空'; } elseif (mb_strlen($username) < 2 || mb_strlen($username) > 20) { $errors[] = '用户名长度需要在 2 到 20 个字符之间'; } if (empty($email)) { $errors[] = '邮箱不能为空'; } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = '邮箱格式不正确'; } if (empty($password)) { $errors[] = '密码不能为空'; } elseif (strlen($password) < 6) { $errors[] = '密码至少需要 6 位'; } if (!empty($errors)) { // 返回错误信息,可以由前端展示 echo json_encode(['code' => 0, 'msg' => implode('; ', $errors)]); exit; } ?>这段代码里的验证顺序就是先确认“有没有”,再确认“对不对”,最后确认“能不能用”。这样写的好处是,错误信息是逐条累积的,用户一次提交也能看到所有问题,不用反复提交才能改完。
4.3 错误提示的“回显”方式,决定了你在开发阶段是否方便
如果你做的是 PHP 直接渲染 HTML 的传统模式,验证失败后通常需要把错误信息带回表单页面,让用户看到哪里错了。最简单的方式是把错误数组存到$_SESSION或变量中,然后在表单区域按字段输出。
如果做的是前后端分离模式,后端统一返回 JSON,前端拿到code和msg后自己渲染提示,逻辑会清爽很多。初学者在练习时,建议先写一个完整的非 AJAX 表单提交流程,理解传统模式;再改成 fetch 请求提交 JSON,理解接口模式。
一个常见误区是:验证逻辑写完后,发现前端根本不提示错误。这时不要只盯着 PHP 代码,先打开浏览器调试工具,看 Network 里的请求和响应内容,确认后端到底返回了什么。排查问题永远要先确认“每一层实际发生了什么”,而不是靠猜。
5. 正则表达式不是临时背一背,它是表单验证里最锋利的“格式定义”工具
单独拿出一集讲正则表达式,说明这套课程意识到了一个问题:很多表单验证的难点,不是逻辑判断,而是“怎么描述一个合法格式”。
判断用户名是否为空,只需要if (empty())。但判断用户输入的邮箱是不是一个合理结构,判断手机号是否符合 11 位数字规则,判断输入的字符串是否是一个合法 IP 地址,这些都涉及更精确的模式匹配。这时,正则表达式就派上用场了。
5.1 先建立最小心智模型:正则表达式就是“按规则匹配字符串的一种模式”
很多人一看正则表达式就觉得头大,因为符号太多了。但如果你把它拆开看,核心就三个要素:
- 匹配单个字符:比如
\d匹配数字,\w匹配字母、数字、下划线,.匹配任意字符。 - 匹配数量:比如
+表示至少一次,*表示零次或多次,{n,m}表示 n 到 m 次。 - 匹配位置:比如
^表示字符串开头,$表示字符串结尾。
这三个要素组合起来,就能描述很多格式。
5.2 几个可以立刻用到的常见验证模式
验证手机号(中国大陆 11 位,常见规则约定 1 开头)
$pattern = '/^1[3-9]\d{9}$/'; if (preg_match($pattern, $phone)) { // 格式合法 }这里的含义是:以1开头,第二位是3到9之间的一个数字,后面跟 9 个任意数字。
验证邮箱(简化版)
$pattern = '/^[\w.\-]+@[\w\-]+(\.[\w\-]+)+$/'; if (preg_match($pattern, $email)) { // 格式合法 }这个模式允许用户名部分包含字母、数字、下划线、点、连字符,域名部分由至少两段组成。需要说明的是,邮箱验证在工程实践中往往没有一种正则能做到“万无一失”,因为邮箱域名规则本身很复杂。把正则当成第一道格式把关,如果项目要求严格,再配合 DNS 或发送验证邮件等机制。
验证 IPv4 地址
这个话题在热搜里频繁出现,说明很多人在实际作业或工作里需要用到。IPv4 地址由四段 0 到 255 的数字组成,用点分隔。一个严格一点的正则写法如下:
$pattern = '/^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$/'; if (preg_match($pattern, $ip)) { // 是合法 IPv4 地址 }这段正则的匹配逻辑是:每一段数字都只能是 0 到 255,25[0-5]表示 250-255,2[0-4]\d表示 200-249,1\d{2}表示 100-199,[1-9]?\d表示 0-99(但不允许前导零的复杂场景这里做了简化)。前 3 段后跟一个点,最后一段不加点。
5.3 初学正则一定要养成的调试习惯
不要指望一次就能写出完全正确的正则表达式。即使是写了多年的开发者,也需要在在线正则测试工具、命令行grep或代码里反复验证。
建议的调试步骤是:
- 先写一个最简单的匹配,比如
/\d/匹配数字,确认工具本身可用。 - 逐步增加约束条件,每加一层就换几组测试数据,包括正常数据和异常数据。
- 注意
^和$,不加这两个锚点时,preg_match经常会从字符串中间找到匹配,导致格式错误的数据被误判为合法。 - 注意转义。在 PHP 单引号字符串里写正则时,
\d不需要额外转义;但如果你在双引号字符串里写"\d",结果可能和你预期不一样。 - 如果正则很长,建议分拆并用变量拼接,或者在关键位置加注释,避免过三个月自己也看不懂。
注意:正则表达式解决的是“格式看起来对不对”,不是“这个数据真实存在”。比如一个手机号即使匹配了正则,也不代表该号码一定在用。真正业务里有需要时,还要结合短信验证码、运营商接口等机制做二次确认。
6. 把六集串成一个最小可用的完整项目,才算是真正入门
课程最后一集大概率会带你做一个综合项目。这个项目很重要,因为它要把前面所有模块串起来,让你看到“前端基础 + MySQL + PHP + 表单验证 + 正则表达式”不是五个独立部分,而是一个整体。
6.1 建议先做一个最经典的“用户注册”项目
这个项目虽小,但完整覆盖了后端开发的核心链路:
- 前端写一个注册表单页。
- CSS 做基础样式,让页面可用、能看。
- 表单提交到 PHP 后端。
- 后端接收数据。
- 先做必填验证,再做正则和
filter_var格式验证。 - 验证通过后,检查邮箱是否已存在。
- 密码用
password_hash加密。 - 将用户数据写入 MySQL。
- 成功后跳转到登录页或直接返回 JSON。
- 失败时把错误信息返回给前端展示。
这个流程做完,你就已经把课程里的 90% 知识点都用了一遍。
6.2 单次跑通之后,还要检查几件容易被忽略的工程问题
很多人做项目做到“表单能提交,数据能入库”就停了。但从工程角度看,这只是第一步。我建议你跑通之后,继续做下面几件事:
- 重复提交:用户疯狂点击提交按钮,数据库会不会产生多条重复记录?如何处理?
- 异常处理:如果 MySQL 写入失败,你的代码是直接白屏还是给用户一个友好提示?
- 目录结构:把数据库连接、验证逻辑、页面模板拆开,不要所有代码堆在一个
register.php文件里。 - 日志:开发阶段直接在页面输出错误信息没问题,但生产环境需要记录错误日志,而不是把堆栈打印给用户。
这些要求不是打击你,而是告诉你:单次跑通只能说明“流程没有断”,不能说明“可以上线”。做完整项目时,永远要追问——异常情况下程序会怎么表现。
6.3 前后端分离和传统模式,初学者该怎么选
课程里有很大的热搜关注“前后端分离项目实战”“前后端怎么协作”“后端提供接口,接口是什么”。但作为初学者,我不建议一上来就后端只写接口、前端用 Vue 渲染,因为你会同时面对两个复杂体系。
可以先走传统模式:
- 后端 PHP 文件直接处理请求,验证,操作数据库,最后
include一个 HTML 模板渲染页面。 - 这让你能看到“从请求到响应”的完整过程,不容易被跨域、鉴权、异步渲染等问题干扰。
等传统模式跑通了,再尝试:
- 前端写一个静态 HTML,用
fetch提交表单。 - 后端接口只负责接收 JSON 参数,返回 JSON 数据。
- 这时你会遇到跨域、预检请求、前端如何显示服务端错误信息等新问题,但因为你已经理解后端逻辑,排查起来就不会一头雾水。
如果目标是要做独立项目、毕业设计或小公司内部系统,传统模式完全够用。如果目标是进入开发团队参与前后端分离项目,那就必须把接口设计、JSON 格式约定、跨域处理这些能力补上。
6.4 一套可以直接落地的课程学习建议
最后分享一个实际可操作的“过课程”方案,我建议你按这个节奏来:
- 第一遍:只看不动手,整体过一遍课程,记录有哪些知识点超出你当前理解,不要停下来查。
- 第二遍:跟着课程敲代码,但不要复制,每个例子都自己输入一遍,感受报错和调试过程。
- 第三遍:合上课程,自己从零开始做一个用户注册小项目,遇到问题先通过搜索和调试解决,最后再回看课程对应章节。
- 总结:把“前端页面、PHP 后端、MySQL、表单验证、正则表达式”五块知识,用一张流程图串起来,写下每一步输入输出是什么。
这个过程看起来很笨,但恰恰是它能把课程内容真正变成你自己的技能。因为你记住的不再是某段代码,而是一条遇到问题能够主动定位和修复的思维路径。
回到文章开头的那个判断:这套课程真正改变的,不是你把 PHP 语法背得有多熟,而是让你获得一个完整的后端数据流心智模型。有了这个模型,以后无论是学框架、学接口、学数据库优化,都会知道它们分别挂在这条链路的哪个环节上,应该去解决哪个问题。这是所有后期进阶真正的地基。