通过 20 个彼此独立、可以单独运行的 PHP 小实验,系统理解 PHP 从基础语法到表单、文件、Session、Cookie、PDO、SQLite、CRUD、搜索分页、JSON API,再到完整迷你项目的核心开发流程。
本仓库的目标不是提供一个大型框架项目,而是把 PHP 开发中最常见、最值得掌握的知识拆成 20 个最小实验单元。
每个实验都尽量只解决一个核心问题,并在自己的目录中提供独立的 README.md,便于逐章运行、修改、验证和复习。
这个仓库适合用于:
- 系统学习 PHP 基础语法与 Web 开发流程
- 理解 HTML 表单与 PHP 后端之间的数据传递
- 学习文件、JSON、Session、Cookie 等常见数据保存方式
- 掌握 PDO 与 SQLite 的基础数据库操作
- 理解 CRUD、预处理语句、搜索、排序、分页等后台开发核心能力
- 建立从“单个 PHP 文件”到“多文件小型应用”的完整认知
- 作为以后开发 WordPress、WooCommerce、企业网站后台或 PHP 小工具时的代码参考库
本项目以 学习、实验、理解原理 为第一目标,不追求框架化,也不过早引入 Composer、MVC 框架、ORM 或复杂工程工具。
整个仓库可以分成 4 个阶段:
阶段 1:PHP 基础能力
01 → 02 → 03 → 04 → 05 → 06
阶段 2:Web 请求、表单与状态
07 → 08 → 09 → 10 → 11 → 12 → 13 → 14
阶段 3:数据库与数据应用
15 → 16 → 17 → 18 → 19
阶段 4:综合实战
20
也可以把它理解为一条逐步升级的数据处理链:
变量
↓
数组
↓
条件与循环
↓
函数与模块化
↓
GET / POST
↓
验证与安全输出
↓
文本 / JSON
↓
Session / Cookie
↓
文件上传
↓
PDO + SQLite
↓
CRUD
↓
预处理语句
↓
搜索 / 排序 / 分页
↓
JSON API
↓
完整 PHP 小应用
| # | 目录 | 实验主题 | 核心知识 |
|---|---|---|---|
| 01 | 01-php-basics |
PHP 基础输出、变量与数据类型 | echo、变量、字符串、数字、布尔值、类型 |
| 02 | 02-php-array |
PHP 数组与数据遍历 | 索引数组、关联数组、多维数组、数组读取 |
| 03 | 03-php-condition |
PHP 条件判断与状态显示 | if、elseif、比较运算、业务状态 |
| 04 | 04-php-loop |
PHP 循环生成 HTML | for、while、foreach、动态页面输出 |
| 05 | 05-php-function |
PHP 自定义函数与参数 | 函数、参数、返回值、类型声明、代码复用 |
| 06 | 06-php-include |
PHP 页面模块化 | include、require、公共头尾、配置与函数文件 |
| 07 | 07-php-get |
GET 参数读取 | $_GET、查询字符串、搜索参数、安全输出 |
| 08 | 08-php-post |
POST 表单提交 | $_POST、请求方法、表单提交、数据回显 |
| 09 | 09-php-form-validation |
表单验证与安全输出 | 必填验证、邮箱验证、长度验证、htmlspecialchars() |
| 10 | 10-php-file |
文本文件读取与写入 | file_get_contents()、file_put_contents()、追加、文件锁 |
| 11 | 11-php-json |
JSON 数据读取与保存 | json_encode()、json_decode()、结构化文件存储 |
| 12 | 12-php-session |
Session 登录状态 | session_start()、$_SESSION、Session ID、退出登录 |
| 13 | 13-php-cookie |
Cookie 与用户偏好 | setcookie()、$_COOKIE、有效期、删除 Cookie |
| 14 | 14-php-file-upload |
PHP 文件上传 | $_FILES、MIME、finfo、图片验证、随机文件名 |
| 15 | 15-pdo-sqlite |
PDO + SQLite | PDO、DSN、建表、初始化数据、查询数据 |
| 16 | 16-php-sqlite-crud |
SQLite CRUD | Create、Read、Update、Delete、多页面数据管理 |
| 17 | 17-pdo-prepared-statements |
PDO 预处理与安全查询 | prepare()、execute()、参数绑定、SQL 注入防护基础 |
| 18 | 18-php-search-sort-pagination |
搜索、排序与分页 | WHERE、ORDER BY、LIMIT、OFFSET、COUNT(*) |
| 19 | 19-php-json-api |
PHP JSON API | JSON Response、HTTP 状态码、前后端数据接口 |
| 20 | 20-php-mini-notes |
Mini Notes 综合项目 | CRUD、搜索、分页、PDO、SQLite、模块化、小型应用结构 |
每个目录都包含自己的 README.md,建议学习时进入对应目录查看该实验的详细说明。
php-development-lab/
│
├── README.md
│
├── 01-php-basics/
├── 02-php-array/
├── 03-php-condition/
├── 04-php-loop/
├── 05-php-function/
├── 06-php-include/
├── 07-php-get/
├── 08-php-post/
├── 09-php-form-validation/
├── 10-php-file/
├── 11-php-json/
├── 12-php-session/
├── 13-php-cookie/
├── 14-php-file-upload/
├── 15-pdo-sqlite/
├── 16-php-sqlite-crud/
├── 17-pdo-prepared-statements/
├── 18-php-search-sort-pagination/
├── 19-php-json-api/
└── 20-php-mini-notes/
前面的实验多数采用单文件形式,后面的实验逐渐拆分为:
index.php
create.php
edit.php
delete.php
includes/
database/
api/
这种变化本身就是学习内容之一:
从“先把 PHP 写出来”,逐渐过渡到“开始组织一个可维护的小型 PHP 应用”。
推荐环境:
PHP 8.1+
之所以建议 PHP 8.1 或更高版本,是因为部分实验使用了现代 PHP 语法和类型声明。
通常使用 PHP 默认扩展即可运行。
实验 09 对 mbstring 做了兼容处理:
有 mbstring
→ 使用 mb_strlen()
没有 mbstring
→ 自动退回 strlen()
因此不会因为服务器未启用 mbstring 而直接产生 Fatal Error。
文件上传实验需要:
fileinfo
代码通过 finfo 检查真实 MIME 类型,而不是只相信上传文件的扩展名。
数据库实验必须启用:
PDO
pdo_sqlite
可以通过下面的命令检查:
php -m正常情况下应该能够看到:
PDO
pdo_sqlite
如果没有启用 pdo_sqlite,数据库实验会显示数据库连接错误提示。
进入仓库根目录:
cd php-development-lab启动服务器:
php -S localhost:8000然后在浏览器访问:
http://localhost:8000/01-php-basics/
其他实验只需要修改目录名:
http://localhost:8000/09-php-form-validation/
http://localhost:8000/16-php-sqlite-crud/
http://localhost:8000/20-php-mini-notes/
停止服务器:
Ctrl + C
也可以把整个仓库复制到本地 Web 根目录,例如 XAMPP:
C:\xampp\htdocs\php-development-lab\
然后访问:
http://localhost/php-development-lab/01-php-basics/
这种方式比较适合希望通过浏览器长期逐章测试 PHP 的学习环境。
这个仓库非常适合上传到 GitHub 保存源码、记录版本和复习知识。
但是需要注意:
GitHub Pages 只能托管静态页面,不能直接执行 PHP。
因此:
GitHub
→ 可以保存和展示源码
GitHub Pages
→ 不能直接运行这些 PHP 实验
如果需要真正运行 PHP,应使用:
- 本地 PHP 开发服务器
- XAMPP / WAMP / MAMP
- 支持 PHP 的虚拟主机
- VPS / Linux Web Server
部分实验会向服务器写入数据。
需要确保下面这些目录或文件具有 PHP 可写权限:
10-php-file/data/
11-php-json/data/
14-php-file-upload/uploads/
15-pdo-sqlite/database/
16-php-sqlite-crud/database/
17-pdo-prepared-statements/database/
18-php-search-sort-pagination/database/
19-php-json-api/database/
20-php-mini-notes/database/
如果页面可以打开,但出现:
写入失败
保存失败
数据库无法写入
优先检查目录权限和 PHP 扩展,而不是先修改业务代码。
这个仓库最适合“运行 → 修改 → 观察结果”的方式,而不是只阅读源码。
建议每个实验都完成下面 5 个动作:
1. 先运行原始代码
2. 阅读本章 README
3. 找到本章最核心的 PHP 代码
4. 主动修改变量、参数或条件
5. 再观察页面和数据发生了什么变化
例如学习 GET 时,不要只看:
$_GET['keyword']而是实际修改浏览器地址:
?keyword=WPC
?keyword=Decking
?keyword=Wall
学习 CRUD 时,也不要只看 SQL,而应该实际完成:
新增一条
→ 编辑
→ 搜索
→ 删除
→ 再观察数据库和页面变化
这种方式更容易真正建立 PHP 的执行模型。
完成 20 个实验后,最重要的不是记住所有函数,而是理解下面几条开发链路。
浏览器请求
↓
Web Server
↓
PHP 执行
↓
读取 / 处理数据
↓
生成 HTML 或 JSON
↓
返回浏览器
HTML Form
↓
GET / POST
↓
PHP 获取数据
↓
验证数据
↓
处理业务逻辑
↓
安全输出结果
内存变量
↓
文本文件
↓
JSON
↓
SQLite
↓
数据库 CRUD
用户输入
↓
验证 / 白名单
↓
PDO prepare()
↓
参数绑定
↓
执行 SQL
↓
fetch / fetchAll
↓
安全输出
列表页
↓
新增
↓
编辑
↓
删除
↓
搜索
↓
分页
↓
公共 functions / includes
↓
数据库
实验 20 就是前面这些知识第一次真正组合到一起。
本仓库已经在学习范围内演示了一些重要安全习惯:
- 使用
htmlspecialchars()对动态 HTML 输出进行转义 - 使用
filter_var()验证邮箱 - 使用
filter_input()处理部分输入参数 - 使用 PDO Prepared Statements 分离 SQL 与用户输入
- 对动态排序字段使用白名单
- 文件上传通过真实 MIME 类型检查
- 上传文件使用随机文件名
- Session 登录后重新生成 Session ID
- Cookie 使用
HttpOnly和SameSite=Lax - 删除操作使用
POST而不是简单 GET 链接
但这些代码仍然是学习实验,不等同于生产级应用。
如果未来真正部署为公开网站,还应该继续增加:
CSRF Token
身份认证与权限控制
更严格的输入长度限制
统一错误日志
生产环境异常隐藏
数据库文件访问保护
上传目录执行权限限制
请求频率限制
安全响应头
特别需要注意:本项目中的 data/、database/、uploads/ 目录是为了方便学习而保留的简单结构。
不要直接在这些实验中保存密码、API Key、客户资料或其他敏感数据。
本项目后半部分选择 SQLite,而不是直接使用 MySQL,主要是为了降低学习成本。
SQLite 的特点:
无需单独启动数据库服务器
↓
一个 .db 文件就是一个数据库
↓
仍然可以学习表、SQL、PDO、CRUD、分页和查询
因此特别适合:
- PHP 入门
- 本地工具
- 小型管理页面
- 原型开发
- 私有后台工具
- 学习 PDO
当这些知识完全理解以后,再切换到 MySQL,核心思路基本不需要推翻,只需要重点学习数据库连接配置、字段类型、索引、并发和服务器管理等内容。
完成本仓库以后,可以继续沿着当前体系自然扩展,而不需要马上进入复杂框架。
推荐方向:
01. CSRF Token
02. 用户注册与密码哈希
03. Login / Logout 完整认证
04. SQLite 表关联
05. MySQL + PDO
06. 数据库事务 Transaction
07. 文件下载
08. Ajax + Fetch + PHP API
09. REST 风格 API
10. 后台管理页面
11. PHP Router
12. 简单 MVC
13. Composer 与自动加载
14. WordPress 数据处理
15. WooCommerce 数据处理
其中比较推荐的下一阶段是:
原生 PHP + PDO + MySQL
↓
Ajax / Fetch + PHP JSON API
↓
简单 Router / MVC
↓
再重新理解 WordPress / WooCommerce 的 PHP 架构
这样会比一开始直接学习大型框架更容易建立底层认知。
本仓库在整理阶段进行了以下检查:
- 20 个实验目录完整
- 40 个 PHP 文件全部通过 PHP 语法检查
- 基础页面加载正常
- GET 搜索功能测试正常
- POST 表单提交测试正常
- HTML 特殊字符转义测试正常
- 表单验证测试正常
- 文本文件写入与读取测试正常
- JSON 保存与读取测试正常
- Session 登录 / 退出流程测试正常
- Cookie 保存 / 删除测试正常
- 图片上传及非法 MIME 拦截测试正常
- 6 个 SQLite 数据库文件完整性检查正常
- SQLite 表结构与示例数据检查正常
- 数据库驱动缺失时具有明确错误提示
同时修复了实验 09 在未安装 mbstring 的 PHP 环境中调用 mb_strlen() 可能产生 Fatal Error 的兼容性问题。
这套实验始终遵循几个原则:
避免为了“看起来功能更多”而让示例失去重点。
框架最终仍然建立在:
请求
数据
函数
对象
数据库
Session
Cookie
文件
HTTP
这些基础能力之上。
实验代码不是只能看的 Demo,而是应该可以不断被改坏、修复、扩展和重新运行。
前 19 章学习“零件”,第 20 章第一次把这些零件组合成一个完整的小应用。
本项目主要用于个人学习、PHP 技术研究和代码实验。
如果需要公开发布,可以根据自己的仓库计划补充合适的开源 License。
如果能够真正理解这 20 个实验之间的关系,那么 PHP 就不再只是零散的:
变量
数组
函数
SQL
而会形成一个完整的 Web 开发模型:
浏览器请求
→ PHP 接收
→ 验证数据
→ 执行业务逻辑
→ 读取或保存数据
→ 生成 HTML / JSON
→ 返回浏览器
这也是本仓库最重要的学习目标。