☰
PHP后端完整教程:六阶段串联前端表单、MySQL与正则验证
2026/10/6 17:45:02 网站建设 项目流程

PHP后端完整教程最怕的不是知识点少,而是知识点之间断开。前端表单写好了不知道怎么把数据送到后端,MySQL建好表了不知道怎么和PHP连起来,正则表达式会写了却不知道该放在哪个函数里。这套全六集的PHP后端完整教程,正好把前端基础、MySQL、PHP、表单验证、正则表达式串成一条完整的入门路线。先给结论:最值得看的不是某一个语法,而是一整套“从前端表单到数据库落地”的闭环,它能解决你学完后不知道用来做什么的问题。适合零基础或者自学前端准备转向后端的读者。下面按实际学习顺序拆成六个阶段,把每一步要准备什么、要做什么、怎么判断有没有学会,一次说清楚。

1. 先搞清楚这套路线到底让你学会什么

1.1 它适合谁,不适合谁

这套学习路线最适合三类人:完全没有后端经验、只会写静态HTML、学校课程设计需要做网站系统的人。如果你已经能独立使用框架做CRUD,再看这套内容会偏基础。它不适合想直接研究框架源码、做高并发网关、或深入底层性能优化的读者。

学习后端很容易掉进一个坑:今天看PHP变量,明天看MySQL索引,后天看正则表达式,最后发现没有一条主线把它们绑在一起。这套六阶段路线的价值,恰恰是帮你把零散知识绑成一条可运行的数据流。

1.2 六个阶段其实是一条数据流

整条路线可以看作一句话:用户在前端页面填写表单,数据提交给PHP后端,后端确认数据合法之后,再存进MySQL。六个阶段对应这条链路上的不同环节。

  1. 前端基础:写一个能提交数据的HTML表单。
  2. MySQL基础:建库建表,准备接收数据。
  3. PHP基础:理解变量、超全局数组、文件组织方式。
  4. 表单提交:让表单数据通过POST或GET送到PHP文件。
  5. 表单验证:对输入做清洗、必填判断、格式判断。
  6. 正则表达式:用更精确的模式匹配手机号、用户名等字段。

这一步完成时,你脑海里应该有一张流程图。而不是只记住$_POST、mysqli、preg_match几个孤立函数。

1.3 怎么判断自己真的学会了

判断标准不是“看完了”,而是能不能独立做一个带数据库的注册页面。我建议按这个验收方式检查:

  • 打开页面,能看到一个表单。
  • 填写用户名、邮箱、手机号、密码。
  • 提交后,PHP先校验字段是否为空、格式是否合法。
  • 合法数据写入MySQL数据表。
  • 非法数据返回错误提示,并保留用户已填的内容。
  • 刷新数据库,能看到新增记录。

这一条链路能完整跑通,说明你已经具备最基础的后端开发能力。第6集的正则表达式,本质上是“表单验证”这个环节的加强工具,不是单独存在的语法知识。

2. 开始前先把本地开发环境准备好

2.1 新手建议用集成环境,但要知道它做了什么

PHP不是直接在浏览器里运行的,它需要一个解释器,还需要一个能处理HTTP请求的服务端程序。新手如果手动装PHP、MySQL、Apache,很容易在第一步就被环境配置卡住。常见集成环境有XAMPP、phpStudy、Laragon,它们的作用是帮你把PHP、MySQL、Web服务器打包在一起。

但我建议你在使用集成环境时,至少搞清楚这三个角色:

组件角色
Web服务器接收浏览器请求,把PHP文件交给PHP解释器
PHP解释器执行PHP代码,生成HTML或JSON内容
MySQL服务器负责数据存储和查询

这样以后遇到“页面能打开但数据库连接失败”时,你才不会一头雾水。环境工具只是方便,不是替代理解。

2.2 用PHP内置服务器把第一个页面跑起来

