1、url的四种访问模式:
1) PATHINFO模式(重点)
Eg:http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值2
2) 普通模式
Eg:http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值2
3) REWRITE模式(重写模式)
需要增加配置文件 hac,服务器支持。
Eg:http://域名/项目名/模块名/方法名/键1/值1/键2/值2
4) 兼容模式
Eg:http://域名/项目名/入口文件?s=模块名/方法名/键1/值1/键2/值2
2、ThinkPHP输出:
1)PHP原生输出方法。Echo
2)通过display方法输出。想通过分配变量可以使用assign输出
3)修改定界符:修改配置项。避免与JQuery冲突
?THPL_L_DELIM?-〉?<{? 修改左定界符
?THPL_R_DELIM?-〉?<{? 修改右定界符
3、ThinkPHP 的模型使用
1)需要在方法中通过new Model (表名)的形式操作数据库
$m=new Model(?User?);
$arr=$m->sselect();
需要通过配置项来配置数据库(数据表名第一个字母大写)
还有一种简单使用模型的方法:
$m=M(?User?); //等效为 new Model
$arr=$m->sselect();
使用模型的实力可以对数据进行操作,操作的工作一般就是对数据库进行 增删改查。 增 c create $m->add()
删 d delete $m->delete()
改 u update $m->save()
查 r read $m->select()
4、ThinkPHP 3.1.2 CURD特性
ThinkPHP 3 读取数据
1)对数据的读取 Read
$m=new Model('User');
$m=M('User');
a. select $m->select();//获取所有数据以数组形式返回
b. find $m->find($id);//获取单条数据
c. getField(字段名)//获取一个具体的字段值
$arr=$m->where('id=2')->getField('username'); //ThinkPHP的连贯操作
ThinkPHP 3 创建数据
对数据的添加 Create
$m=new Model('User');
$m=M('User');
$m->字段名=值
$m->add();
返回值是新增的id号
代码示例:
public function add(){
$m=new Model('User');
$m->username=$_POST['username'];
$m->sex=$_POST['sex'];
$newId=$m->add();
if($newId>0){
$this->success("Add new user successfully!!!",index);
}else{
$this->error("Add new user failed!!!",index); }
}
ThinkPHP 3 删除数据
$m=M('User');
$m->delete(2); //删除id为2的数据
$m->where('id=2')->delete(); //与上面效果相同也是删除id为2的数据 返回值是受影响行数
ThinkPHP 3 更新数据
$m=M('User');
$data['id']=1;
$data['username']='ztz2';
$m->save($data);
返回值是受影响行
5、 ThinkPHP 3.1.2 查询方式
find只能查询一天记录,select可以查询多条记录
一、普通查询方式
字符串
$arr=$m->where("sex=0 and username='gege'")->find();
数组
$data['sex']=0;
$data['username']='gege';
$arr=$m->where($data)->find();
注意这种方式默认是and的关系如果使用or关系需要添加数组值 $data['sex']=0; $data['username']='gege';
$data['_logic']='or';
二、表达式查询方式
$data['id']=array('lt',6);
$arr=$m->where($data)->select();
EQ 等于
NEQ 不等于
GT 大于
EGT 大于等于
LT 小于
ELT 小于等于
示例代码:
public function show(){
$m=new Model('User');
$data['id']=array("LT",25);
$arr=$m->where($data)->select();
var_dump($arr);
$this->display(); }
LIKE 模糊查询
$data['username']=array('like','%ge'); //查询username以ge结尾的user
$data['username']=array('like','%ge%'); //查询username包含ge的user $arr=$m->where($data)->select();
NOTLIKE //注意not 和 like中间不能有空格
$data['username']=array('notlike','%ge%'); //查询username不包含ge的user $arr=$m->where($data)->select();
注意如果一个字段要匹配多个通配符
$data['username']=array('like',array('%ge%','%2%','%五%'),'and'); //如果没有第三个值默认关系是or关系
$arr=$m->where($data)->select();
BETWEEN
$data['id']=array('between',array(5,7));
$arr=$m->where($data)->select();
//SELECT * FROM `tp_user` WHERE ( (`id` BETWEEN 5 AND 7 ) )
$data['id']=array('not between',array(5,7));
//注意not 和 between中间一定要有空格
$arr=$m->where($data)->select();
IN
$data['id']=array('in',array(4,6,7));
$arr=$m->where($data)->select();
//SELECT * FROM `tp_user` WHERE ( `id` IN (4,6,7) ) $data['id']=array('not in',array(4,6,7)); not和in之间一定要有空格 $arr=$m->where($data)->select();
//SELECT * FROM `tp_user` WHERE ( `id` NOT IN (4,6,7) )
常用连贯操作
a) where 帮助我们设置查询条件
b) order 对结果进行排序
$arr=$m->order('id desc')->select();
$arr=$m->order(array('id'=>'desc','sex'=>'asc'))->select();
c) limit 限制结果
limit(2,5)
limit('2,5')
limit(10)//limit(0,10) d) field
d) 设置查询字段
field('username as name,id')
field(array('username'=>'name','id')
field('id',true) //获取除了id以外的所有字段
e) table
f) group
g) Having
h) 补充
i. alias 用于给当前数据表定义别名 字符串
ii. page 用于查询分页 内部会转换成limit 字符串和数字
iii. join* 用于对查询的join支持 字符串和数组
iv. union* 用于对查询的union支持 字符串、数组和对象
v. distinct 用于查询的distinct支持 布尔值
vi. lock 用于数据库的锁机制 布尔值
vii. cache 用于查询缓存 支持多个参数 以后在缓存部分再详细描述
viii. relation 用于关联查询 需要关联模型扩展支持 字符串
ix. validate 用于数据自动验证 数组
x. auto 用于数据自动完成 数组
xi. filter 用于数据过滤 字符串
xii. scope* 用于命名范围 字符串、数组
模板的使用
a) 规则
模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html.tpl
更换模板文件的后缀名
修改配置文件: 'TMPL_TEMPLATE_SUFFIX'=>'.html',//更改模板文件后缀名
b) 修改模板文件目录层次
'TMPL_FILE_DEPR'=>'_',//修改模板文件目录层次
c) 模板主题
'DEFAULT_THEME'=>'your',//设置默认模板主题
需要在TPL下面新建一个your文件夹作为模板主题文件
如何动态修改模板主题
1、在后台准备一个功能
修改config.php文件中的默认模板项
2、通过url传递 t=主题 参数可以修改不同的模板 (需三方同时使用)
'DEFAULT_THEME'=>'your', //设置默认模板主题
'TMPL_DETECT_THEME'=>true, //自动侦测模板主题
'THEME_LIST'=>'your,my', //支持的模板主题列表
模板的输出
a) display
1.display中没有参数
$this->display();
2.可以带参数
$this->display(本模块文件夹下的其他模板文件);
$this->display('index2');
$this->display(其他文件夹下的模板文件);
$this->display('Public:error'); //注意仅仅需要在Tpl下有Public文件夹以及其中的error.html即可不需要一定有Public模块
$this->display(其他主题下的 文件夹下的 模板文件);//需要开启主题支持 $this->display('my:Index:index');
$this->display(一个url路径);
$this->display('./Public/error.html');
$this->display('./Public/error.html','utf-8','text/xml'); //参数二为制定编码,
参数三为模版的输出类型。 $this->show($content); //参数也可以为: ?html代码?
3.fetch方法 获得模板文件中的内容以字符串形式返回
$content=$this->fetch('Public:error');
4.show方法 不需要模板文件可以直接输出模板内容
$content=$this->fetch('Public:error');
dump($content);
$content=str_replace('h1','i',$content);
$this->show($content);
模版赋值
1、 $this->assign(data,梁辉健);
2、 $this->name=”梁辉健”;
模版替换
a) __PUBLIC__会被替换成当前网站的公共目录 通常是 /Public/
b) __ROOT__ 会替换成当前网站的地址不含域名
c) __APP__ 会替换成当前项目的URL地址 不含域名
d) __GROUP__会替换成当前分组的URL地址 不含域名
e) __URL__ 会替换成当前模块的URL地址不含域名
f) __ACTION__会替换成当前操作的URL地址 不含域名
变量输出
1、标量输出
2、数组输出
{$name[1]}
{$name[?k2?]} / {4name.k1}:关联数组
3、对象输出
{$name:k} / {$name -> k} “name”为对象,”k”为类里面调用的函数。
系统变量:
使用函数:
{$name|strtoupper} 编译后
<?php echo (strtoupper($name)); ?>
{$name|date='y/m/d H:i:s',###} 编译后
<?php echo (date('y/m/d H:i:s',$name)); ?>
$this->assign('name'); :若是没有给name分配变量则可以在模版文件设置: {$name|default="这里是默认值"} 编译后
<?php echo (($name)?($name):"这里是默认值"); ?>
运算符:
+ - * / ++ -- : {$name+1}
导入 js css 文件
方法一:
<link rel="stylesheet" type="text/css" href="__PUBLIC__/Css/basic.css" /> <script src="__PUBLIC__/Js/Test.js" type="text/javascript"></script>
方法二:
<import type="js" file="Js/test" />
若是Js/Css文件不是放在Public文件目录下,可以增加一个路径参数
<import type="js" file="Js/test" basepath=”./Other” />
方法三:
<load file=”__PUBLIC__/Css/basic.css” /> (可自动检测文件属性)
分支结构
1、 If 结构
<ifcondition="$age lt 18">
未成年
<elseif condition="$age eq 18"/>
青春年少
<else/>
成年
</if> < : gt
> : lt
== : eq
<= : elt
>= : egt
!= : neq
=== : heq
!== : nheq
2、switch 结构
<switch name="number">
<case value="1">一个和尚挑水吃</case>
<case value="2">两个和尚抬水吃</case>
<case value="3">三个和尚没水吃</case>
<default/> 这里是默认值
</switch>
循环结构
1、for
<table border="1" width="500">
<for start="10" end="00" name="j" step="-2" comparison="gt">
<tr><td>{$j}</td><td>aaa</td></tr>/
</for>
</table>
注:开始值、结束值、步进值和循环变量都可以支持变量,开始值和结束值是必须,其他是可选。comparison 的默认值是lt;;name的默认值是i,步进值的默认值是1
2、Volist (遍历数组-- 多位,数值数组)
<volist name="list" id="v">
{$v.username}</br>
</volist>
3、Foreach(遍历数组,一维 )
<foreach name="list" item="v" key='k'>
{$k}--------- {$v}</br>
</foreach>
特殊标签
1、比较标签
eq或者 equal 等于 neq 或者notequal 不等于 大于 gt
大于等于 egt
小于 lt 小于等于 elt 恒等于 heq 不恒等于 nheq
例:<eq name=”0” value=”10”>输出10</else>输出不是十</eq>
2、范围标签 In: (notin)
<in name="n" value="9,10,11,12">在里面<else/> 不在里面</in>
Between: (notbetween)
<in name="n" value="1,10">在里面<else/> 不在里面</in>
也可以直接使用range标签,替换in和notin的用法:
<range name="id" value="1,2,3" type="in">输出内容1</range>
其中type属性的值可以用in或者notin。
3、Present(notpresnt):可以使用present标签来判断模板变量是否已经赋值
<present name="name">name已经赋值</present>
4、Empty(notempty):可以使用empty标签判断模板变量是否为空
<empty name="name">name为空值</empty>
5、Defined:判断常量是否已经定义
6、Define:可以使用define标签进行常量定义
7、Assign:模版中变量赋值
<assign name="var" value="123" />
其他标签的使用
1、在模版中直接使用PHP代码(不建议使用)
<php>echo "我是梁辉健"</php>
2、修改定界符
{$name} => <{$name}> 避免与js冲突
一、模版的包含
格式: <include file="完整模板文件名" />
<include file="read" />
<include file="Public:header" />
<include file="blue:User:read" />
<include file="$tplName" />
<include file="header" title="ThinkPHP框架"keywords="开源WEB开发框架"/> 在模版中变量 [$变量名] 接收
<include file='file1,file2' />
二、模版渲染
1、自动开启模版渲染,设置配置文件
?{__NOLAYOUT__}?=>?true?, //开启模版渲染模式
准备一个模版渲染页面,在页面使用{__CONTENT__}接收具体页面的内容
如果在某个具体模版中不希望使用喧嚷模版,可以在页首添加{__NOLAYOUT__}
2、不开启自动模版渲染可以在每一个具体页面的页首添加
<layout name=”layout”>
3、使用技巧
在渲染模版文件中
<include file="Public:header" />
{__CONTENT__}
<include file="Public:footer" />
三、模版的继承
<block name="title"><title>网站标题</title></block>
block标签必须指定name属性来标识当前区块的名称,这个标识在当前模板中应该是唯一的,block标签中可以包含任何模板内容,包括其他标签和变量,例如:
<block name="title"><title>{$web_title}</title></block>
你甚至还可以在区块中加载外部文件:
<block name="include"><include file="Public:header" /></block>
需要在子模版里面加入代码:<extend name="base" />
一、空模块和空操作
1、空操作
public function _empty($name){
$this->show('$name 不存在<a href="__APP__/Index/index">返回首页</a>'); }
2、空模块
class EmptyAction extends Action {
public function index(){
$name=MODEL_NAME;
$this->display('City:$name');
$this->show('<p> 该方法不存在</p>');
}
}
二、前置操作和后置操作
1、前置操作:__before__操作名
2、后置操作:__after__操作名
一、URL规则
1、默认是区分大小写的
2、如果不想区分大小写可以改配置文件
'URL_CASE_INSENSITIVE'=>'true', //URL不区分大小写
3、如果模块名为 UserGroupAction,那么url找模块就必须写成
http://localhost/ThinkPHP4/index.php/user_group/index
4、如果 'URL_CASE_INSENSITIVE'=>'false',那么url也可以写成 http://localhost/ThinkPHP4/index.php/UserGroup/index
二、伪静态
'URL_HTML_SUFFIX'=>'shtml|html|xml' //限制伪静态的后缀
三、URL路由
1、启动路由
要在配置文件中开启路由支持
2、使用路由
'URL_ROUTER_ON'=>'true',
'URL_ROUTE_RULES'=>array(
'year/:year\d/:mouth\d/:date\d'=>'Index/index'
),
1)规则表达式配置路由
'my'=>'Index/index' //静态地址路由
':id/:num'=>'Index/index' //动态地址路由
':my/:num'=>'Index/index' //动态和静态地址路由
'year/:year\d/:mouth\d/:date\d'=>'Index/index' //动态和静态地址路由 加上 \d 代表类型只能是数字。
'my/:id$'=>'Index/index' //加上$后面地址只能是 my/100不能再有其他内容。
2)正则表达式配置路由
'/^year\/(\d{4})\/(\d{2})\/(\d{2})/'=>'Index/index?year=:1&month=:2&date=:3',
? 越复杂的路由越往前面放
? 可以使用$作为完全匹配的路由规则
? 用正则匹配的方式
四、URL重写
五、URL生成
一、多赢用配置技巧
二、使用分组
三、页面调转
四、Ajax技巧