# PHP学习 **Repository Path**: teacherPan/php-study ## Basic Information - **Project Name**: PHP学习 - **Description**: PHP学习 - **Primary Language**: PHP - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-12-25 - **Last Updated**: 2023-12-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PHP视频教程 http://nas.yunzhi.club:5010/sharing/xVvdIKX5j # 第一章 ## 1.0 在MacOS中安装基于Docker的Apache和PHP环境 00:32 安装Docker
02:33 下载Gitee教程代码
04:00 启动Docker
08:40 输入localhost:8111访问HelloPHP页面
10:20 新建index.php文件,Hello World
13:27 知识点:phpinfo()
## 1.0 在Windows中安装基于XAMPP的Apache和PHP环境 00:16 下载XAMPP(版本5.6.21)
06:02 知识点:UAC(用户账户控制)
07:27 安装XAMPP
11:00 启动Apache,解决端口占用问题
13:58 知识点:端口、域名
16:31 新建php文件,Hello World
## 1.1 登录原型(Windows) 01:27 知识点:Bootstrap
04:00 在MacOS环境启动Docker
04:43 在Windows环境启动XAMPP
06:23 引入Bootstrap
13:02 知识点:容器container
22:39 知识点:border
## 1.2 模拟登录(Windows) 00:54 下载教程文件
03:30 知识点:HTML\
标签
06:20 知识点:HTTP提交数据的方式——POST和GET
14:40 知识点:我们是如何访问到服务器的
18:20 知识点:$\_POST变量
22:00 模拟登录
26:00 知识点:PHP页面跳转方法
## 1.3 session 00:20 下载教程文件
04:39 知识点:PHP Session
08:38 使用Session
17:39 Bootstrap Button
## 1.4 phpMyAdmin(MacOS) 00:20 下载教程文件
01:22 启动Docker
03:03 修改配置文件config.inc.php,允许空密码登录
04:06 修改配置文件config.inc.php,将localhost改为MySQL.5.6
05:45 新建数据库、新建数据表
## 1.4 phpMyAdmin(Windows) 00:16 下载教程文件
01:06 下载phpMyAdmin
02:13 安装phpMyAdmin
04:30 启动XAMPP
05:20 知识点:增加isset()空值判断,解决代码引发的Notice提示
07:36 修改配置文件php.ini,关闭Notice提示
10:07 修改配置文件config.inc.php,允许空密码登录
11:58 新建数据库、新建数据表
## 1.5 数据库连接 00:10 下载教程文件
02:07 MySQL连接数据库(MySQLi、PDO)
03:00 知识点:phpinfo()
04:00 使用PDO连接数据库
## 1.6 用户名密码登录 00:16 下载教程文件
01:30 Windows中修改配置文件hosts,解决域名不统一问题
03:30 知识点:主机名
05:02 导入.sql文件到数据库中
05:22 重构代码
11:13 知识点:使用PDO判断用户名密码是否正确
15:00 Windows中解决var_dump()格式问题
25:03 知识点:PHP数组获取长度
31:28 测试登录功能
## 1.7 面向对象 00:10 下载教程文件,启动项目,导入SQL
02:22 用面向对象思想重构代码
# 第二章 ## 第一部分:用户列表 ### 2.0.0 用户列表原型 00:20 下载教程文件,启动项目,导入SQL
01:16 重构代码,去掉重复的轮子
02:52 知识点:HTTP无状态性
04:17 知识点:引入其他PHP文件
06:49 动态的网页标签名
10:17 分离CSS、JS文件并重新引入
11:25 知识点:Chrome开启禁用缓存功能
12:50 开始开发用户列表
15:35 知识点:如何学习Bootstrap——每天看看
18:14 知识点:container容器和行列布局
20:40 修改table表格的内容
22:52 知识点:分页
29:40 新增、修改、删除按钮
33:33 form表单、input输入框、查找按钮
36:58 nav导航条
42:01 注销按钮
### 2.0.1 查询所有用户 00:20 下载教程代码、启动环境、导入SQL
02:43 findAll()方法,获取所有数据
06:02 解决XAMPP中文字符变成问号的问题
06:47 分析数组构成,foreach遍历每个用户
18:42 知识点:三目运算符判断
### 2.0.2 初识分页 00:09 下载教程代码、启动环境、导入SQL
01:20 编写分页page()方法
02:38 知识点:使用phpMyAdmin测试SQL语法是否正确
04:47 构造page和size,实现分页查询
08:33 GET方式实现动态分页
### 2.0.3 分页对象 00:10 下载教程代码、启动环境、导入SQL
01:50 用page对象重构已有功能
03:50 知识点:include_once()
06:32 实现上一页、下一页功能
11:09 知识点:使用phpMyAdmin测试SQL语法是否正确
15:20 计算总页数
16:00 知识点:PHP向上去整
18:40 知识点:字符串拼接
19:40 知识点:变量污染及如何debug
22:30 解决XAMPP中不生效的问题
23:58 解决序号问题
26:29 知识点:构造函数 __construct()
30:55 active点亮效果
### 2.0.4 综合查询 00:27 下载教程代码、启动环境
01:00 编写查询功能
07:12 知识点:SQL where查询
14:14 知识点:PHP数组长度--count() sizeof()
26:58 自动填写查询信息
32:31 知识点: SQL like模糊查询
39:20 查询时增加页号page
### 2.0.5 组件化 00:15 下载教程代码、启动环境
01:05 用组件化思想重构代码
03:50 增加权限管理
06:47 知识点:header和body
10:11 知识点:http状态码302和404
13:02 重构header,分离引用和执行环节
22:15 实现退出按钮
24:06 勘误:container写错了,应找到第一个错误的位置打上字幕
25:36 解决active样式问题
27:00 知识点:$_Server查看服务器参数
29:35 重构nav组件,分离引用和执行环节
## 第二部分:增加用户 ### 2.1.0 新增用户 00:40 实现新增按钮
01:20 实现”新增“页面
08:28 知识点:Bootstrap选择按钮radio和select
11:42 知识点:radio分组(卡带式收音机)
12:20 保存按钮
17:25 save组件原型
### 2.1.1 功能开发 00:10 下载教程代码、启动环境、导入SQL
01:10 查看POST数据
02:04 获取变量
03:15 向数据中插入数据
05:12 知识点:PDO方式插入数据
07:42 知识点:PDO错误提示功能
09:14 知识点:MySQL 1054 1364
12:10 整理代码
13:25 在保存失败时输出错误信息,成功时跳转
15:46 新插入的数据放在第一行
知识点:order by desc
### 2.1.2 JavaScript校验 00:10 下载教程代码、启动环境
01:13 解决不填字段也不报错的bug
01:50 知识点:bootstrap提示信息
03:43 知识点:JavaScript和PHP代码执行阶段的区别
06:38 知识点:浏览器兼容性
07:50 知识点:JavaScript submit事件
10:17 知识点:阻止表单提交
11:59 知识点:CSS选择器
14:58 知识点:HTMLInputElement
15:18 使用JavaScript判断name是否为空值
16:46 知识点:HTMLDivElement
18:37 知识点:CSS display样式
21:52 知识点:HTML.innerText
25:51 知识点:HTML获取radio选中情况
### 2.1.3 友好跳转 00:45 知识点:SweetAlert友好的警告框
02:43 使用SweetAlert
08:47 知识点:JavaScript回调函数
09:25 实现操作成功
知识点:JavaScript跳转URL
10:00 实现操作失败
11:07 if -- else -- endif结构
13:14 知识点:操作失败回跳 history.back
13:54 增加失败的提示信息
## 第三部分 删除用户 ### 2.2.0 删除用户 00:12 下载教程代码、启动环境、导入SQL
01:34 删除链接跳转
04:02 实现删除方法
09:30 知识点:delete没有删除数据也不会报异常
11:07 实现成功和失败时的弹窗
13:18 展示bug
16:52 传入页号参数,解决删除后回到第一页的问题
知识点:$_SERVER
### 2.2.1 Alert组件 00:45 下载教程代码、启动环境、导入SQL
01:24 重构代码:alart提示信息
09:10 知识点:双引号、反斜杠
18:12 知识点:ob 向js文件传值
## 第四部分 修改用户 ### 2.3.0 修改用户-原型 00:47 下载教程代码、启动环境
01:10 跳转链接
01:42 “修改”页面原型及update跳转
03:30 重构代码、减少代码重复
### 2.3.1 获取用户 00:30 进一步重构代码
03:41 获取需要修改的用户
11:51 使用非静态方法,减少参数
15:30 排查错误
18:30 在“修改”页面中填入用户信息
### 2.3.2 更新用户 00:10 下载教程代码
00:45 重构代码,更加面向对象
06:00 实现update更新方法
07:36 知识点:MySQL update
20:20 传递页面路径,实现正确回跳
28:00 地址编码和解码
知识点:URLEncoder
29:51 增加更新失败的情况
# 第三章 ## 第一部分 班级列表 ### 3.0.0 班级管理 00:28 下载教程代码
01:16 新建代码文件
03:05 “新增”页面原型
### 3.0.1 构造函数 00:10 下载教程代码
00:46 index()方法
08:42 add()方法
09:40 edit()方法
10:17 view()方法
10:54 重构代码,减少重复轮子
12:41 constructor构造函数
### 3.0.2单入口文件 00:10 下载教程代码
00:31 重构代码减少不必要的文件
06:47 知识点:debug_backtrace回溯追踪
16:22 知识点:PHP子串 substr
18:59 知识点:dynamic invoke method
20:36 知识点:method_exists()判断方法是否存在
22:49 定义error()方法处理404错误
### 3.0.3 权限校验 00:07 下载教程代码
00:33 提出两个问题:没有权限验证、菜单问题
00:53 添加nav菜单
02:43 添加container,修正布局
04:45 重构代码:为了让HTML有语法检查,打造一个模板
12:59 添加form表单
知识点:form-inline
14:42 知识点:mb-2 -> margin bottom = 2
19:26 构建form表单
知识点:form-row 创建一行
知识点:col-x 设定盒子宽度
23:16 知识点:btn-outline 带轮廓线的按钮
24:59 实现权限校验(在构造函数中启用session)
25:51 在nav菜单中增加班级管理按钮
## 第二部分 ### 3.1.0 数据库初始化 00:30 下载教程代码、启动环境
02:02 导入SQL文件
03:02 基础字段
04:37 新建数据表
知识点:自增 - A I - auto increase
知识点:驼峰式、下划线式
07:50 知识点:日期和时间,当前时间戳
11:30 知识点:数据库关联(外键)降低数据冗余
15:32 为create_user_id设置外键
知识点:FK开头,共34位,不可以包含多余空格
16:08 (TODO 插入视频:如果字段显示不全的解决办法)
16:37 验证外键效果
17:41 为user_id添加外键
知识点:外键约束的字段类型必须和原字段类型相同
### 3.1.1 功能模拟 00:32 下载教程代码、启动环境、导入SQL文件
01:53 原型由HTML变为实体
03:07 创建clazz实体
03:56 知识点:sublime修改回车的缩进方式
05:14 (TODO 补充Windows修改配置文件的视频 )
07:22 知识点:sublime 上下移动代码 (Windows -> ctrl + shift + ↑/↓ 、Mac -> control + command + ↑/↓)
09:10 创建user实体
11:10 移动page类、修改引用位置
13:12 准备page()方法的参数
14:10 知识点:方法注释的规范格式
16:46 准备原型
知识点:PHP array 初始化
20:26 知识点:PHP 时间戳 time()
22:07 知识点:PHP 对象属性初始化
23:29 知识点:PHP array foreach循环
27:54 解决foreach不识别的问题
知识点:endforeach
### 3.1.2 命名空间 00:00 命名空间相关介绍
01:00 错误示范
08:40 知识点:DOCUMENT_ROOT(当前服务器路径)以及这种方法的问题
10:55 使用动态代码(autoloader)
12:25 末尾 autoloader文件(配合命名空间使用)作用 以及 命名空间的使用
### 3.1.3 数据仓库 01:25 数据模拟的分层讲解
02:40 dto repository
03:35 仓库文件夹建立
04:15 calzz数据文件的建立(大驼峰命名)
05:27 测试部分交给clazz数据文件的实现(页数0基)
09:27 page方法的实现(建立基类)
13:20 语法错误检查方法
18:39 修正错误(使用命名空间后产生的错误)
### 3.1.4 连接查询 00:00 知识点:左连接,右连接,内连接
02:25 关联查询使用(左连接)
04:15 `id`字段名覆盖与解决
07:20 `name`字段名覆盖
09:40 知识点:字段名覆盖问题解决(修改'*',使用别名)
14:05 关联查询注意问题
### 3.1.5 字段映射 00:05 字段映射解释
04:43 映射的解释并且最终要达到的效果
09:40 知识点:从对象中拿取键名放入数组
20:40 知识点:驼峰式转下划线式
21:40 通用方法单独创建类
26:55 知识点:判断是否是对象
31:20 建立Clazz中User的字段获取
34:15 功能实现完成,进行代码重构
35:23 知识点:数组拼接函数(数组转换成对应字符串)
### 3.1.6 抽象方法 00:40 未抽象时getFields方法的缺点
01:50 移动user.php并且改名(以及由此产生的错误的修正)
07:43 基类中建立getFiedls方法
12:40 顺代码以及出现的问题
17:00 知识点:抽象(new)
17:00 抽象的使用
25:50 知识点:抽象(实现)
### 3.1.7 综合查询 00:03 知识点:MVC架构
03:27 v层完善
05:17 知识点:form属性(action method)
06:55 建立内部类(作用:对接输入)
13:40 建立服务层,将page方法对接
### 3.1.8 模糊查询 01:25 知识点:快捷键定位method
01:50 将参数传入page方法进行查询
02:00 知识点:快捷键实现上行的复制
08:55 MySQL报错解决方法
11:25 self和this 为什么用this
14:00 定义查询数组,调用方法向数组传查询条件
22:10 模糊查询实现
22:40 查询条件拼接方法优化
24:20 抛出问题
### 3.1.9 范围查询 03:00 范围查询语句
05:35 查询条件规范化
07:43 知识点:为什么将时间字符串转为int类型
10:20 创建方法(将日期字符串转为日期int)
12:00 知识点:时间戳
14:40 知识点:日期字符串转时间戳
17:20 知识点:设置时区
21:50 知识点:时间戳转字符串
25:25 查询条件(范围查询)规范化
26:30 知识点:判断是否是int值
27:40 查询日期(始末)调换
### 3.2 分页组件 01:20 知识点:功能实现的步骤
02:30 知识点:组件和控制器的区别
03:10 建立组件
05:25 创建模板渲染方法以及实现
### 3.2.1 模拟功能 01:30 当前组件需要的参数(依赖于)
03:45 使用面向对象方式输出页码小方块
10:25 把首页和尾页放入循环
14:47 点亮效果实现
18:00 第一页时首页disabled效果的实现
23:40 href填充
### 3.2.2 查询参数 03:35 建立测试文件
05:30 独立出PageNumebr类(在model文件夹)
08:00 开始实现拼接功能
09:03 知识点:将数组转化为字符串
15:20 知识点:urlencode(链接中变量编码)
18:40 知识点:单元测试和集成测试
22:55 排查点亮问题的错误(变量污染)
29:35 添加数据
### 3.2.3 功能对接 02:20 c层功能对接
08:10 页码的显示优化
18:00 点亮问题排查(数据类型不对应
### 3.2.4 控制页码 00:35 解决更改查询条件后页码变动的问题
03:18 只有一页取消显示页码组件的实现
04:35 解决无效页码的问题(代码动态实现)
12:25 解决Href问题
15:27 解决显示第0页的问题
17:10 排查 0 查询无效问题
18:10 易错点:empty(0) 为 true
20:00 小任务
21:20 分页组件的难点盘点
### 3.3.0 新增班级 02:05 解决点击新增按钮跳转问题(4种情况)
06:20 知识点:$_SERVER('SCRIPT_NAME')
10:10 建立functions.php以及url轮子
13:00 完善add.html
14:00 写伪代码
19:35 知识点:数字不能直接被命名为方法名
### 3.3.1 根控制器 02:40 目标以及根控制器的建立
07:13 单元测试
09:20 建立模板文件的两种形式
12:33 js代码放置的两种形式
20:15 js代码放在head标签中报错
23:30 代码合并
27:20 集成测试
### 3.3.2 新增班级 01:20 改写save方法
04:25 将获取用户的方法放到服务层
06:22 进行单元测试
08:00 第二层实体不能转换成字符串的问题
09:00 方法:半分法排错
14:00 外键约束错误
### 3.3.3 逻辑服务层 02:51 在php当中如何去获取其他文件中的静态变量
04:20 信息获取,逻辑处理
05:50 c层处理
11:43 任务以及实现方法(回跳到列表界面)
12:40 服务层处理
### 3.3.4 referer组件 01:15 实现回跳的两种方法
01:25 放到表单当中
06:20 PDOexception 报错
07:20 代码组件化
10:45 知识点:html文件中直接执行方法的方式
### 3.3.5 原生字段校验 00:40 PDOexception 报错解决
03:35 知识点:原生字段校验输入
04:25 字段的浏览器兼容性信息
06:30 用户选择的报错处理
### 3.4.0 用户选择组件 00:45 原型开发
08:30 用户选择的动态实现
09:10 数组对象化
11:25 使用构造函数对象化
### 3.5.0 TemplateService 01:30 建立模板渲染服务层
04:00 单元测试
05:40 传参数
06:50 知识点:参数设定的顺序(是否有默认)
16:45 include(模板) 报错及解决
19:10 知识点:堆栈信息获取 debug_backtrace()
23:30 知识点:字符串截取位置获取
24:05 知识点:分隔符
27:13 测试
### 3.6.0 编辑班级 00:35 增加href(附上id)
02:10 添加id信息
05:10 完善表单
06:30 建立update方法
07:55 回跳功能实现(引用组件)
09:30 模拟功能实现
### 3.6.1 完善选择组件 01:20 int转string方法创建
04:25 知识点:int类型判断方法
10:10 班主任自动选中的功能实现
### 3.6.2 功能对接 01:50 接收id
04:00 error 方法加 exit
05:10 getById和findById的命名习惯
06:35 建立findByid方法
12:10 使用clazz.php中的构造函数进行初始化
### 3.6.3 update 01:15 创建updateInput类
04:15 数据验证
12:17 增加服务层update方法
14:00 repository文件中update方法实现
17:17 将sql语句放入phpMyadmin中检验
### 3.7.0 查看班级 00:30 修正文件名没有大写的问题
01:40 在查看详情处添加href
02:28 功能模拟
04:15 修改v层以及传参
08:05 修改方法名错误问题
09:00 接收id 调用服务层
### 3.7.1 多关联查询 00:28 显示创建者信息
02:35 知识点:一个表连接多个相同表
08:20 使用技巧:全局更改字段名
10:00 自动拼接实现(修改getfields方法
18:40 创建getQuaryFrom 方法
28:45 代码上层剥离
29:53 在clazz中写入创建者
30:43 在page方法中使用getQuaryFrom 获取查询表
### 4.1.0 统一入口 00:53 知识点:框架
02:20 知识点:统一入口
06:20 知识点:路由
06:57 统一入口实现(thinkPHP
10:30 模板文件
11:48 调用模板渲染方法
13:03 小细节:不写php闭标签更友好
### 4.1.1 动态调用 2:20 Apache重写模块,用于转发请求 5:36 获取控制器和方法的名称 8:40 利用substr()去除首位的"/" 9:28 利用substr( ,-1)获取字符串最后一位,再去除末位的"/" 13:00 利用explode()进行字符串转数组的分割 15:15 字符串首字符大写 20:00 代码重构