如果你不想一开始就装Apache,可以先用PHP自带的内置Web服务器。前提是你已经安装了PHP,并在命令行里能执行php -v看到版本号。

假设你在项目目录下新建了一个文件index.php,内容写:

<?php echo 'PHP后端学习环境正常';

然后在项目目录执行:

php -S 127.0.0.1:8000

浏览器访问:

http://127.0.0.1:8000/index.php

如果页面输出“PHP后端学习环境正常”,说明PHP解释器、内置服务器、文件路径都没问题。这一步并不复杂,但它能帮你确认环境是否可用,再往下学才不会越学越乱。

2.3 环境准备阶段的验收清单

完成环境准备后,我一般会做下面几项检查:

  • 命令行输入php -v,能输出版本信息。
  • 命令行输入mysql --version,能输出MySQL版本信息,或能进入MySQL客户端。
  • 访问http://127.0.0.1:8000/index.php,能看到PHP输出。
  • 项目目录建议使用英文路径,不要带中文和空格,避免出现路径解析问题。
  • 端口被占用时,换一个端口,比如php -S 127.0.0.1:8080。

很多初学者喜欢一上来就跟着教程写代码,结果连环境都没跑通。这个阶段宁可慢一点。环境稳了,后面所有表单、数据库、正则测试都不会被环境问题干扰。

3. 前端基础:表单提交是前后端的第一次连接

3.1 一个最小可用的表单长什么样

很多人觉得前端基础就是CSS和JavaScript,其实在后端教程里,前端基础的第一优先级是表单。一个完整的HTML表单,至少要包含这三个东西:

<form action="register.php" method="post"> <label>用户名:</label> <input type="text" name="username"> <button type="submit">注册</button> </form>

这里的关键不是界面好不好看,而是三个属性对齐了:

  • action告诉浏览器数据提交到哪个地址。
  • method告诉浏览器用GET还是POST发送请求。
  • name是字段名,PHP后端靠它获取数据。

最容易犯的错是,只写了input没写name。这样用户填了内容,后端也收不到,因为根本不知道这个字段叫什么。

3.2 GET和POST到底怎么选

GET和POST是表单提交最常用的两种方式。它们的区别不是“谁安全谁不安全”,而是使用场景不同。

对比项GETPOST
数据位置放在URL查询参数里放在请求体里
可见性地址栏可见一般不在地址栏显示
数据长度受URL长度限制相对更宽松
典型场景搜索、分页、分享链接注册、登录、提交内容
是否适合密码不适合更适合,但仍要配合HTTPS

我一般会建议:注册、登录、新增、修改数据都用POST;搜索、筛选、分页可以用GET,因为GET能生成可分享的链接。表单验证教程里通常也以POST为例,因为提交的数据量更大、更接近真实后端场景。

3.3 PHP接收参数的三种写法

在前端表单提交后,PHP通过超全局数组接收参数。

<?php $username = $_POST['username'] ?? ''; $email = $_GET['email'] ?? ''; $age = $_REQUEST['age'] ?? '';

$_POST接收POST方式提交的数据,$_GET接收URL查询字符串里的数据。$_REQUEST能接收两种,但我不建议在正式代码里优先用它,因为来源不清晰。代码越往后写,你越需要知道每个数据到底是从哪来的。

接收之后,先不要急着拼接SQL或输出。先打印看看:

var_dump($_POST);

如果能看到表单字段,说明前后端连接成功。如果看到NULL或者空值,先检查method、name、action三个属性。

3.4 为什么这里就要理解“接口”

热搜词里有很多“后端提供接口”“接口是啥”这类问题。接口在这里不需要神秘化。后端接口就是一个URL,它接收参数,处理完业务逻辑后返回结果。返回结果可以是一个HTML页面,也可以是一段JSON数据。

前端表单提交到后端文件,其实就是调用一次接口。你写的register.php,就是注册接口。理解了这条链路,后面学框架时提到的接口路由,基本就是同一个概念。只是框架会帮你把参数解析、路由分发、响应格式统一起来。

