php总结回顾
做人不能一直埋着头往前跑,还要偶尔停下来看下来时的路。所以今天就来回顾下之前的吧
下面依次介绍
【一】TP加载流程
①应用入口文件index.php→②tp公共入口文件ThinkPHP.php→③核心Think类→④函数库→⑤配置文件→⑥控制器→⑦模型→⑧模板
步骤详解:
①应用入口文件index.php,最后require引用tp核心文件即ThinkPHP的公共入口文件(之所以用require,不用include的原因很明了)
require './ThinkPHP/ThinkPHP.php'; // 引入ThinkPHP入口文件
作用:检测环境、管理应用级别的配置,如模式选择(开发/生成)、定义应用目录、工作目录、工作路径、附件上传跟目录等
②tp公共入口文件ThinkPHP,最后require引用加载tp核心Think类,并初始化应用
// 加载核心Think类 require CORE_PATH.'Think'.EXT; // 应用初始化 Think\Think::start();
作用:定义版本信息、类文件后缀(.class.php)、URL模式、系统常量、
关于系统常量,参考tp系统常量。URL模式参考ThinkPHP的四种URL模式 URL_MODEL。
③加载核心class类,因为在tp公共入口文件ThinkPHP里,最后的初始化应用前加载了核心Think类
分类说下核心Think类:①Think.class.php是tp引导类;②Storage.class.php是分布式文件存储类;③File.class.php是本地文件写入存储类
【二】数据查询----------→辅助方法和连贯操作
系统支持的连贯操作方法有:
连贯操作 | 作用 | 支持的参数类型 |
---|---|---|
where* | 用于查询或者更新条件的定义 | 字符串、数组和对象 |
table | 用于定义要操作的数据表名称 | 字符串和数组 |
alias | 用于给当前数据表定义别名 | 字符串 |
data | 用于新增或者更新数据之前的数据对象赋值 | 数组和对象 |
field | 用于定义要查询的字段(支持字段排除) | 字符串和数组 |
order | 用于对结果排序 | 字符串和数组 |
limit | 用于限制查询结果数量 | 字符串和数字 |
page | 用于查询分页(内部会转换成limit) | 字符串和数字 |
group | 用于对查询的group支持 | 字符串 |
having | 用于对查询的having支持 | 字符串 |
join* | 用于对查询的join支持 | 字符串和数组 |
union* | 用于对查询的union支持 | 字符串、数组和对象 |
distinct | 用于查询的distinct支持 | 布尔值 |
lock | 用于数据库的锁机制 | 布尔值 |
cache | 用于查询缓存 | 支持多个参数 |
relation | 用于关联查询(需要关联模型支持) | 字符串 |
result | 用于返回数据转换 | 字符串 |
validate | 用于数据自动验证 | 数组 |
auto | 用于数据自动完成 | 数组 |
filter | 用于数据过滤 | 字符串 |
scope* | 用于命名范围 | 字符串、数组 |
bind* | 用于数据绑定操作 | 数组或多个参数 |
token | 用于令牌验证 | 布尔值 |
comment | 用于SQL注释 | 字符串 |
index | 用于数据集的强制索引(3.2.3新增) | 字符串 |
strict | 用于数据入库的严格检测(3.2.3新增) | 布尔值 |
【三】联表查询
(1)table方法:通过where关联数据表,在TP中对应SQL原型
原生PHP方法:通过where语法进行表1和表2的关联操作,即让两个表关联
select 表1.字段,表2.字段 [as 关联查询出的字段名] from 表1[as 别名1],表2[as 别名2] where 表1.字段=表2.字段//注意:一般查询主表1的所有---表1.*,表2.字段
这里举个例子,关联职员表主表sp_user和部门表从表sp_dept,关联出的字段设置为newPid
$model = M('user'); $sql = 'select user.*,dept.pid as newPid from sp_user as user ,sp_dept as dept where user.dept_id=dept.pid'; $result = $model->query($sql); dump($result);die;
转换成table方法
public function study(){ $model = M('user');//直接实例化父类即可,不需要关联数据表!!! // $sql = 'select user.*,dept.pid as newPid from sp_user as user ,sp_dept as dept where user.dept_id=dept.pid'; $result = $model->field('user.*,dept.pid as newPid')
->table('sp_user as user ,sp_dept as dept')
->where('user.dept_id=dept.pid')
->select(); dump($result);die; $this->display(); }
结果:
(2)join方法:通过on关联数据表
①原生SQL方法:
select t1.*,t2.name as deptname from sp_dept as t1 left join sp_dept as t2 on t1.pid=t2.id;
②ThinkPHP中执行join语法:
通过on进行关联,join方法也是连贯操作的辅助方法之一,且只有一个参数
如果需要给当前模型关联的表起别名,可以使用alias方法:
$model->alias('别名');//辅助方法之一
$model = M('user');//直接实例化父类即可,不需要关联数据表!!! // $sql = 'select user.*,dept.pid as newid from sp_user as user left join sp_dept as dept on user.dept_id=dept.pid'; $result = $model->field('user.*,dept.pid as newid')
->alias('user')
->join('left join sp_dept as dept on user.dept_id=dept.pid')
->select(); dump($result);die;
对比:
table语句:select user.*,dept.pid as newPid from sp_user as user ,sp_dept as dept where user.dept_id=dept.pid join语句: select user.*,dept.pid as newid from sp_user as user left join sp_dept as dept on user.dept_id=dept.pid;
【四】$_POST和I方法对比
(1)I方法的所有获取变量都会进行htmlspecialchars过滤,也可以自己设置过滤函数。比$_POST方便 (2)I方法的所有获取变量都会进行htmlspecialchars过滤,也可以自己设置过滤函数。比$_POST方便 (3)I方法对特殊字符做了转义
.
.