首页 > 代码库 > 3.2版本视频讲解知识点
3.2版本视频讲解知识点
在项目开发中,一些架构和代码都是重复的,为了避免重复劳动,于是各种各样的框架诞生了。
在PHP开发中,选择合适的框架有助于加快软件开发,节约宝贵的项目时间,让开发者专注于功能的实现上。由于流行的框架经过了大量项目的检验,所以使用框架还有助于创建更加稳定和安全的应用程序。
【数据修改具体实现】
1.通过路由给一个操作方法传递参数
http://网址/index.php/模块/控制器/方法upd/变量名1/值/变量名2/值/变量名3/值
以上路由是通过get形式给指定的操作传递了三个参数信息
原则三个参数信息接收的时候通过$_GET接收即可
例如:$_GET[‘变量名1’]; include()
以上参数信息接收太直白,不安全,需要按照框架规则使用下边的方式接收get参数信息
http://网址/index.php/Admin/Goods/upd/name/tom/age/25/addr/beijing
function upd($name,$age,$addr){
$name;
$age;
$addr;
}
以上参数表述,如果在请求的时候没有按照规则传递参数,那么当前方法禁止访问。
(除非参数有默认值)
2.修改商品信息步骤:
1. 在“修改”按钮处把被修改商品id信息通过get形式传递给upd操作
2. 在upd方法里边制作形式参数$goods_id,接收服务器给传递的get变量goods_id
3. 在修改表单里边制作隐藏域goods_id,避免tp框架禁止修改语句执行
4. 在upd操作方法内部有两个逻辑:展现表单、收集表单
【表单验证】
2.要验证的表单:用户名、密码、重复密码、邮箱、qq、手机号码、爱好、学历
3.具体步骤:
1. 制作表单
2. 表单form数据通过create()方法收集(验证功能要求我们必须通过create()方法收集数据)
3. 自定义数据model模型类实现具体验证规则
注意:
1.一次性获得全部验证错误
2.为同一个项目设置多个验证。
3.如果出错,显示提示:
如:邮箱:格式不正确。
qq:都是数字的,长度5-10位,首位不为0。---正则:/^[1-9]\d{4,9}$/。qq格式不正确
手机:
性别不用验证,默认有一个选项
学历必须选择一个(下拉框):
爱好:复选框(至少选择一项)
4.数组--元素的个数
5.这些基础知识到任何时候都用得到。
【内容回顾】
1. 3种实例化model模型方法
a) new 命名空间GoodsModel();
b) D([“模型标志Goods”]) (之前版本会实例化自定义model对象,目前都实例化Model基类对象)
i. 没有参数实例化一个Model对象、有参数也实例化一个Model对象操作goods数据表
c) M([“模型标志Goods”])
i. 没有参数实例化一个Model对象、有参数也实例化一个Model对象操作goods数据表
2. 数据库查询及连贯操作查询
a) select()
b) select(10) 主键值等于10的记录
c) select(“20,21,22”) 主键值 in 20,21,22 的三条记录
d) find(4) 主键值等于4的记录
e) select()方法返回二维数组,find方法返回一维数组
f) 连贯操作查询方法:
g) field() where() limit() 父类Model已经定义好的方法
h) table() group() order() group() having() 统一在魔术方法__call()里边声明
i) 以上方法可以连续操作执行,使用没有顺序要求
j) $obj -> limit(5)->where(‘price>100’)->order(‘id desc’)->select();
3. 聚合函数使用
a) count() sum() max() min() avg()
b) 以上方法也是在Model的魔术方法__call()里边定义
4. 添加数据记录add()
a) 两种方式:数组、AR操作
5. 修改数据信息save
a) 两种方式:数组、AR操作
b) 注意:为了修改成功必须有两个条件之一被设置
i. 信息里边有主键值id值被修改
ii. 可以通过where设置具体哪些记录被修改
6. 删除数据delete
a) $goods -> delete(10) 主键值等于10的记录信息
b) $goods -> delete(“10,12,13”) 删除三条记录主键值 in 10,12,13 -------------字符串
c) $goods -> where(‘id>100’)->delete() id>100的记录都被删除-------------where条件
7. 原生sql语句执行
a) query() 执行查询语句,返回二维数组信息
b) execute() 执行增加、修改、删除,返回受影响的记录数目,返回false表示sql语句有错误,返回0表示sql语句 执行前后对数据没有改变
8. 表单验证
a) 在自定义模型里边重写$_validate
b) $_validate属性定义时一个数组信息,内部每个小的单元还是一个数组
c) array(字段,验证规则,错误提示,验证条件,附加规则,验证时间)
d) 验证规则:require、email
e) 验证条件:
i. 0 字段在$_POST里边存在就验证
ii. 1 必须验证
iii. 2 值不为空才验证
f) 附加规则:regex in callback
第三天**********************************************************************************************************
【用户注册完善】
implode()把数组元素用逗号给合并起来
代码部分:
页面跳转:成功呈现笑脸。
【命名空间】
namespace
1.在php里边,同一个应用请求里边如果存在两个方法(类名),他们的名字一样(例如都是getName()),由于php本
身语法规则的限制,系统是要报错的
解决方法:
① 把他们的名字改为不一样的 例如 agetName() bgetName()
② 通过命名空间解决(只有学习tp框架才用命名空间,其他语言都不用命名空间)
Yii 框架 为了避免名字重复引起问题,同步的类前边都有 C 字样
1. 简单应用
a) 命名空间是虚拟的定义空间,不是真实存在目录(可以写一些假的)
b) 命名空间的分隔符都是反斜杠 \
c) 非限定名称:getName() 获得与其最近的命名空间的getName()
d) 限定名称:beijing\getName() 相对方式 通过最近的命名空间定位beijing\getName()
e) 完全限定名称: \beijing\getName() 直接在指定的命名空间获得具体元素
f) 命名空间针对:函数、类名、常量三者其作用,在命名空间里边把这三种统称为元素
定义常量的时候,都定义为大写的。
2.子空间应用
3. 别名和导入
a) 导入/引入 use
b) 使用一个元素,使用非限定名称,在当前最接近的空间里边获得元素
c) 如果当前空间里边没有指定元素,也可以在导入的空间里边寻找
d) 别名应用:
e) 如果在引入空间的时候也把元素给引入了,在当前的空间里边也有同名字的元素,那么这个外来的元素和内部元素要有冲突,这时可以通过别名定义来重新给外来的元素起名字并使用
4. 公共空间
a) 第一种情况
b) 没有使用namespace定义空间,当前空间就是一个公共空间
c) 例如一个有namespace的文件引入了一个没有namespace的文件程序
d) 没有namespace的文件空间就是公共空间
e) 在namespace文件里边可以通过\斜杠直接访问公共空间元素
f) function getName(){} ------公共空间的元素
g) namespace beijing;
h) function getName(){} -----beijing空间的元素
i) 第二种情况
j) 当前文件没有namespace、但是引入的文件有namespace
k) 当前文件就是公共空间,引入文件有自己空间
公共空间有两种情况:
1. 当前有空间,引入没有空间(公共空间)
a) 默认使用当前空间的元素.
b) 统一用"\"斜杠引入公共空间元素.
2. 当前没有空间(公共空间),引入有空间
a) 默认调用当前公共空间的元素(非限定名称)
b) 使用有公共空间的元素 (限定名称、完全限定名称)
同一个页面里边有许多空间,在页面最下边使用上边空间的元素,名称需要使用完全限定名称,还可以把上边空间的元素给use引入过来也可通过非限定名称或限定名称使用
命名空间使用注意:
1. 针对类名、函数名、常量const其作用
① define()定义的常量不受命名空间限制
2. 声明namespace的当前脚本的第一个命名空间前面不能有任何代码(header头代码也要写在下边)
3. 命名空间是虚拟抽象的空间,不是真实存在的目录
4. 当前文件可以include具有命名空间的文件,默认空间是当前文件的公共空间
5. 元素调用分:非限定名称、限定名称、完全限定名称
简单使用:同一个页面定义了许多单级命名空间
子空间:通过\斜杠定义多级命名空间
公共空间:为了程序比较严谨,公共空间的元素都使用\斜杠访问
空间引入和别名:use as
【tp框架对多语言的支持】
多语言设置就是通过get参数告诉当前的请求使用何种语言
第一次使用get变量传递语言,之后语言还会保存在cookie里边,供下次使用
如果get没有传递语言,浏览器会根据当前地区选中对应的语言,我们程序也可以读取浏览
器的对应的语言变量选择对应的语言
设置步骤:
1. 多语言通过行为Behavior支持:ThinkPHP/Library/Behavior/CheckLangBehavior.class.php
2. 语言包一共有4种,后定义的要覆盖先定义的(类似配置文件config.php覆盖convertion.php)
3. 在config.php里边开启多语言支持
4. 确保行为Behavior代码执行
a) 手动启动该CheckLangBehavior行为
b) shop/Common/Conf/tags.php
5. 语言包4个等级
6. 获得语言变量信息
a) L()快捷函数,可以获得全部或指定语言变量
b) 使用语言,获得全部语言,assign()传递语言变量到模板进行具体使用(assign:赋值,分配)。
c) {$Think.language.名称}
7. 每个语言自己对应具体的一个文件
总结:
1. 命名空间
i. namespace use
ii. 非限定名称(当前空间元素) 限定名称(相对空间的元素) 完全限定名称(绝对定位元素)
iii. 简单使用(同一个文件定义许多命名空间)
iv. 子空间(多级命名空间)
v. 引入空间:空间和元素都引入、只引入空间
vi. 别名使用:
vii. 公共空间
2. 多语言
【tp框架验证码支持使用】
ThinkPHP/Library/Think/Verify.class.php
$verify = new 命名空间Verify();
$verify -> entry(); 生成一个验证码
一个单独的方法生成验证码
验证码需要在模板中使用
<img src=http://www.mamicode.com/”路由地址Manager/verifyImg” alt=”” />
验证输入的验证码是否正确
本身验证码信息存储在session里边
session存储的验证码是加密后的数据
Verify类给我们提供了一个方法进行验证码的有效性验证
$verify -> check(用户输入验证码); 返回真,表示验证码正确
【用户登录实现】
Manager
判断用户名、密码是否是正确的,如果是正确的,再把信息存入session里边表示是登录状态
旧的解决方案:
select * from sw_manager where name=$name and pwd = $pwd;
同时查询用户名和密码的信息记录,如果存在就是正确的,否则用户名或密码错误
该方式不安全,会增加sql语句注入的风险
现在流行的解决方案:
select * from sw_manager where name=$name;
首先,查询指定名字的记录信息
其次,如果记录存在,再把记录里边的密码拿出来 与 用户输入的密码进行比较
如果比较一致,就说明用户名和密码正确
用户名和密码在model模型里边的判断:
tp框架关于session操作(cookie)
//session(name,value, 有效时间) 设置session
//session(name) 获取session
//session(name,null) 删除指定session
//session(null) 清空全部session
用户退出系统
【tp框架实现数据分页】
1. tp框架使用自定义功能类
2. 具体分页效果实现
【缓存使用】
smarty里边也有缓存,是页面静态化的缓存, 页面缓存
数据缓存
数据缓存介质:file文件、memory内存、数据库
可以把一些不经常使用的mysql数据临时放入缓存里边,每次用户获得信息就从缓存里边获得,大大的提升的mysql的性能,较少服务器开销
文件缓存:fopen fwrite() fread()
memory内存缓存:安装内存缓存软件,启动软件服务,set() get()方法对内存数据进行读入读出操作
数据库缓存:建立数据表,启动mysql数据 insert() select() update()
不同介质的缓存操作的手段也不一样
tp框架已经把各种缓存设置好了,我们可以通过统一的行为操作不同类型的缓存
使得缓存使用非常容易入门。
S(name,value) 设置缓存
缓存操作:
S(name,value,有效期(秒)); 设置缓存变量
S(name) 读取缓存变量信息
S(name,null) 删除指定的缓存变量
S(null)删除全部的缓存变量
缓存案例原理:
缓存里边有数据直接返回使用
否则去数据库查询信息,再缓存,再供使用
下次就会跑到缓存里边获得指定的信息,过了有效期还要重启跑到数据库获得数据
生成的具体缓存文件:
80%的缓存是内存缓存。
【tp框架实现附件上传】
<form enctype="multipart/form-data">
$_FILES
move_uploaded_file(临时路径名,真实路径名);
附件上传逻辑代码:
【为已经上传的图片制作缩略图】
原理:利用已有图片创建一个画板
把画板给缩小一点imagecopyresampled
imagepng($im,路径名); 保存到系统一个指定目录
ThinkPHP/Library/Think/Image.class.php
open() 打开一个图像资源
thumb()制作缩略图,设置图像的宽度、高度、达到制作缩略图效果:自动地按比例进行缩放
save() 保存图像,
为上传的图片生成缩略图:
【面向切面编程之行为Behavior分析】
1.面向切面:是一种设置模式
把一个大块的功能给分解为小块的功能
这样小块的功能利于开发、维护、升级、部署
2.tp框架的面向切面编程设计体现在Behavior行为里边,在ThinkPHP/Library/Behavior
3.行为:
4.tp框架的行为Behavior如何执行:
1. 框架执行流程分析:index.php ThinkPHP.php Think.class.php App.class.php。这是主要的文件,而行为 与Think.class.php联系最紧密
2. Think::start();
3. ThinkPHP/Conf/Mode/common.php tags标签内容是行为的内容
4. 自定义shop/Common/conf/tags.php文件
5. 自定义tags.php内容会覆盖指定的common.php的配置内容
App.class.php
1. function run();
2. Hook::listen(‘app_begin‘);
3. ThinkPHP/Library/Think/Hook.class.php
4. function listen()
5. tags标签的内容解析出来: CheckLang
6. self::exec(‘CheckLang’);
7. function exec()
8. CheckLangBehavior
9. new CheckBehavior;
10. obj -> run(); 运行具体行为
总结:
1. 1. 验证码Verify entry()
i. 独立路由进行验证生成
ii. check(用户输入验证)
2. 数据分页
3. 缓存使用S();
4. 附件上传Upload.class.php uploadOne()
i. 注意:rootPath 根目录路径需要设置正确
ii. 日期路径也会自动被创建
iii. 生成缩略图Image.class.php
iv. open()
v. thumb()
vi. save()
5. Behavior行为分析
作业:
1. 后台用户登录逻辑实现(用户登录信息存入session表示登录状态)
2. 验证码生成、及具体应用判断
3. 后天添加商品上传图片(生成缩略图)
登录系统、验证码、分页、上传、缩略图