这个阶段不要急着学前后端分离。先理解“表单提交 -> PHP接收 -> PHP响应”这个最小闭环,后面再看fetch、axios、JSON接口,会容易得多。

4. MySQL安装、建库、建表与PHP连接

4.1 安装后先确认的几件事

MySQL安装是新手最容易卡住的步骤之一。装完之后,不要急着写PHP,先确认三件事。

第一,MySQL服务是否已经启动。Windows服务管理器里能看到MySQL相关服务,macOS和Linux一般通过命令启动或检查。服务没启动,PHP连数据库会直接报“Connection refused”。

第二,root账号密码是否记住。集成环境通常设置一个简单密码,也可能为空。这部分一定要记下来,后面PHP连接要用。

第三,能不能用命令行进入MySQL。打开终端执行:

mysql -u root -p

输入密码后能进入mysql>提示符,说明客户端可用。如果这一步失败,先解决数据库账号和服务问题,不要急着改代码。

4.2 建库建表和插入测试数据

进入MySQL命令行后,执行下面的SQL创建数据库和数据表。为了支持中文,字符集统一用utf8mb4。

CREATE DATABASE IF NOT EXISTS demo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE demo; CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL, phone VARCHAR(20) NOT NULL, password_hash VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

其中id是自增主键,username设置唯一约束,防止重复用户名。password_hash字段用来保存密码的哈希值,不要存明文密码。

插入一条测试数据,方便后面用PHP查询:

INSERT INTO users (username, email, phone, password_hash) VALUES ('testuser', 'test@example.com', '13800138000', 'hashed_value');

然后执行:

SELECT * FROM users;

能看到刚插入的记录,说明数据库、数据表、写入流程都正常。

4.3 用PDO连接MySQL

PHP连接MySQL有两个常见选择:mysqli和PDO。我更推荐新项目用PDO,因为它支持多种数据库,而且预处理写起来更统一。下面是一个最小连接示例:

<?php $dsn = 'mysql:host=127.0.0.1;port=3306;dbname=demo;charset=utf8mb4'; $username = 'root'; $password = '你的密码'; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]; try { $pdo = new PDO($dsn, $username, $password, $options); echo '数据库连接成功'; } catch (PDOException $e) { echo '数据库连接失败:' . $e->getMessage(); }

这里有几个关键点:

  • host用127.0.0.1,不要写成localhost,避免某些环境解析成不同网络地址。
  • port默认是3306,如果你的MySQL端口改了,要同步修改。
  • charset=utf8mb4,能避免中文乱码。
  • 开启异常模式后,SQL出错时会直接抛出异常,方便排查。

连接成功之后,可以先执行一条查询验证:

$stmt = $pdo->query('SELECT * FROM users'); $users = $stmt->fetchAll(); print_r($users);

能输出测试数据,说明PHP和MySQL已经打通。

4.4 为什么不用mysql_开头的老接口

如果你搜索PHP连接MySQL,可能会看到老教程里用mysql_connect。这个接口在PHP 7里已经被移除,不能再使用。遇到这类代码,直接跳过。

正确做法是使用mysqli或PDO。新手不用纠结太多,只要记住:新项目用PDO是更稳妥的方向。PDO的预处理能帮忙防止SQL注入,而且代码结构更清晰。

实际项目中查询用户输入时,不要这样拼接:

$sql = "SELECT * FROM users WHERE username = '" . $_POST['username'] . "'";

这样写如果用户名里含特殊字符,SQL语句可能被误解析,属于非常危险的习惯。正确做法是使用预处理占位符:

$stmt = $pdo->prepare('SELECT * FROM users WHERE username = ?'); $stmt->execute([$_POST['username']]); $user = $stmt->fetch();

这条原则从教程第一天就要养成,后面写任何数据操作都不能丢。

5. 表单验证:真正决定数据能不能入库的一步

5.1 前端验证只是提示,后端验证才是规则

