ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PHP后端入门路线:从表单到MySQL的完整项目实战

PHP后端入门路线:从表单到MySQL的完整项目实战 最近准备系统补一遍 PHP 后端开发知识找到了这套全 6 集的 PHP 后端完整教程覆盖前端基础、MySQL、PHP、表单验证和正则表达式。内容不绕弯直接就是一套能跑通的完整后端小项目链路。这篇文章就把这套学习路线拆开讲清楚包括开发环境怎么搭、每个模块要学到什么程度、代码怎么写、常见问题怎么排查适合打算入门 PHP 后端、或者想做简单管理系统、个人网站后台的开发者参考。教程的核心路线很明确先补齐用得上的前端基础然后装 MySQL、学 SQL再进入 PHP 语法、表单接收、数据库读写最后用表单验证和正则表达式把数据安全边界补上。整个链路学完基本就能独立写一个具备用户注册、登录、数据录入和查询功能的小型 PHP 网站。下面直接进入正文按学习顺序拆解每一集的技术点并给出可复制运行的代码示例。1. 这套 PHP 后端教程的学习路线总览全 6 集的课程结构可以理解为一条完整的“从浏览器请求到数据库落盘”的链路集数核心主题学习目标产出内容第 1 集前端基础HTML/CSS/JavaScript理解浏览器端如何收集用户数据一个带表单的静态页面第 2 集MySQL 安装与建库建表掌握数据库环境搭建和基础 SQL可用的数据库与数据表第 3 集PHP 语法基础与前后端交互理解 PHP 如何接收并处理请求能接收表单数据的 PHP 脚本第 4 集PHP 操作 MySQL使用 PHP 完成数据的增删改查数据能写入数据库并回显第 5 集表单验证掌握服务端参数校验方法不能为空、格式错误会提示第 6 集正则表达式用正则完成复杂格式校验邮箱、手机号、IP 等格式校验这套路线的优点是每一步都有可运行的结果不是讲完概念就结束。你可以一边看课一边复制代码在本地跑最后拼出一个能用的“PHP MySQL 表单数据管理系统”。2. 学习 PHP 后端前要明确的技术边界很多人纠结现在都前后端分离了后端都写 Java、Go 了还有必要学 PHP 吗这个要看场景。PHP 的优势在于快速开发和传统 Web 业务国内大量企业官网、OA 系统、电商后台、内容管理系统仍然跑在 PHP 上。对于个人开发者来说PHP 的上手成本低部署简单一个集成环境就能跑起来适合快速验证想法。搜过 PHP 相关岗位和技术博客就会发现PHP 开源 OA、PHP 图书管理系统、PHP 商城系统这类需求长期存在说明 PHP 在存量系统维护和小型项目中仍然有实际价值。但也要清楚边界PHP 不适合大规模高并发实时系统这类场景更多用 Go、Java 或 Node.js。学 PHP 不等于只学 PHPMySQL 和前端基础是跑不掉的。本教程是“够用即可”的路子不追求把 PHP 框架如 Laravel、ThinkPHP一次学完先把原生 PHP 的请求-响应-数据库链路打通后面再上框架会顺利很多。另外要注意本教程会涉及用户数据录入、网站后台开发数据库里的用户信息属于敏感数据。学习过程中尽量用自己造的测试数据不要拿真实用户信息、手机号、身份证号做练习。后续任何涉及线上部署的项目都需要确认数据来源合法、使用已授权数据并做好访问控制和日志记录。3. 本地开发环境准备3.1 Windows 下使用集成环境最省事的方式是安装一个 PHP 集成环境比如 phpStudy、XAMPP、WAMP 等。这类工具把 Apache/Nginx PHP MySQL 打包在一起一次安装就能启动整套服务。安装完成后确认三个事情Web 服务是否启动浏览器访问http://localhost能看到默认页面。MySQL 服务是否启动能通过 phpMyAdmin 或命令行登录。PHP 版本是否在 7.4 以上推荐 PHP 8.0 或更高版本。教程里通常把项目放在集成环境的网站根目录下例如 XAMPP 是htdocsphpStudy 是WWW。把自己的项目文件夹放进去访问地址就是http://localhost/项目文件夹名/文件名.php3.2 手动安装 MySQL如果不想用集成环境也可以单独安装 MySQL。国内大多数教程会推荐 MySQL Community Server 8.x安装时选择 Developer Default 或 Server only 都可以关键是记住 root 密码。安装完成后验证 MySQL 是否可用mysql -u root -p输入密码后能进入mysql命令行就说明安装成功。也可以使用 Docker 快速启动一个 MySQL 服务方便后期重置环境# 启动一个 MySQL 8.0 容器root 密码设置为 123456 docker run --name php-mysql \ -e MYSQL_ROOT_PASSWORD123456 \ -e MYSQL_DATABASEphp_demo \ -p 3306:3306 \ -d mysql:8.0注意Docker 方式启动的 MySQL容器删除后数据会丢失正式练习时要挂载数据卷。使用 Docker 之前需要先安装 Docker Desktop 并保证运行正常。3.3 开发工具配置编辑器推荐 Visual Studio Code安装以下扩展PHP 语法提示相关扩展MySQL 管理扩展方便直接查看数据表HTML CSS Support写前端页面时有补全建议把项目目录结构固定下来php-study/ ├── index.php ├── register.php ├── login.php ├── db.php └── assets/ ├── css/ └── js/后面所有代码都放在这个目录结构里方便维护。4. 前端基础只学后端用得上的部分第 1 集的前端基础不是让你成为前端工程师而是让你能写出“能向后端提交数据”的页面。重点只有三个表单、超全局变量接收、前端校验。4.1 HTML 表单结构一个最简单的注册表单!DOCTYPE html html langzh-CN head meta charsetUTF-8 title用户注册/title /head body h2用户注册/h2 form actionregister.php methodpost p label用户名/label input typetext nameusername required /p p label密码/label input typepassword namepassword required /p p label邮箱/label input typeemail nameemail required /p p button typesubmit提交注册/button /p /form /body /html这里有两个关键点actionregister.php表示表单提交到register.php这个后端脚本。methodpost表示用 POST 方式提交用户名密码之类的数据不暴露在 URL 上。4.2 CSS 基本定位与布局CSS 在后端开发里主要起“让页面不至于太难看”的作用。不必深入 Flex 和 Grid先把基础盒模型、内边距、外边距、字体大小这几个概念搞清楚。给表单加一点基础样式方便后面测试body { font-family: Microsoft YaHei, sans-serif; max-width: 600px; margin: 40px auto; background: #f7f7f7; } form { background: #fff; padding: 24px; border-radius: 8px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } input { width: 100%; padding: 8px; margin-top: 4px; border: 1px solid #ccc; border-radius: 4px; } button { background: #007bff; color: #fff; border: none; padding: 10px 20px; border-radius: 4px; cursor: pointer; }4.3 JavaScript 的前端校验前端校验的作用是提升用户体验让用户不用等后端返回就能立刻知道哪里填错了。比如实时检查用户名是否为空script document.querySelector(form).addEventListener(submit, function (event) { var username document.querySelector(input[nameusername]).value; if (!username.trim()) { alert(用户名不能为空); event.preventDefault(); } }); /script这里要明确一个安全观念前端校验不能替代后端校验。因为前端的 JavaScript 可以被用户直接绕过恶意用户完全可以手动构造 POST 请求提交非法数据。真正能保障数据安全的是服务端验证。5. PHP 核心语法与表单数据处理5.1 PHP 基本语法PHP 文件以?php开头可以嵌套在 HTML 中。每个变量以$开头语句以分号结束?php $name PHP 后端教程; $price 99; $isOpen true; echo $name; echo \n; var_dump($price); ?常见的数据类型有字符串、整型、浮点型、布尔型、数组、NULL。数组在 PHP 里非常灵活?php // 索引数组 $colors [red, green, blue]; // 关联数组 $user [ username admin, email adminexample.com ]; echo $user[username]; ?5.2 使用超全局变量接收表单数据PHP 内置了多个超全局变量表单处理最常用的是$_GET和$_POST。$_POST能拿到methodpost提交的数据$_GET能拿到 URL 问号后面的参数。在register.php中接收上一节提交的表单数据?php // 判断是否是 POST 请求 if ($_SERVER[REQUEST_METHOD] POST) { $username $_POST[username] ?? ; $password $_POST[password] ?? ; $email $_POST[email] ?? ; echo 接收到的用户名 . htmlspecialchars($username) . br; echo 接收到的邮箱 . htmlspecialchars($email) . br; } ?注意??空合并运算符的用法。如果请求里没有这个字段?? 会返回空字符串避免 PHP 报“未定义数组键名”的警告。htmlspecialchars()是防 XSS 的基本操作它会将、等字符转为 HTML 实体避免用户输入的内容被浏览器当成脚本执行。输出用户数据时一定不要省略这一步。5.3 理解 POST 与 GET 的区别初学者必须把这两个请求方式彻底弄明白对比项GETPOST数据位置URL 查询参数请求体是否可见可见会出现在历史记录不可见数据长度有限制较大典型场景搜索、翻页、拉取数据注册、登录、提交表单在后续接口开发中RESTful 风格还会用到 PUT、DELETE 等请求方法但 PHP 原生环境只接收 GET 和 POST其他方法通常在框架层解析。6. MySQL 建库建表与数据操作6.1 创建数据库和数据表进入 MySQL 命令行创建了一个名叫php_demo的数据库CREATE DATABASE IF NOT EXISTS php_demo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE php_demo;utf8mb4是必须的否则中文和一些特殊符号如 emoji可能存不进去。创建一个用户表CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, email VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );这个表的字段对应前面表单里的用户名、密码、邮箱。password用VARCHAR(255)是为了给后面的密码哈希预留空间千万不要直接用VARCHAR(32)这样的长度因为password_hash()函数生成的哈希字符串通常有 60 个字符以上。6.2 使用 SQL 完成增删改查基础 SQL 必须熟练。以下四类操作是后端开发里最常用的-- 插入数据 INSERT INTO users (username, password, email) VALUES (admin, hashed_password, adminexample.com); -- 查询数据 SELECT id, username, email FROM users WHERE username admin; -- 更新数据 UPDATE users SET email new_emailexample.com WHERE username admin; -- 删除数据 DELETE FROM users WHERE username admin;学习时建议把每一条 SQL 的语法结构拆开记INSERT INTO 表名 (列名) VALUES (值)SELECT 列名 FROM 表名 WHERE 条件。条件语句里的,,,AND,OR这些比较运算符也得熟悉。6.3 使用 PHP 连接 MySQLPHP 连接 MySQL 有两种方式mysqli和PDO。个人建议直接学 PDO因为 PDO 支持多种数据库并且用预处理语句能有效防止 SQL 注入。创建一个db.php作为数据库连接文件后面所有脚本都引入它?php // db.php $host 127.0.0.1; $dbname php_demo; $username root; $password 123456; try { $pdo new PDO( mysql:host$host;dbname$dbname;charsetutf8mb4, $username, $password, [ PDO::ATTR_ERRMODE PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE PDO::FETCH_ASSOC, ] ); } catch (PDOException $e) { die(数据库连接失败 . $e-getMessage()); } ?如果使用集成环境root 密码通常也是root或者空具体以安装时设置的为准。密码不同只需修改$password一个变量。7. 表单验证完整实现表单验证是教程的核心部分面试和实际项目里都绕不开。验证分两个层次合法性验证数据不能为空、长度要符合要求和格式验证邮箱格式、手机号格式等。7.1 后端表单验证代码在register.php里完成一套完整的后端验证流程?php require db.php; $errors []; $oldInput []; if ($_SERVER[REQUEST_METHOD] POST) { $username trim($_POST[username] ?? ); $password $_POST[password] ?? ; $password2 $_POST[password2] ?? ; $email trim($_POST[email] ?? ); $oldInput [ username $username, email $email ]; // 1. 用户名不能为空 if ($username ) { $errors[username] 用户名不能为空; } elseif (mb_strlen($username) 3 || mb_strlen($username) 20) { $errors[username] 用户名长度必须在 3 到 20 个字符之间; } // 2. 密码不能为空长度至少 6 位 if ($password ) { $errors[password] 密码不能为空; } elseif (strlen($password) 6) { $errors[password] 密码长度至少 6 位; } // 3. 确认密码要一致 if ($password ! $password2) { $errors[password2] 两次输入的密码不一致; } // 4. 邮箱不能为空且要符合格式 if ($email ) { $errors[email] 邮箱不能为空; } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[email] 邮箱格式不正确; } // 5. 如果没有任何错误才写入数据库 if (empty($errors)) { $hashedPassword password_hash($password, PASSWORD_DEFAULT); $stmt $pdo-prepare(INSERT INTO users (username, password, email) VALUES (?, ?, ?)); $stmt-execute([$username, $hashedPassword, $email]); header(Location: success.php); exit; } } ?这段代码演示了完整的“接收参数 - 逐项校验 - 通过后入库”流程其中trim()清除用户名、邮箱首尾空格。mb_strlen()按中文字符长度计算。password_hash()生成安全的密码哈希不能直接存明文密码。prepare()execute()使用预处理语句防止 SQL 注入。7.2 错误信息回显验证失败时要把错误信息返回到表单页面并且保留用户之前填的内容不然每次验证失败都清空表单体验很差。form actionregister.php methodpost p label用户名/label input typetext nameusername value?php echo htmlspecialchars($oldInput[username] ?? ); ? ?php if (isset($errors[username])): ? span stylecolor: red;?php echo $errors[username]; ?/span ?php endif; ? /p !-- 其他字段类似 -- /form这里注意PHP 和 HTML 混写时会大量使用?php echo htmlspecialchars(...) ?这种语法。初学者容易忘记htmlspecialchars这会导致用户输入的内容以原始 HTML 形式输出产生 XSS 漏洞。8. 正则表达式基础与 PHP 实战第 6 集的正则表达式是重点也是很多人觉得“难”的部分。正则本身的规则就那几个关键在于多练习。8.1 常用正则语法速查元字符含义示例^匹配开头^php匹配以 php 开头$匹配结尾php$匹配以 php 结尾.匹配除换行符外任意字符h.t匹配 hat、hit*前一个字符出现 0 次或多次ab*c匹配 ac、abc、abbc前一个字符出现 1 次或多次abc匹配 abc、abbc?前一个字符出现 0 次或 1 次ab?c匹配 ac、abc\d匹配数字\d{11}匹配 11 位数字\w匹配字母、数字、下划线\w[]字符集合[a-zA-Z0-9]()分组(php{}指定次数\d{6}匹配 6 位数字正则容易写错的地方是边界和贪婪匹配。默认情况下*和是贪婪的会尽量匹配更多字符。如果需要非贪婪在后面加?例如.?。8.2 PHP 正则函数PHP 提供两套正则函数PCRE 风格使用/ /包裹正则表达式。?php // preg_match: 检查是否匹配返回 1 或 0 $pattern /^\w\w\.\w$/; $email testexample.com; if (preg_match($pattern, $email)) { echo 邮箱格式正确; } else { echo 邮箱格式错误; } // preg_match_all: 提取所有匹配内容 $text 我的手机号是 13812345678备用手机号 13987654321; preg_match_all(/1[3-9]\d{9}/, $text, $matches); print_r($matches[0]); ?preg_match适合做格式校验preg_match_all适合从一段文本中批量提取内容后者的括号分组可以很方便地取出关键部分。8.3 正则实战校验手机号、IP 地址下面给出两个很常见的校验场景。手机号校验中国大陆手机号简单判断为 1 开头第 2 位是 3-9后面 9 位数字。?php function isValidPhone($phone) { return preg_match(/^1[3-9]\d{9}$/, $phone) 1; } var_dump(isValidPhone(13812345678)); // true var_dump(isValidPhone(12812345678)); // false ?IP 地址校验IPv4 每个段是 0 到 255正则写法如下?php function isValidIpv4($ip) { $pattern /^((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/; return preg_match($pattern, $ip) 1; } var_dump(isValidIpv4(192.168.1.1)); // true var_dump(isValidIpv4(256.168.1.1)); // false256 超出范围 ?这段正则的写法要点是把 0-255 拆成三类25[0-5]匹配 250-2552[0-4]\d匹配 200-2491\d\d匹配 100-199[1-9]?\d匹配 0-99。这是综合运用字符类、分组和量词的典型例子。9. PHP 后端接口 API 与前后端交互完成表单和数据库操作后可以再往前一步理解接口。现代开发中前端和后端很多时候是分离的前端网页只负责展示后端 PHP 脚本通过接口返回 JSON 数据。9.1 接口是什么接口本质上是后端提供的一个 URL 地址。前端发送请求到这个地址后端处理完业务逻辑后返回固定格式的数据通常是 JSON。这跟表单提交的区别是表单提交返回的是整个 HTML 页面接口返回的是结构化数据。9.2 用 PHP 返回 JSON 数据创建一个api.php模拟用户查询接口?php header(Content-Type: application/json; charsetutf-8); // 处理 GET 请求 if ($_SERVER[REQUEST_METHOD] GET) { $username $_GET[username] ?? ; $data [ code 0, message success, data [ username $username, role admin, email adminexample.com, ] ]; echo json_encode($data, JSON_UNESCAPED_UNICODE); exit; } ?访问http://localhost/项目目录/api.php?usernameadmin浏览器会返回{ code: 0, message: success, data: { username: admin, role: admin, email: adminexample.com } }统一规定返回结构比如 code 0 代表成功非 0 代表失败是接口开发的基本规范。这样即使前端换了人只要接口结构不变页面就还能正常对接。9.3 前端用 fetch 调用接口有了接口之后前端就可以用 JavaScript 的fetch或axios请求数据script fetch(api.php?usernameadmin) .then(function (response) { return response.json(); }) .then(function (res) { if (res.code 0) { console.log(用户信息, res.data); } else { console.error(接口错误, res.message); } }) .catch(function (err) { console.error(请求失败, err); }); /script跨域是常见问题。如果你用 IP 或域名访问页面但接口地址用的是localhost就会出现跨域报错。本地开发最简单的处理方式是在接口脚本头部加上允许跨域的响应头header(Access-Control-Allow-Origin: *); header(Access-Control-Allow-Methods: GET, POST, OPTIONS);注意*表示允许所有域名访问仅限本地测试使用。线上部署必须改成具体的域名否则任何人都能调用你的接口会造成数据泄露风险。10. SQL 注入与安全防护10.1 常见的攻击方式学习 PHP 与 MySQL 联动后必须立刻学习 SQL 注入防护。原因很简单一旦 SQL 语句里拼接了用户输入的内容攻击者就可以通过构造特殊字符串改变 SQL 执行逻辑。下面这段不安全代码是反面教材?php // 不安全写法直接拼接用户输入 $username $_POST[username]; $sql SELECT * FROM users WHERE username $username; // 如果用户输入admin OR 11 // 实际执行的是SELECT * FROM users WHERE username admin OR 11 // 这条语句会返回所有用户数据 ?防 SQL 注入的推荐方式是 PDO 预处理语句?php $stmt $pdo-prepare(SELECT * FROM users WHERE username ?); $stmt-execute([$username]); $user $stmt-fetch(); if ($user) { // 说明用户存在 } ?预处理语句把 SQL 结构和参数值分离开数据库引擎会先编译 SQL再绑定参数参数只会被当作字符串值处理不会影响 SQL 结构。10.2 密码加密存储明文密码是另一个会被直接点名的安全问题。直接在数据表里存明文密码一旦数据库泄露所有用户账号都会暴露。正确的做法是使用password_hash()加密用password_verify()验证?php // 注册时加密 $hashed password_hash($_POST[password], PASSWORD_DEFAULT); // 登录时验证 $inputPassword $_POST[password]; $storedHash $user[password]; if (password_verify($inputPassword, $storedHash)) { echo 密码正确登录成功; } else { echo 密码错误; } ?PASSWORD_DEFAULT会自动选择合适的哈希算法将来 PHP 更新算法时也能兼容旧哈希不需要手动调整。10.3 XSS 防护输出用户提交的数据之前一定要用htmlspecialchars()转义。举一个最容易踩坑的场景?php // 用户评论内容可能包含 // scriptalert(xss)/script // 正确输出方式 echo htmlspecialchars($comment, ENT_QUOTES, UTF-8); ?加上htmlspecialchars后浏览器会把和显示为实体字符脚本不会被执行。这套 PHP 后端开发教程里多次强调数据转换与表单验证本质上就是在补这些安全边界。11. PHP 后端开发常见问题与排查方法下面把本地学习过程中最容易遇到的问题整理成一张排查表问题现象可能原因排查方式解决方案浏览器访问 PHP 文件变成下载没有装 PHP 执行环境或 Web 服务未启动确认 Apache/Nginx 是否运行启动集成环境表单提交后没有反应action 路径写错或 PHP 语法错误查看浏览器 Network 面板检查 HTTP 状态码修改 action 为正确的 PHP 文件名页面报 500 错误PHP 语法错误或数据库连接失败开启 PHP 错误显示查看错误日志修复语法错误检查 db.php 配置数据库连接报错主机名、账号、密码不匹配用命令行尝试连接 MySQL核对 db.php 里的参数MySQL 中文乱码数据库字符集不是 utf8mb4查看表字符集设置建库时指定 DEFAULT CHARACTER SET utf8mb4数据写入成功但页面显示不了输出时没有 htmlspecialchars 或查询条件不对打印 SQL 结果调试检查 SQL 和输出逻辑表单数据重复提交没有做重定向入库成功后使用 header(Location: ...)使用 PRG 模式PHP 版本太旧集成环境版本较低检查php -v升级到 PHP 8.0 以上Windows 端口被占用80 端口或 3306 端口被其他程序占用使用 netstat 查看端口修改 Apache/Nginx 或 MySQL 的端口配置上传文件时提示权限不足项目目录没有写入权限检查目录权限Windows 下给目录赋写权限排查问题时一个实用的思路是先看日志再测分步。把 PHP 的错误显示打开能看到脚本执行时中断在哪一行?php error_reporting(E_ALL); ini_set(display_errors, 1); ?开发阶段这样配置没问题线上环境不要开启错误显示而是用error_log()记录到日志文件避免把服务器路径和数据库结构暴露给用户。12. PHP 后端学习的最佳实践与建议把这套教程学完之后建议按下面的方法巩固能比单纯看视频多记住很多东西第一次接触 PHP 和 MySQL就把教程里的例子全部亲手敲一遍。复制粘贴代码和亲手敲代码的记忆深度完全不一样尤其是$符号、分号、数组操作这些细节只有敲错了、报错了、修好了才能形成印象。保留一套最小可运行的项目目录。把db.php、register.php、success.php这个最小闭环备份好以后学 Laravel、ThinkPHP 或者做其他项目时可以对照这套代码理解框架里“路由”、“控制器”到底是做什么的。学习过程中养成写日志的习惯。在几个关键节点插入error_log()或var_dump()比如?php $stmt $pdo-prepare(SELECT * FROM users WHERE email ?); $stmt-execute([$email]); $user $stmt-fetch(); if (!$user) { error_log(用户不存在邮箱 . $email, 3, ./logs/app.log); echo 用户不存在; exit; } ?这样排查问题会快很多。批量处理数据时也建议给每条数据记录处理结果失败的重试逻辑要单独考虑。关于 PHP 内置 web server本地做小功能测试时可以不用配 Apache直接用命令启动cd /d D:\php-study php -S localhost:8000接着访问http://localhost:8000/register.php就能测试。这种方式适合快速验证单个 PHP 脚本但生产环境仍然推荐使用 Apache/Nginx。学到数据库部分的同学如果想加深理解可以自己做一个 PHP 图书管理系统或 PHP 开源 OA 的练习项目这些都是非常适合练手的经典场景。练手时可以关注几个点登录注册的权限设计、列表分页、关键词搜索、用户输入的安全过滤。能把这几个功能独立写出来再回去看 PHP 框架会发现框架里的很多东西都在做相同的事情只是封装得更完善了。这套全 6 集的 PHP 后端教程提供了一条从零开始的完整路径核心价值不是教你背语法而是把“前端表单 - 后端接收 - 数据库存储 - 数据校验”这条链路串通。看完之后先别急着追新框架用原生 PHP 把注册登录、数据管理这类功能完整写一遍再进入框架学习阶段会理解得扎实很多。
返回列表