一、TP引入以及目录介绍
TP官网下载地址:
将ThinkPHP核心目录复制到指定的位置,和index.php在同一目录下
引入ThinkPHP:include "./ThinkPHP/ThinkPHP.php" 引入之后会自动生成一些文件目录
自动生成的目录介绍:
在首次运行index.php之后会产生上述三个文件目录,这个是系统自动产生的。
Common:表示通用文件目录
Common:函数库目录(应用层级)
Conf:配置文件目录,里面存放了config.php(应用层级)
Home:分组目录(默认的分组)
Common:函数库目录(分组层级)
Conf:配置文件目录(分组层级)
Controller:控制器目录
Model:模型目录
View:视图文件目录
Runtime:缓存或者临时文件目录
目录安全文件
在自动生成的目录中会看到一些index.html文件,但是打开后会发现是空的文件。这些文件有个高大上的名字叫“目录安全文件”。
其作用是防止在没有默认文档的时候服务器会列出整个目录下的目录结构。
在ThinkPHP主配置文件(convention.php)中设置了默认的分组、控制器和方法。
'DEFAULT_MODULE' => 'Home', // 默认模块'DEFAULT_CONTROLLER' => 'Index', // 默认控制器名称
'DEFAULT_ACTION' => 'index', // 默认操作名称
控制器的创建
创建位置:分组目录/Controller/下
命名:控制器名+Controller(关键词)+.class.php
例如:
Index控制器:IndexController.class.php
Goods控制器:GoodsController.class.php
编写控制器文件(重点):
三步走:
第一步:声明当前类的命名空间;
第二步:引入父类控制器(类元素);
第三步:定义控制器并且继承父类控制器;
使用命名空间需要注意事项:
1、声明使用关键词:namespace关键词
2、引入空间或者元素(类元素):use关键词
3、要求php版本大于5.3,因为命名空间是从php5.3之后才引入的;
4、 在当前文档的第一个namespace声明之前不能有任何的(除了注释外)输出,header头也不行。
pathinfo路由形式(默认路由形式)
格式:http://0615.com/index.php/分组/控制器/方法/参数名/参数值(.html)
例如:使用pathinfo路由形式访问test控制器中index方法,则其路由如下:
http://0615.com/index.php/Home/Test/index(.html)
模版中的常量替换机制
__MODULE__:表示从入口文件开始向后,一直找到分组为止
__CONTROLLER__:表示从入口文件开始向后,一直找到控制器为止;
__ACTION__:表示从入口文件开始向后,一直找到方法为止;
__SELF__:表示从入口文件开始向后,一直找到最后(包括了参数);
__PUBLIC__:表示站点根目录下的Public目录地址;
url组装函数
第一种用法:U(‘方法名’) 表示组装出当前控制器下的指定方法名的url路由
第二种用法:U(‘控制器/方法’) 表示组装指定控制器下指定方法的url路由
第三种用法:U(‘分组/控制器/方法’)表示组装指定分组下的指定控制器下的指定方法的url路由
关于使用U方法组装地址时如何去传递参数?
语法:U(第一个参数,array(‘参数名’ =>参数值,’参数名’=>参数值…));
成功跳转:$this -> success(跳转提示信息,跳转地址,等待时间); 笑脸
失败跳转:$this -> error(跳转提示信息,跳转地址,等待时间); 哭脸
视图中使用函数(重点)
语法:{$name|fn1|fn2=arg1,arg2,###}
$name:模版中的变量;
|:变量修饰器(Linux中也会用到,在Linux中叫管道)
Fn1:需要使用的第一个函数名
Fn2:需要使用的第二个函数名
Arg1:表示函数所使用到的参数
Arg2:表示函数所使用到的参数
###:表示变量自身(表示$name),###有个名字叫“占位符”。
例如: {$time|date = 'Y-m-d H:i:s',###}模版中使用函数的时候,如果函数只有一个参数,则可以不写参数,如果参数不止一个,并且第一个参数是变量自身,则也可以不写。
视图中的系统变量
在ThinkPHP中为了方便开发,系统支持一些常用的全局变量。
• $Think.server 表示服务器端的一些信息(环境变量等等)等价于$_SERVER
• $Think.get 表示get中的信息,等价于$_GET
• $Think.post 表示post中的信息,等价于$_POST
• $Think.request 是post和get信息的集合,等价于$_REQUEST
• $Think.cookie 表示cookie中的信息,等价于$_COOKIE
• $Think.session 表示session中的信息,等价于$_SESSION
• $Think.config 用于输出ThinkPHP中的配置信息
例如:
{$Think.session.uname}
模板中使用U方法:
{:U('Email/recbox')}
文件包含
引入使用include标签,语法如下:
• <include file="模板文件名"/>
视图中的数组遍历及模板标签的使用
Hello,<?php echo($name);?>!
注意模板标签的
{
和$
之间不能有任何的空格,否则标签无效。所以,下面的标签Hello,{ $name}!该标签是无效的
系统变量输出
普通的模板变量需要首先赋值后才能在模板中输出,但是系统变量则不需要,可以直接在模板中输出,系统变量的输出通常以{$Think 打头,例如:
{$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量
{$Think.session.user_id} // 输出$_SESSION['user_id']变量
{$Think.get.pageNumber} // 输出$_GET['pageNumber']变量
{$Think.cookie.name} // 输出$_COOKIE['name']变量
- {$info['status']?$info['msg']:$info['error']}
在当前模版文件中包含其他的模版文件使用include标签,标签用法:
<include file="Public/header" /> // 包含头部模版header
<include file="Public:header" />
Volist:是增强版的循环遍历方法,有好几个参数,支持对循环遍历的控制;
Foreach:是基础班的循环遍历方法,只有2个参数,不支持对循环遍历的控制;
<volist name="需要遍历的数组变量" id="当前遍历到的对象">if标签
<if condition="" >in标签
第一种:$model = M(); 没有参数,就是实例化模型,但是不关联任何表,一般用他执行原生的sql语句。
第二种:$model = M(表名) 表名不带前缀,首字母尽量大写,实例化模型并且关联指定的表。
CURD操作
第一种:$model -> select(); 表示查询全部的数据
第二种:$model -> select(id); 表示查询指定的主键id数据
第三种:$model -> select(‘id1,id2,id3…’)表示查询指定多条的id记录,类似于原生sql语句中的in语法,特别需要注意的是,select方法要么没有参数,要么只有1个参数。
$model->find();查询的结果是一维数组第一种:$model -> find(); 表示查询表中的第一条记录
第二种:$model -> find(id); 表示查询指定id的所在记录。
删除操作第一种:$model -> delete(id); 表示删除指定的id记录
第二种:$model -> delete(‘id1,id2,id3…’); 表示删除多个记录,类似与in语句
Tp框架中的辅助方法
$model -> where(limit方法条件);
在ThinkPHP中,条件支持字符串的形式(如:【$model -> where(‘id = 9’);】),同时在ThinkPHP中条件还支持数组的形式(如【$model -> where(array(‘id’=>9,’name’=>’财务部’));】)。
以上两个方法都可以使用,对于一般常见比较简单的sql语句条件,建议使用数组的条件形式。
limit方法第一种用法:$model -> limit(10);表示查询前10条记录。
第二种用法: $model -> limit( 起始位置,偏移量);表示从起始位置开始往后查询偏移量条数的记录信息。$model -> field(‘字段1,字段2,字段3 [as 新字段]’);
Field方法只有一个参数,要求必须是字符串,不管需要查询多少个字段的信息。
order排序方法$model -> order(‘字段 升序/降序’); //只有一个参数
group分组方法$model -> group(‘字段名’); //一个参数,参数是字符串
注意:需要配合field方法一起来实现。
ThinkPHP中的连贯操作
$model -> field(字段信息) -> group(字段) ->select();
$rst = $model ->field('name,count(*)as count') -> group('name')-> select();
$model 必须是在最前面,具体的CURD操作方法必须是在最后面,而中间的辅助方法的顺序,是随意的。ThinkPHP中的统计查询
• count() 求总记录数
• max() 求某个字段的最大值
• min() 求某个字段的最小值
• avg() 求字段的平均值
• sum() 求字段的总和
类似于_sql()和getLastSql方法。都是表示获取sql语句。
区别:_sql()/getLastSql表示获取当前模型最后一条成功执行的sql。而fetchSql则表示输出当前的sql语句。
基本语法格式:
$model -> where(条件) -> order(字段 排序规则) ->fetchSql(true) ->select();
会话控制
• session(‘name’,’value’) 设置一个名为name的session,值是value
• $value = session(‘name’) 获取一个名为name的session值
• session(‘name’,null) 删除一个名为name的session
• session(null) 删除全部的session值
• session() 获取全部的session值(老版本是没有这个方法)
cookie支持• cookie(‘name’,’value’) 设置一个名为name的cookie值是value
• cookie(‘name’,’value’,3600) 同样也是设置,加了有效期(单位是S)
• $value = cookie(‘name’) 获取一个名为name的cookie值
• cookie(‘name’,null) 删除一个名为name的cookie值
• cookie(null) 删除全部的cookie(用不了)
• cookie() 获取全部的cookie
文件加载
函数库:分为两大类,一类是系统函数库(functions.php),另一类是自定义函数库(function.php),系统函数库文件名中有个s,而自定义的是没有的。
自定义函数库:在ThinkPHP中又可以分为两处,一处是应用层级(/Common/Common/function.php),另一处是分组层级的函数库文件(分组/Common/function.php)。
使用方法:
在应用层级定义的函数库文件中的函数,可以在整个应用中的任何位置都可以去使用函数库文件中的函数,使用方法和使用php内置函数一样。
说明: 在应用层级的函数库文件中的函数,可以在当前应用的全部分组中使用;而如果是在分组中定义的函数库文件只能在当前的分组中使用。Load方法是系统函数库中定义的一个函数,可以在ThinkPHP中直接去使用,常用的语法格式是:
Load(‘@/filename’) //表示载入当前分组下的filename.php文件
所以,必须要求需要引入的文件要放在当前分组下的Common目录中。
多表连接
原生语法格式:select 表1.字段,表2.字段 from表1,表2 where表1.字段 =表2.字段。
原生的sql语句:selectt1.*,t2.name from tp_user as t1,tp_dept as t2 where t1.dept_id = t2.id
在ThinkPHP中如果确实需要使用原生的sql语句,可以在实例化模型之后,让模型调用query方法(父类模型中的方法)。基本语法格式如下:
$model -> query($sql);
使用连贯操作的方式改写上述的语句
$model -> table(‘ 表1 [ast1],表2,表3’);Join连表方式有:内联、外联(左、右)、全联(fulljoin)
原生的sql语句: select t1.*,t2.name as dept_name from tp_dept as t1 left join tp_dept as t2 on t1.pid = t2.id;
改写上述的原生sql语句为连贯操作。
语法格式:$model -> join(‘具体的连接方式 表名 ON 条件’) -> CURD();
关于给表起别名:
例如:文件上传和缩略图
'rootPath' => './Public/UploadPics/', //保存根路径,当前系统下的文件的路径
'exts' => array('jpg','jpeg','png','gif'), //允许上传的文件后缀
);
$up = new \Think\Upload($cfg); //new一个文件上传类对象
$z = $up -> upload(array('pics_tu'=>$_FILES['pics_tu'])); //多个文件上传,如果要上传单个文件,$up->uploadOne($a) $a为要上传的文件
$yuan_pics = $up->rootPath.$n['savepath'].$n['savename'];//缩略图的保存路径(加上文件的名字)
$im -> open($yuan_pics); //打开原图片的路径
$im -> thumb(800,800,6);//生成缩略图
$big_pics = $up->rootPath.$n['savepath'].'b_'.$n['savename']; //生成缩略图保存的路径
$im -> save($big_pics);