很多前端框架可以写required、maxlength,用户不填就会提示。但前端验证只能提升体验,不能替代后端验证。因为请求可以绕过页面直接发给后端,浏览器上的限制对服务端没有任何约束力。

所以PHP后端收到数据后,必须自己执行一套验证规则。流程可以拆成四步:

  1. 接收原始数据。
  2. 清洗数据,去掉多余空格和危险字符。
  3. 检查必填项。
  4. 检查格式、长度、唯一性。

顺序不能乱。先清洗再验证,能避免因为首尾空格导致的误判。

5.2 验证前先做数据清洗

PHP里常用的清洗函数有三个:

  • trim()去掉首尾空格。
  • strip_tags()去掉HTML标签。
  • htmlspecialchars()把特殊字符转成HTML实体,防止输出时破坏页面结构。

示例:

$username = trim($_POST['username'] ?? ''); $email = trim($_POST['email'] ?? ''); $phone = trim($_POST['phone'] ?? ''); $password = $_POST['password'] ?? '';

注意password一般不能随便trim,因为密码可能包含空格。这不是说密码不能有空格,而是不要只为了清洗数据就把合法字符改掉。

清洗完成后再做必填判断:

$errors = []; if ($username === '') { $errors[] = '用户名不能为空'; } if ($email === '') { $errors[] = '邮箱不能为空'; } if ($phone === '') { $errors[] = '手机号不能为空'; } if ($password === '') { $errors[] = '密码不能为空'; }

用一个$errors数组收集所有错误,比遇到一个错误就exit要好。这样用户可以一次看到所有问题,不用反复提交。

5.3 邮箱、手机号、长度判断怎么组合

清洗和必填之后,再做格式和长度判断。邮箱可以用PHP自带的filter_var:

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = '邮箱格式不正确'; }

手机号可以用正则表达式,这部分在第6章会详细展开。长度判断直接用mb_strlen:

if (mb_strlen($username) < 3 || mb_strlen($username) > 16) { $errors[] = '用户名长度需要在3到16个字符之间'; } if (strlen($password) < 8) { $errors[] = '密码长度不能少于8位'; }

判断结果如果$errors不为空,就停止业务处理,返回错误。为空才继续写入数据库。

5.4 验证失败后怎么回显错误并保留输入

新手最常遇到的体验问题是:表单提交失败后,页面刷新,用户填的内容全丢了,还要重新填一遍。解决方法是把已填写内容回显到表单的value属性里,同时转义输出,防止XSS。

<input type="text" name="username" value="<?= htmlspecialchars($username ?? '') ?>">

错误信息可以遍历输出:

<?php if (!empty($errors)): ?> <ul> <?php foreach ($errors as $error): ?> <li><?= htmlspecialchars($error) ?></li> <?php endforeach; ?> </ul> <?php endif; ?>

这里所有输出都要用htmlspecialchars。因为用户输入的字符串可能包含<script>之类的内容,如果不转义直接输出到HTML页面,会导致页面结构被污染,甚至产生安全隐患。

验证通过后,密码要使用哈希存储,不要直接保存明文:

$passwordHash = password_hash($password, PASSWORD_DEFAULT);

验证登录时再用password_verify比对。这是PHP内置的密码哈希方案,比自己设计加密算法靠谱得多。

6. 正则表达式:从入门到落地到表单校验里

6.1 两个最常用的PHP正则函数

正则表达式是一套字符匹配规则。PHP里最常碰到的两个函数是preg_match和preg_replace。

  • preg_match($pattern, $subject)用于判断字符串是否匹配指定模式。
  • preg_replace($pattern, $replacement, $subject)用于把匹配到的内容替换成其他文本。

表单验证里,主要用preg_match。它的返回值是0或1:

$pattern = '/^1[3-9]\d{9}$/'; $phone = '13800138000'; if (preg_match($pattern, $phone)) { echo '手机号格式正确'; } else { echo '手机号格式不正确'; }

^表示从字符串开头匹配,$表示匹配到字符串结尾。如果省略这两个,可能出现部分匹配的情况,导致错误判断。

6.2 用户名、手机号、密码强度的表达式

下面是几个在表单验证里很常用的正则模式。

用户名要求:以字母或数字开头,允许下划线,总长度3到16位。

$pattern = '/^[a-zA-Z0-9_]{3,16}$/';

手机号要求:1开头,第二位是3到9,后面跟着9位数字,一共11位。

$pattern = '/^1[3-9]\d{9}$/';

密码强度要求:至少8位,必须同时包含字母和数字。

$pattern = '/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/';

注意密码强度这类规则很容易写得过严或过松。上面这个表示“允许大小写字母和数字,必须包含字母和数字”,如果你还需要特殊字符,就得再调整。

正则表达式里常见元字符可以整理成一张速查表:

元字符含义
^匹配字符串开头
$匹配字符串结尾
.匹配除换行外的任意字符
*前一个字符重复0次或多次
+前一个字符重复1次或多次
?前一个字符出现0次或1次
\d匹配一个数字
\w匹配字母、数字、下划线
\s匹配空白字符
[]字符集合
()分组
{n,m}重复次数范围

这里最容易犯的错:把\d写进双引号字符串,结果被转义成其他内容。所以PHP里写正则,我建议用单引号字符串,例如'/^\d+$/',减少转义问题。

6.3 别把所有验证都交给正则

正则表达式很强,但并不是所有字段都适合用正则。邮箱校验就是一个例子。虽然也能写一个邮箱正则,但PHP自带filter_var已经能处理大部分合法邮箱格式,直接用它更稳妥。

正则适合的场景是:格式规则明确、长度固定、字符范围固定,比如手机号、用户名、IP地址、编号。IP地址也可以用正则判断,但要注意IPv4和IPv6的边界,写起来很复杂。如果只是业务系统做简单的IPv4判断,可以用下面这种粗粒度正则,但不要指望它覆盖所有合法边界:

$pattern = '/^(25[0-5]|2[0-4]\d|1?\d?\d)(\.(25[0-5]|2[0-4]\d|1?\d?\d)){3}$/';

这种正则容易因为一个边界条件出错,所以实际项目里还要结合其他判断逻辑。正则不是炫技,它是把字段规则说清楚。规则越复杂,越要拆开测试,不要一个模式写完就以为万事大吉。

落地到表单验证时,正则返回结果只有两个:匹配或不匹配。对应代码逻辑就是:

if (!preg_match($pattern, $phone)) { $errors[] = '手机号格式不正确'; }

把这条规则放在前面整理好的$errors数组循环里,整个表单验证流程就完整了。

7. 常见报错和排查顺序

7.1 页面空白和表单没反应

学PHP最常见的现象就是:浏览器访问文件,页面一片空白,或者提交表单后没反应。

先不要急着怀疑代码逻辑。按下F12打开开发者工具,看Network面板,确认请求是否发起、响应状态码是什么。

如果请求根本没发,回去检查action地址和表单的method。如果请求发出去但PHP文件返回500,再看日志或临时开启错误显示:

error_reporting(E_ALL); ini_set('display_errors', '1');

这段代码只适合本地开发,生产环境千万不要开启显示错误,否则会泄露文件路径和代码信息。

排查顺序应该是:

  1. 看现象:是空白、报错、还是跳到错误页面。
  2. 看输入:URL地址、表单字段名、提交方式。
  3. 看环境:PHP版本、扩展是否安装、端口和路径。
  4. 看参数:DSN、数据库账号、正则模式。
  5. 最后看工具本身:是不是函数已废弃、语法不兼容。

不要一上来就改代码。先定位是哪个环节失败,再动手。

7.2 数据库连接失败

数据库连接失败的报错信息通常已经很明确,但新手经常忽略关键部分。

首先检查MySQL服务是否启动。然后检查连接信息是否一致。常见错误有:

错误现象优先排查
Connection refusedMySQL服务未启动或端口错误
Access denied for user用户名或密码错误,权限不足
Unknown database数据库名写错
could not find driverPHP缺少PDO MySQL扩展

在集成环境里,php.ini中需要启用对应扩展,比如pdo_mysql。可以通过php -m查看模块里有没有PDO和pdo_mysql。

如果本机命令行能进MySQL,但PHP连接失败,通常是端口、密码、或扩展问题。这时不要去改数据库权限,先确认连接字符串里的每一段都对得上。

7.3 中文乱码

中文乱码是最容易重复出现的问题。其实只要统一字符集,大多数乱码都能解决。检查三个位置:

  • HTML页面声明:<meta charset="UTF-8">。
  • PHP文件保存编码:用UTF-8无BOM格式保存。
  • 数据库连接DSN:charset=utf8mb4。
  • 数据表字符集:建表时用utf8mb4。

一条链路里有任何一个环节是latin1或gbk,就会出现乱码。遇到乱码时,从数据库、连接、页面三层逐个核对,比反复改代码更有效。

7.4 坚持先看现象再看环境,不急着改参数

我见过很多新手遇到报错后的第一反应是调大超时时间、改并发数量、换端口,结果问题还在。其实很多报错不是因为参数不够,而是输入格式、路径、权限、依赖版本不对。

比如正则验证一直不通过,先检查字符串前后有没有空格,再检查模式里是不是少了^和$,最后检查PHP单双引号转义。比如表单验证一直说邮箱格式不对,先看input的name是不是真的叫email。

排查问题最忌讳的是没有依据地乱试。每次修改只改一个变量,记录结果,再定位下一层。

8. 学完之后下一步怎么走

8.1 从单文件脚本走向分层项目

学完这套基础后,你可能会发现所有代码都写在register.php里:HTML、表单验证、数据库操作、错误回显全混在一起。短时间没问题,但项目一旦变大,维护成本会迅速上升。

下一步建议接触三层结构:

  • 表现层:负责显示HTML页面。
  • 业务逻辑层:负责表单验证、权限判断、业务规则。
  • 数据访问层:负责操作MySQL。

你可以先不引入框架,自己把数据库连接封装成一个类,再把表单验证封装成一个函数。只要代码能被反复调用、职责清晰,你就已经不再是纯入门水平。

8.2 接口到底是怎么回事

在这套教程里,表单提交后PHP返回一个页面。真实项目中,后端也可以只返回JSON数据,不返回页面。这就是“接口”常见的形态。

header('Content-Type: application/json'); $result = [ 'code' => 0, 'message' => '注册成功', 'data' => ['id' => 1] ]; echo json_encode($result);

前端拿到JSON后,再用JavaScript渲染页面。这种“后端只给数据,前端负责展示”的模式就是前后端分离。理解它之前,你要先理解表单提交和PHP响应;理解了之后,你才会明白为什么很多JD里写“后端提供接口”。

PHP后端完整教程的终点,不是把语法背完,而是能独立完成一个完整业务闭环。不要急着学的下一件事是复杂算法,先把“注册、登录、留言板”这类带数据库的增删改查做熟练。

8.3 用一个小项目把整条路线串起来

学完之后,一定要自己做一个项目。我建议做一个图书管理系统,哪怕只有四个页面:图书列表、添加图书、编辑图书、删除图书。

这个项目能覆盖所有学过的内容:

  • 前端基础:写表单、跳转列表。
  • MySQL:建图书表、做增删改查。
  • PHP基础:接收参数、处理逻辑。
  • 表单验证:校验书名、作者、ISBN。
  • 正则表达式:校验ISBN或出版年份。

做完这个小项目,再回头去看框架、Composer、命名空间,你会发现很多东西都是在帮你解决已经遇到过的问题。到那个阶段,你才算真正有后端开发的感觉。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询