ThinkPHP框架我不是西西

1.拥有关系:用户表和身份证表关联,HAS_ONE(一对一),表示一个用户只有一个身份证。User控制器部分:ThinkPHP\Weibo\Home\Controller\UserController.class.php

5.3.0!');//开启调试模式建议开发阶段开启部署阶段注释或者设为false//define('APP_DEBUG',True);//定义应用目录define('APP_PATH','./Application/');//引入ThinkPHP入口文件require'./ThinkPHP/ThinkPHP.php';3.如果想按照自己的意愿设置应用目录名称,可以修改成这样:

5.3.0!');//开启调试模式建议开发阶段开启部署阶段注释或者设为false//define('APP_DEBUG',True);//修改框架目录define('APP_PATH','./Weibo/');//修改框架目录require'./Think/ThinkPHP.php';当第一次运行了这个配置后的应用程序,将会在根目录生成一个Weibo文件夹,应用程序的所有文件将全部存放在这里。三.自动生成当第一次访问应用入口文件的时候,会自动生成Weibo这个应用程序目录。里面包含了各种目录,说明如下:Common--应用公共模块|--Common--应用公共函数目录|--Conf--应用公共配置文件目录Home--默认生成的Home模块|--Conf--模块配置文件目录|--Common--模块函数公共目录|--Controller--模块控制器目录|--Model--模块模型目录|--View--模块视图文件目录Runtime--运行时目录|--Cache--模版缓存目录|--Data--数据目录|--Logs--日志目录|--Temp--缓存目录一个站是一个入口,index.php只有一个入口,就是应用程序入口。如果有多个站,或者后台,那就需要另一个入口。1.创建另一个站admin.php,应用目录改成对应的即可。

5.3.0!');//开启调试模式建议开发阶段开启部署阶段注释或者设为falsedefine('APP_DEBUG',True);//定义应用目录define('APP_PATH','./Admin/');//禁止目录主页生成define('BUILD_DIR_SECURE',false);//引入ThinkPHP入口文件require'./ThinkPHP/ThinkPHP.php';四.访问控制器1.控制器路径在:Weibo/Home/Controller下,有一个默认的控制器IndexController.class.php文件。2.控制器类的命名方式:控制器名(驼峰式,首字母大写)+Controller3.控制器文件的命名方式:类名+class.php创建一个控制器需要三个部分:1.设置命名空间;2.导入命名空间;3.控制器类

'配置值'//禁止访问模块(系统内置的)'MODULE_DENY_LIST'=>array('Common','Runtime'),);注意:当你去掉数组里的'Common',那么会提示:“无法加载控制器:Index”的错误信息。说明这个模块已经可以访问了。2.允许访问模块的设置。当设置了此选项,就务必把所有允许访问的模块都添加上,否则会变成拒绝访问。Weibo/Common/Conf/config.php

array('Home','Admin'),);3.如果有多个访问模块,那么在默认URL访问的时候,应该有一个首选访问。默认是Home,想设置Admin为默认,可以这么设置:Weibo/Common/Conf/config.php

'配置值'//只允许访问一个模块设置'MULTI_MODULE'=>false,);5.有时,你会觉得index.php/Admin这样很麻烦。你可能想直接admin.php就代表后台就方便很多,那么可以使用多入口设置。这里的多入口和上一节多个应用项目不同,而是通过admin.php访问Weibo目录下的Admin模块。将index.php复制出来改成admin.php,然后添加如下代码:Weibo/admin.php

//应用入口文件//检测PHP环境是否大于5.3if(version_compare(PHP_VERSION,'5.3.0','<'))die('requirePHP>5.3.0!');//开启调试模式建议开发阶段开启部署阶段注释或者设为falsedefine('APP_DEBUG',True);//Admin加载admin模块$_GET['m']='Admin';//默认指向Index控制器$_GET['c']='Index';//定义应用目录define('APP_PATH','./Weibo/');//引入ThinkPHP入口文件require'./ThinkPHP/ThinkPHP.php';二.URL模式ThinkPHP的URL模式有四种,默认是PATHINFO模式,其他三种分别为:普通模式、REWRITE和兼容模式。1.PATHINFO模式Weibo/Home/Controller/UserController.class.php

在这条URL上,Home表示模块,User表示控制器,test表示方法,user/xixi表示第一个键值对,pass/123表示第二个键值对。PATHINFO模式下默认的分隔符是/,我们可以设置为你想要的,比如:_Weibo/Common/Conf/config.php

'配置值'//全局配置定义'DB_TYPE'=>'mysql',//数据库类型'DB_HOST'=>'127.0.0.1',//服务器地址'DB_NAME'=>'thinkphp',//数据库名'DB_USER'=>'xixi',//用户名'DB_PWD'=>'123456',//密码'DB_PORT'=>3306,//端口'DB_PREFIX'=>'think_',//数据库表前缀);2.数据库全局配置信息除了PDO,均可以采用上面的设置。Weibo/Common/Conf/config.php

'配置值'//PDO专用定义'DB_TYPE'=>'pdo',//数据库类型'DB_USER'=>'xixi',//用户名'DB_PWD'=>'123456',//密码'DB_PREFIX'=>'think_',//数据库表前缀'DB_DSN'=>'mysql:host=127.0.0.1;dbname=thinkphp;charset=UTF8',//服务器地址,数据库名字连接);二.实例化模型连接上数据库后需要从数据库里操作数据,那么就需要实例化模型类。调试辅助工具Weibo/Common/Conf/config.php

'配置值'//页面Trace,调试辅助工具'SHOW_PAGE_TRACE'=>true,);1.Model基类处理方式(实例化Model类,传一个数据表名)Weibo/Home/Controller/UserController.class.php配置

namespaceHome\Controller;useThink\Controller;useThink\Model;classUserControllerextendsController{publicfunctionmodel(){//创建变量user,这个user将得到Model基类的句柄$user=newModel('User');//创建Model基类传递第一个参数(User表)//显示变量结构(检测是否连接数据库成功)//var_dump($user);//打印出所有数据结构//var_dump($user->select());}}2.Model基类处理方式传递三个参数:Model(['模型名'],['数据表前缀'],['数据库连接信息']);Weibo/Home/Controller/UserController.class.php配置

select());}}3.使用Model基类还需要导入命名空间,而使用M()方法,则不需要。Weibo/Home/Controller/UserController.class.php配置

select());}}4.对应数据表的模型定义UserModel。这种模型类并非必须定义的,只有当存在独立的业务逻辑或者属性的时候才需要。Weibo/Home/Mode/UserModel.class.php

select());}}为什么UserModel模型类没有指定任何表即可直接访问呢?因为这种模型类基本是直接操作数据表的,所以在命名规范上和数据表名是对应的。虽然使用模型类和数据表对应较为方便,但当有时我们需要更换表名、前缀、附加数据库名等,就需要一些字段定义的操作。为了更加方便的了解数据表的变化,我们使用一下页面Trace工具,可以时时的查询SQL的变化。数据表定义:(1)字段属性tablePrefix:定义模型对应数据表的前缀(2)字段属性tableName:不包含表前缀的数据表名称(3)字段属性trueTableName:包含表前缀的数据表名称(4)字段属性dbName:定义模型当前对应的数据库名称Weibo/Home/Mode/UserModel.class.php

select());}}怎么知道D()方法是调用的UserModelWeibo/Home/Mode/UserModel.class.php

select());}}8.有时,你可能想使用原生的SQL语句进行操作数据库。那么可以采用实例化空模型基类或者空M()方法。

query("SELECT*FROMthink_userWHEREuser='蜡笔小新'"));}}三.字段定义每个模型类操作着每个对应的数据表,在大多数情况下,系统会自动获取当前数据表的字段信息。而当模型类第一次实例化时,系统会自动缓存字段,并且永久缓存,除非删除了运行时缓存或者设置不缓存。如果调试模式下,则不会生成字段缓存文件,每次都是从数据表里重新获取。生成缓存的目的显而易见,就是为了快速响应。ThinkPHP默认是开启字段缓存,因为在实际运行中,不会更改字段结构。字段缓存文件保存在Runtime/Data/_fields/目录里,当你在开发阶段,字段和表会经常变动,所以要关闭缓存。关闭缓存的方法为:

//关闭字段缓存'DB_FIELDS_CACHE'=>false//开启了调试模式,自动关闭PS:如果开启缓存状态,新增了字段,那么可能新字段无法刷新出来,必须删除/Data/_fields文件夹,重新获取字段。

getDbFields());}}可以使用手动定义数据表字段的方式取代字段缓存方式,这种方式可以提高性能,避免IO开销。

getDbFields());}}ThinkPHP--模型操作部分-数据库操作-SQL查询语句一.查询方式ThinkPHP提供了三种基本的查询方式:字符串条件查询、索引数组条件查询和对象条件查询。在大多数情况下,推荐使用索引数组和对象方式作为查询条件,因为会更加安全1.使用字符串作为条件查询

where('id=1')->select());//连贯操作:user指向where,where本身又返回的user对象所以还能指向select}}最终生成的SQL语句:SELECT*FROM`think_user`WHERE(id=1)2.使用索引数组作为查询条件

where($condition)->select());//只需要传变量就可以了不需要写字符串形式}}最终生成的SQL语句:SELECT*FROM`think_user`WHERE(`id`=1)AND(`user`='蜡笔小新')索引数组查询的默认逻辑关系是AND,如果想改变为OR,可以使用_logic定义查询逻辑。

where($condition)->select());//只需要传变量就可以了不需要写字符串形式}}最终生成的SQL语句:SELECT*FROM`think_user`WHERE(`id`=1)OR(`user`='蜡笔小新')3.使用对象方式来查询

where($map)->select());}}最终生成的SQL语句:SELECT*FROM`think_user`WHERE(`id`=1)(2)NEQ表达式不等于(<>)

)$user=M('User');$map['id']=array('neq',1);//where为id<>1var_dump($user->where($map)->select());}}最终生成的SQL语句:SELECT*FROM`think_user`WHERE(`id`<>1)(3)GT表达式大于(>)

)$user=M('User');$map['id']=array('gt',1);//where为id>1var_dump($user->where($map)->select());}}最终生成的SQL语句:SELECT*FROM`think_user`WHERE(`id`>1)(4)EGT表达式大于等于(>=)

=)$user=M('User');$map['id']=array('egt',1);//where为id>=1var_dump($user->where($map)->select());}}最终生成的SQL语句:SELECT*FROM`think_user`WHERE(`id`>=1)(5)LT表达式小于(<)

where($map)->select());}}最终生成的SQL语句:SELECT*FROM`think_user`WHERE(`id`<2)(6)ELT表达式小于等于(<=)

where($map)->select());}}最终生成的SQL语句:SELECT*FROM`think_user`WHERE(`id`<=1)(7)[NOT]LIKE表达式模糊查询

where($map)->select());}}最终生成的SQL语句(包含小字的):SELECT*FROM`think_user`WHERE(`user`LIKE'%小%')

where($map)->select());}}最终生成的SQL语句(不包含小字的):SELECT*FROM`think_user`WHERE(`user`NOTLIKE'%小%')

where($map)->select());}}最终生成的SQL语句(包含小还包含蜡字):SELECT*FROM`think_user`WHERE((`user`LIKE'%小%'AND`user`LIKE'%蜡%'))(8)[NOT]BETWEEN表达式(不在)区间查询

where($map)->select());}}最终生成的SQL语句(范围在id1-3):SELECT*FROM`think_user`WHERE((`id`BETWEEN'1'AND'3'))

where($map)->select());}}最终生成的SQL语句(范围不在id1-3):SELECT*FROM`think_user`WHERE((`id`NOTBETWEEN'1'AND'3'))(9)[NOT]IN表达式(不在)IN查询

where($map)->select());}}最终生成的SQL语句(范围在id是1,2,4):SELECT*FROM`think_user`WHERE(`id`IN('1','2','4'))

where($map)->select());}}最终生成的SQL语句(范围不在id是1,2,4):SELECT*FROM`think_user`WHERE(`id`NOTIN('1','2','4'))(10)EXP表达式查询支持SQL语法

where($map)->select());}}最终生成的SQL语句(范围在id是1,2,4)SELECT*FROM`think_user`WHERE((`id`in(1,2,4)))

where($map)->select());}}最终生成的SQL语句:SELECT*FROM`think_user`WHERE((`id`=1))OR((`user`="蜡笔小新"))三.快捷查询快捷查询方式是一种多字段查询的简化写法,在多个字段之间用'|'隔开表示OR,用'&'隔开表示AND。1.不同字段相同查询条件

where($map)->select());}}最终生成的SQL语句(user=蜡笔小新或者email=蜡笔小新):SELECT*FROM`think_user`WHERE((`user`='蜡笔小新')OR(`email`='蜡笔小新'))2.不同字段不同查询条件

true);var_dump($user->where($map)->select());}}最终生成的SQL语句(查询ID=1,user=蜡笔小心的):SELECT*FROM`think_user`WHERE((`id`=1)AND(`user`='蜡笔小新'))注意:设置'_multi'为true,是为了让id对应1,让user对应'蜡笔小新',否则就会出现id对应了1还要对应'蜡笔小新'的情况。而且,这设置要在放在数组最后。

true);var_dump($user->where($map)->select());}}最终生成的SQL语句(查询ID>0的,user=蜡笔小新):SELECT*FROM`think_user`WHERE((`id`>0)AND(`user`='蜡笔小新'))四.区间查询ThinkPHP支持对某个字段的区间查询。

where($map)->select());}}最终生成的SQL语句(查询ID>1的并且ID<4的):SELECT*FROM`think_user`WHERE((`id`>1)AND(`id`<4))

where($map)->select());}}最终生成的SQL语句(查询ID>1或者ID<4的):SELECT*FROM`think_user`WHERE((`id`>1)OR(`id`<4))五.组合查询组合查询是基于索引数组查询方式的一个扩展性查询,添加了字符串查询(_string)、复合查询(_complex)、请求字符串查询(_query),由于采用的是索引数组,重复的会被覆盖。方式一:安全性低

where($map)->select());}}最终生成的SQL语句(查询ID=1并且user=蜡笔小新并且email=xiaoxin@163.com):SELECT*FROM`think_user`WHERE(`id`=1)AND(user="蜡笔小新"ANDemail="xiaoxin@163.com")方式二:全部以连接符(安全推荐)

where($map)->select());}}最终生成的SQL语句(查询ID=1并且user=蜡笔小新并且email=xiaoxin@163.com):SELECT*FROM`think_user`WHERE(`id`=1)AND(`user`='蜡笔小新'OR`email`='xiaoxin@163.com')方式三:

where($map)->select());}}最终生成的SQL语句(查询ID=1或者user=小或者ID=3):SELECT*FROM`think_user`WHERE((`user`LIKE'%小%')OR(`id`=1))OR(`id`=3)六.统计查询ThinkPHP提供了一些数据统计查询的方法。统计查询出几个字段

count());}}统计查询出几个字段:string'2'(length=1)语句:SELECTCOUNT(*)AStp_countFROM`think_user`LIMIT1统计查询出几个字段(遇到空不统计)

count('email'));}}统计查询出几个字段(遇到空不统计):string'2'(length=1)语句:SELECTCOUNT(email)AStp_countFROM`think_user`LIMIT1最大值:

max('id'));}}统计查询最大值:string'2'(length=1)语句:SELECTMAX(id)AStp_maxFROM`think_user`LIMIT1最小值:

min('id'));}}查询最小值:string'1'(length=1)语句:SELECTMIN(id)AStp_minFROM`think_user`LIMIT1平均值:

avg('id'));}}查询平均值:string'1.5000'(length=6)语句:SELECTAVG(id)AStp_avgFROM`think_user`LIMIT1总和:

sum('id'));}}查询总和值:string'3'(length=1)语句:SELECTSUM(id)AStp_sumFROM`think_user`LIMIT1七.动态查询借助PHP5语言的特性,ThinkPHP实现了动态查询。1.getBy动态查询

getByemail('xiaoxin@163.com'));}}查找email=xiaoin@163.com的数据sql语句:SELECT*FROM`think_user`WHERE(`email`='xiaoxin@163.com')LIMIT12.getFieldBy动态查询

getFieldByUser('蜡笔小新','id'));}}通过user得到蜡笔小新相对应id值string'1'(length=1)语句:SELECT`id`FROM`think_user`WHERE(`user`='蜡笔小新')LIMIT1八.SQL查询ThinkPHP支持原生SQL查询。1.query读取

query('SELECT*FROMthink_user'));}}查询think_user表sql语句:SELECT*FROMthink_user2.execute写入

where('idin(1,2,3)')->order('dateDESC')->limit(2)->select());}}查询id=1,2,3里的前俩个数据sql语句:SELECT*FROM`think_user`WHERE(idin(1,2,3))ORDERBYdateDESCLIMIT2注意:这里的where、order和limit方法都是连贯操作方法,所以它们都能返回$user本身,可以互换位置。而select方法不是连贯方法,需要放在最后,用以显示数据集。

where('id=3')->delete());}}把ID=3的删除DELETEFROM`think_user`WHERE(id=3)二.连贯方法1.wherewhere方法支持字符串条件、数组条件(推荐用法)和多次调用。字符串方式(不推荐)

where('id=1')->select());}}查询ID=1的sql语句:SELECT*FROM`think_user`WHERE(id=1)索引数组方式

where($map)->select());}}查询ID=1的sql语句:SELECT*FROM`think_user`WHERE(`id`=1)多次调用方式

where($map)->where('user="蜡笔小新"')->select());}}查询ID=1并且user=蜡笔小新的sql语句:SELECT*FROM`think_user`WHERE(`id`=1)AND(user="蜡笔小新")2.orderorder用于对结果集排序。倒序

order('iddesc')->select());//正序默认或ASC}}查询ID倒序的sql:SELECT*FROM`think_user`ORDERBYiddesc数组形式防止字段和mysql关键字冲突

order(array('id'=>'DESC'))->select());}}查询ID倒序的sql:SELECT*FROM`think_user`ORDERBY`id`DESC3.feildfeild方法可以返回或操作字段,可以用于查询和写入操作。只显示id和user两个字段

field('id,user')->select());}}只显示id和user两个字段的sql:SELECT`id`,`user`FROM`think_user`使用SQL函数和别名

field('SUM(id)ascount,user')->select());}}统计ID的总和和别名:SELECTSUM(id)ascount,`user`FROM`think_user`使用数组参数结合SQL函数

field(array('id','LEFT(user,3)'=>'left_user'))->select());}}取id和user的前三位把别名改变为left_user直接指向left_user:SELECT`id`,LEFT(user,3)AS`left_user`FROM`think_user`获取所有数据

field()->select());//可以传入*号,或者省略方法}}获取所有数据sql:SELECT*FROM`think_user`3.limitlimit方法主要用于指定查询和操作的数量。限制结果集数量

limit(2)->select());}}只显示俩条sql:SELECT*FROM`think_user`LIMIT2分页查询

limit(0,2)->select());//0代表从第1条开始,2代表显示俩条}}从第1条开始每页显示俩条sql:SELECT*FROM`think_user`LIMIT0,24.pagepage方法完全用于分页查询。

page(1,2)->select());//1代表第一页,2代表每页显示俩条}}从第1条开始每页显示俩条sql:SELECT*FROM`think_user`LIMIT0,25.tabletable方法用于数据表操作,主要是切换数据表或多表操作。

table('think_info')->select());}}切换到think_info这张表:SELECT*FROM`think_info`获取简化表名

table('__USER__')->select());//__INFO__尚可}}切换到think_info这张表:SELECT*FROM`think_user`多表查询

field('a.id,b.id')->table('__USER__a,__INFO__b')->select());}}查询双表think_usera,think_infob语句:SELECTa.id,b.idFROMthink_usera,think_infob数组形式夺标查询

field('a.id,b.id')->table(array('think_user'=>'a','think_info'=>'b'))->select());}}语句:SELECTa.id,b.idFROM`think_user``a`,`think_info``b`6.aliasalias用于设置数据表别名

alias('a')->select());}}设置数据表的别名为think_usera语句:SELECT*FROMthink_usera7.groupgroup方法通常用于对结合函数统计的结果集分组。

field('user,max(id)')->group('id')->select());}}以ID进行分组:SELECT`user`,max(id)FROM`think_user`GROUPBYid8.havinghaving方法一般用于配合group方法完成从分组的结果中再筛选数据。

field('user,max(id)')->group('id')->having('id>2')->select());}}sql语句:SELECT`user`,max(id)FROM`think_user`GROUPBYidHAVINGid>29.commentcomment方法用于对SQL语句进行注释

comment('所有用户')->select());}}sql注释语句:SELECT*FROM`think_user`/*所有用户*/10.joinjoin方法用于多表的连接查询。

join('think_userONthink_info.id=think_user.id')->select());//__USER__和__INFO__代替}}查看think_info.id表和think_user.id表ID是否一样语句:SELECT*FROM`think_user`INNERJOINthink_userONthink_info.id=think_user.id11.unionunion方法用于合并多个SELECT的结果集

union("SELECT*FROMthink_info")->select());}}合并think_user和think_info的结果集语句:SELECT*FROM`think_user`UNIONSELECT*FROMthink_info12.distinctdistinct方法用于返回唯一不同的值

distinct(true)->field('user')->select());}}返回不重复的user语句:SELECTDISTINCT`user`FROM`think_user`13.cachecache用于查询缓存操作

cache(true)->select());}}查询think_user表用缓存语句:SELECT*FROM`think_user`注意:第一次查询数据库,第二次查询相同的内容直接调用缓存,不用再查询数据库三.命名范围命名范围其实就是将SQL语句封装在模型定义类里,而不在控制器里。这样的分层操作有利于代码的可读性,避免开发人员在写CURD操作时出现问题。架构人员只要在命名范围内合理的规划即可,类似于架构师架构了接口,让开发人员面向接口开发一样。要使用命名范围,第一步要定义属性:Weibo\Home\Model\UserModel.class.php

array('where'=>array('id'=>1),),'sql2'=>array('order'=>'dateDESC','limit'=>2,),'default'=>array('where'=>array('id'=>2),),);}命名范围支持的属性有:where、field、order、table、limit、page、having、group、lock、distinct、cache。调用端:单个scope方法

scope('sql1')->select());//scope方法调用}}调用Weibo\Home\Model\UserModel.class.php里的sql1语句:SELECT*FROM`think_user`WHERE(`id`=1)多个scope方法

scope('sql1')->scope('sql2')->select());}}调用Weibo\Home\Model\UserModel.class.php里的sql1和sql2default默认

scope()->select());//传递default也行}}调用Weibo\Home\Model\UserModel.class.php里的default语句:SELECT*FROM`think_user`WHERE(`id`=2)对命名范围的SQL进行调整

scope('sql2',array('limit'=>4))->select());}}调用Weibo\Home\Model\UserModel.class.php里的sql2把'limit'=>4语句:SELECT*FROM`think_user`ORDERBYdateDESCLIMIT2直接覆盖命名范围

scope(array('where'=>1,'order'=>'dateDESC','limit'=>2))->select());}直接覆盖命名范围语句:SELECT*FROM`think_user`ORDERBYdateDESCLIMIT2直接用命名范围名调用

sql2()->select());}}SELECT*FROM`think_user`ORDERBYdateDESCLIMIT2

create());//create只提交跟user对应的字段}}create返回了一个数组数组包含user和email,生日没有提交出去,因为生日不存在User表里的:array(size=2)'user'=>string'蜡笔小新'(length=12)'email'=>string'xiaoxin@qq.com'(length=14)

field('user')->create());}}只显示userarray(size=1)'user'=>string'蜡笔小新'(length=12)(2)在模型类里限制字段email路径:ThinkPHP/Weibo/Home/Common/Model/UserModle.class.php代码

field('user')->create());}}只显示user:array(size=1)'user'=>string'蜡笔小新'(length=12)2.validate,用于数据自动验证;3.auto,用于数据自动完成;4.token,用于令牌验证二.数据写入(add)数据写入使用的是add()方法。方式一:普通方式新增一条数据

create();$data['date']=date('Y-m-dH:i:s');$user->data($data)->add();}}通过提交页面提交后sql语句:INSERTINTO`think_user`(`user`,`email`,`date`)VALUES('西西456','xixi@qq.com','2018-04-1413:50:44')(2)data连贯方法支持字符串、数组、对象

find());//可以传递数字参数,AR模式}}sql语句:SELECT*FROM`think_user`LIMIT1显示默认所有数据

select());//可以传递数组形式的SQL}}sql语句:SELECT*FROM`think_user`获取第一条user字段的值

getField('user'));}}sql语句:SELECT`user`FROM`think_user`LIMIT1获取所有user字段的值

getField('user',true));}}sql语句:SELECT`user`FROM`think_user`传递多个字段,获取所有(重复的被屏蔽)

getField('user,email'));}}sql语句:SELECT`user`,`email`FROM`think_user`用id冒号分隔

getField('id,user,email',':'));}}sql语句:SELECT`id`,`user`,`email`FROM`think_user`限制2条数据

getField('id,user,email',2));}}sql语句:SELECT`id`,`user`,`email`FROM`think_user`LIMIT2四.数据更新(save)数据更新使用的方法是save()方法,主要是对数据的修改操作。

where($map)->save($data);//成功后返回1,否则0}}sql语句:UPDATE`think_user`SET`user`='蜡笔大新',`email`='daxin@qq.com'WHERE(`id`=1)判断主键是条件(可读性差)

create();//POST必须包含主键$user->save();}}结合create提交后sql语句:UPDATE`think_user`SET`user`='蜡笔大新',`email`='113194773@qq.com'WHERE(`id`=1)修改某一个值

where($map)->setField('user','蜡笔小新');}}sql语句:UPDATE`think_user`SET`user`='蜡笔小新'WHERE(`id`=1)统计累计,累加count字段加1

where($map)->setInc('count',1);//累加}}sql语句:UPDATE`think_user`SET`count`=count+1WHERE(`id`=1)统计累计,累减count字段减1

where($map)->setDec('count',1);//setDec累减}}sql语句:UPDATE`think_user`SET`count`=count-1WHERE(`id`=1)五.数据删除(delete)数据删除使用的方法是delete()方法。直接删除主键(id=4)

delete(4);}}sql语句:DELETEFROM`think_user`WHERE(`id`=4)根据ID来删除

where($map)->delete();}}sql语句:DELETEFROM`think_user`WHERE(`id`=5)批量删除多个

where('1')->delete();}}delete()方法支持的连贯操作有:1.where,查询或更新条件;2.table,要操作的数据表名称;3.alias,数据表别名;4.order,结果排序;5.lock,锁;6.relation,关联查询;7.scope,命名范围;8.bind,数据绑定操作;9.comment,SQL注释。六.ActiveReocrd模式(ar)这种模式最大的特别就是简化了CURD的操作,并且采用对象化的操作方式,便于使用和理解。ActiveReocrd模式添加一条数据

user='火影忍者';$user->email='huoyin@qq.com';$user->date=date('Y-m-dH:i:s');$user->add();}}sql语句:INSERTINTO`think_user`(`user`,`email`,`date`)VALUES('火影忍者','huoyin@qq.com','2018-04-1412:35:33')找到主键为2的值

find(2));}}sql语句:SELECT*FROM`think_user`WHERE(`id`=2)LIMIT1查找user=西西的记录并输出

getByUser('西西'));//输出userecho$user->user;}}sql语句:SELECT*FROM`think_user`WHERE(`user`='西西')LIMIT1通过主键查询1,2,3数据

select('1,2,3'));}}sql语句:SELECT*FROM`think_user`WHERE(`id`IN('1','2','3'))查找id=3的把user改成蜡笔老新(效率不高)

find(3);//找到第一条$user->user='蜡笔老新';//改成$user->save();}}sql语句:SELECT*FROM`think_user`WHERE(`id`=3)LIMIT1UPDATE`think_user`SET`user`='蜡笔老新',`email`='xixi.163@.com',`count`=null,`date`='2018-04-1411:44:44'WHERE(`id`=3)查找id=3的删除掉(效率不高)

create());}}ThinkPHP--模型操作部分----数据库操作---自动验证ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候进行自动验证。一.验证规则数据验证可以对表单中的字段进行非法的验证操作。一般提供了两种验证方式:静态定义($_validate属性处理字段的)和动态验证(validate()方法灵活性比较高)。ThinkPHP/Weibo/Home/Model/UserModle.class.php添加需要验证限制字段

create($date)){echo'所有字段验证成功';}else{var_dump($user->getError());//自带getError方法}}}当user有值的情况下显示:所有字段验证成功当user没有值的情况下显示::string'用户不得为空!'二.静态定义在模型类里预先定义好该模型的自动验证规则,就是静态定义。ThinkPHP提供了九种自动验证内置方案ThinkPHP/Weibo/Home/Model/UserModle.class.php添加需要验证限制字段

create($data)){echo'所有数据验证成功!';}else{//输出错误信息var_dump($user->getError());}}}自定义规则用户名字必须在3-5位回调方法ThinkPHP/Weibo/Home/Model/UserModle.class.php添加需要验证限制字段

$max){//如果$len小于$min或者大于$maxreturnfalse;//返回false}else{returntrue;}}ThinkPHP/Weibo/Home/Controller/UserController.class.php判断验证

create($data)){echo'所有数据验证成功!';}else{//输出错误信息var_dump($user->getError());}}}函数验证附加规则function,ThinkPHP/Weibo/Home/Model/UserModle.class.php添加需要验证限制字段

$max){//如果$len小于$min或者大于$maxreturnfalse;//返回false}else{returntrue;}}ThinkPHP/Weibo/Home/Controller/UserController.class.php判断验证

create($data)){echo'所有数据验证成功!';}else{//返回JSON格式$this->ajaxReturn($user->getError());}}}三.动态验证动态验证就是把验证的规则放在控制器端,这样,在操作的时候比较灵活,缺点就是比较混乱。ThinkPHP/Weibo/Home/Controller/UserController.class.php全部写在控制器里

validate($rule)->create($data)){//动态validate方法定义传$rule数组变量echo'验证所有字段成功!';}else{var_dump($user->geterror());}}}当用户名user有值显示验证所有字段成功!当用户名user没有值显示用户名不得为空

ThinkPHP--模型操作部分----数据库操作--自动完成ThinkPHP模型层提供的数据处理方法,主要用于数据的自动处理和过滤,使用create()方法创建数据是会自动完成。一.完成规则自动完成一般通过默认字段写入、安全字段过滤以及业务逻辑的自动处理等。有两种方式实现自动完成的规则:1.静态方式:在模型类里通过$_auto属性定义处理规则;2动态方式:使用模型类的auto方法动态创建自动处理规则。1.完成字段:必填,需要的字段名;2.完成规则:必填,配合附加规则完成;3.完成条件:可选,具体如下:(1)self::MODEL_INSERT或1,新增数据的时候处理(默认);(2)self::MODEL_UPDATE或2,更新数据的时候处理;(3)self::MODEL_BOTH或3,所有情况均处理。4.配合完成规则使用,包括一下规则:function规则:函数完成,定义的验证规则是一个函数名callback规则:方法完成,定义的验证规则是当前模型类的一个方法field规则:用其他字段填充,表示填充的内容是一个其他字段的值string规则:字符串(默认)ignore规则:为空则忽略(3.1.2新增)为了测试方便,我们可以直接通过模拟提交POST:ThinkPHP/Weibo/Home/Controller/UserController.class.php提交成功新增一条数据

create($data)){//如果判断成功了$user->add();//对他进行新增操作}}}二.静态定义在模型类里预先定义好该模型的自动完成规则,就是静态定义。ThinkPHP/Weibo/Home/Model/UserModle.class.php模型在新增数据的同时给count字段设置为1

create($data)){//如果判断成功了$user->save();//对他进行修改操作}}}ThinkPHP/Weibo/Home/Model/UserModle.class.php模型在新增数据的同时留空的user忽略不修改

auto($rules)->create($data)){$user->add();}}}ThinkPHP--视图(view)ThinkPHP视图,视图是Web的可见内容,一般是HTML结合PHP获取的数据提供给用户使用的部分,属于MVC中的V。一.模版定义模版在使用之前需要一定的设置,才能方便开发者使用。每个模块的模版文件是独立的,为了对模版文件更加有效的管理,ThinkPHP对模版文件机型目录划分,默认的模版文件定义规则是:视图目录View/[模版主题/]控制器名User/操作名index+模版后缀.html第一步:在User控制器UserController.class.php模块执行一条语句:

display();}}注意:什么都没有定义的情况下,会自动报错,错误信息提示如下模板不存在:./Weibo/Home/View/User/index.html创建:/Weibo/Home/View/User/index.html

Title这是模版文件通过这个错误提示,我们只要在View目录下创建User目录,并在User目录下创建index.html文件,这时模版渲染模版输出成功。默认情况下视图目录是View,如果你想改变成别的目录名可以设置:在公共的核心库里配置文件Weibo/Common/Conf/config.php修改模版的视图目录为Template

'Template',);默认情况下的模版文件后缀是.html,如果你想改变成别的后缀可以设置:修改模版中的文件的后缀为.tpl

'.tpl');如果感觉每一个模块,都要创建相应的目录太过于麻烦,可以设置:用下划线代替目录层次为Weibo/Home/User_index.html

'_',);如果不想将模版存在在当前Weibo目录下,而设置在外部:设置外部的模版目录./Public/Home/User/index.html

'./Public/',);如果一个系统要考虑多套界面皮肤的话,要考虑到默认皮肤以及可选皮肤设置默认主题目录为:./Weibo/Home/View/default/User/index.html

'default',);切换另外一个主题blue./Weibo/Home/View/blue/User/index.html

theme('blue')->display();}}二.赋值和渲染如果要在模版中输出变量,必须在控制器中把变量传递给模版。ThinkPHP提供了assign方法对模版变量赋值,无论何种变量类型都统一使用assign赋值。/Weibo/Home/View/User/index.html

Title我是:{$user}在User控制器UserController.class.php加上模版传递变量

assign('user','蜡笔小新');//渲染模版输出$this->display();}}输出结果:我是蜡笔小新注意:这个方法必须在display()方法之前使用,保存变量正确传递渲染模版输出使用的是display方法,有三个可选参数:display([模版文件][,字符编码][,输出类型]);如果不传递任何参数,它会按照默认的目录定位模版的位置:当前模块/默认视图目录/当前控制器/当前操作.html在User控制器UserController.class.php修改

display('add');//修改默认模版,目录加模版:./Weibo/Home/View/default/Bbb/add.tpl$this->display('Bbb/add');//修改默认模版,模块加目录加模版:./Weibo/Admin/View/default/Bbb/add.tpl$this->display('Admin@Bbb/add');//修改默认模版,主题加目录加模版:./Weibo/Home/View/blue/Bbb/add.tpl$this->theme('blue')->display('Bbb/add');//修改默认模版,自定义模版(Template和Weibo同级):./Template/Public/add.tpl$this->display('./Template/Public/add.tpl');}}三.模版地址ThinkPHP封装了一个T函数,专门用于生成模版文件。格式如下:T([资源://][模块@][主题/][控制器/]操作,[视图分层]);在User控制器UserController.class.php添加打印当前模版地址

display(T());}}四.获取内容如果需要获取模版的内容,可以使用fetch()方法,这个方法的使用和display()方法一致。通过$content获取模版里的内容再用show渲染出来

fetch();//var_dump($content);//输出模版里的内容//通过内容再渲染输出$this->show($content);}}注意:使用fetch()方法获取内容,主要是为了可以处理和过滤更加复杂的内容。然后处理后再由show()方法输出(保证出来的信息是安全稳定性的)。

ThinkPHP--视图--模版基础ThinkPHP模版,模版是将视图里要展现出来的数据进行解析编译的这么一个功能的东西,ThinkPHP内置了一个基于XML的性能卓越的模版引擎ThinkTemplate,使用了动态编译和缓存技术,支持自定义标签库。一.变量输出在模版中输出变量是非常容易的,使用assign()方法,以键值对的方式传递变量和值。1.以键值对方式传递变量和值:/Weibo/Home/View/User/index.html

Title我是:{$user}<--!模版编译后的结果是:-->//可以在Runtime可以查看在User控制器UserController.class.php加上模版传递变量

assign('user',$user);//这个user是模版里传递过去的变量//渲染模版输出$this->display();}}2.模版标签{和$之间不能用任何空格,否则无法解析。如果你想更换两个{}可以设置:把左右定界符改成了<{}>

'<{','TMPL_R_DELIM'=>'}>',);/Weibo/Home/View/User/index.html改成<{$user}>才能接收到变量

Title我是:<{$user}>3.如果传递一个数组,我们直接传递过去后,通过两种方式调用:在User控制器UserController.class.php加上数组

assign('data',$data);//渲染模版输出$this->display();}}/Weibo/Home/View/User/index.html俩种输出方式

Title输出方式一:User:{$data.user}Email:{$data.email}输出方式二:User:{$data['user']}Email:{$data['email']}输出结果:输出方式一:User:蜡笔小新Email:xinxin@163.com输出方式二:User:蜡笔小新Email:xinxin@163.com4.如果传递一个对象,我们直接传递过去后,通过两种方式调用:在User控制器UserController.class.php加上对象

user='蜡笔小新';//指向user=蜡笔小新$data->email='xinxin@163.com';$this->assign('data',$data);//渲染模版输出$this->display();}}/Weibo/Home/View/User/index.html俩种输出方式

Title输出方式一:User:{$data->user}Email:{$data->email}输出方式二:User:{$data:user}Email:{$data:email}输出结果:输出方式一:User:蜡笔小新Email:xinxin@163.com输出方式二:User:蜡笔小新Email:xinxin@163.com二.系统变量在模版中,不但可以输出PHP的系统变量,还可以输出ThinkPHP的系统变量。1.输出PHP系统变量:/Weibo/Home/View/User/index.html

Title{$Think.server.script_name}编译后:$_SERVER['SCRIPT_NAME']
{$Think.session.admin}编译后:$_SESSION['admin']
{$Think.get.user}编译后:$_GET['user']
{$Think.post.user}编译后:$_POST['user']
{$Think.request.user}编译后:$_REQUEST['user']
{$Think.cookie.name}编译后:$_COOKIE['name']
2.输出ThinkPHP的系统变量:/Weibo/Home/View/User/index.html

Title{$Think.const.APP_PATH}
{$Think.config.url_model}
{$Think.lang.var_error}
三.使用函数如果有时,我们需要在模版中使用PHP函数的话,可以按照下面的格式使用:在User控制器UserController.class.php传递变量

assign('user',$user);//这个user是模版里传递过去的变量//渲染模版输出$this->display();}}1./Weibo/Home/View/User/index.html接收所有变量后加上md5值

Title{$user|md5}2./Weibo/Home/View/User/index.html接收变量前三位

Title{$user|mb_substr=0,3,'UTF-8'}打印结果:蜡笔小3./Weibo/Home/View/User/index.html接收变量前三位后加上md5值多个函数用"|"隔开即可方式一:

Title{$user|mb_substr=0,3,'UTF-8'|md5|sha1}打印结果:6bcbe978003331b82ad38ac828d2cfcd5cabfcaa如果你觉得以上写法需要在脑海里二次翻译,太过于麻烦,那么可以用以下的格式写法:方式二:

Title{$date|date="Y-m-dH:i:s",###}打印结果:2018-04-1512:07:59注意:表示date函数传入两个参数,每个参数用逗号分割,这里第一个参数是Y-m-dH:i:s,第二个参数是前面要输出的date变量,因为该变量是第二个参数,因此需要用###标识变量位置,编译后的结果是:5.当传递过来的变量如果没有值的时候,模版提供了默认值输出功能。/Weibo/Home/View/User/index.html当接收过来没数据可以提供默认输出

Title{$user|default='什么都没有!'}6.可以在模版中使用运算符,包括对“+”、“-”、“*”、“/”、“%”、“--”和“++”的支持。User控制器UserController.class.php传递变量num=10

assign('num',10);//传递num=10//渲染模版输出$this->display();}}/Weibo/Home/View/User/index.html接收变量后加10

Title{$num+10}打印结果:20模版还支持三元运算符:

assign('user',$user);//这个user是模版里传递过去的变量//渲染模版输出$this->display();}}/Weibo/Home/View/User/index.html接收变量后判断有值无值

Title{$user'有值':'无值'}打印:有值7.包含文件在一个系统中,可以包含通用的头文件和脚文件:header和footer。由于每个页面的头脚都是相同的,所以需要独立分离出来,再用包含文件引入他们。我们可以在View目录下default主题目录下创建一个public目录,这个目录专门存放公共调用模版文件。头区域目录:/Weibo/Home/View/default/Public/header.html

Title这里是头文件

尾区域目录:Weibo/Home/View/default/Public//footer.html

Title这里是脚文件

包含文件引入头尾文件

Title我是内容最后打印结果:这里是头文件我是内容这里是脚文件六.模版注释模版支持注释功能,提供个模版制作人员参考。

Title{//单行注释}{/*多行注释*/}第一步:创建头文件和尾文件(1)创建头文件:/Weibo/Home/View/default/Public/header.html

这里是头文件

(2)创建脚文件:/Weibo/Home/View/default/Public/footer.html

这里是尾文件

第二步:创建Public下base.tpl模版基页(1)base.tpl模版基页需要引入头文件和尾文件(2)设置不同页面的标题内容<blockname="title">标题</block>(3)设置不通页面的主要内容主要内容

<blockname="title">标题</block>主要内容第三步:主页面index.html和分页面select.html页面分别引入base.tpl模版基页(1)主页面index.html

index的标题这里做页面的布局设计输出结果:这里是头文件这里做页面的布局设计这里是脚文件源代码:index的标题这里是头文件这里做页面的布局设计这里是脚文件

(2)分页面select.html

select的标题这里做页面的布局设计输出结果:这里是头文件这里做页面的布局设计这里是脚文件源代码:select的标题这里是头文件这里做页面的布局设计这里是脚文件八.模版布局ThinkPHP的模版引擎内置了布局模版功能支持,可以方便实现模版布局以及布局嵌套功能。有三种布局方式:1.全局配置方式第一步:配置文件需要添加:Weibo/Common/Conf/config.cfg

'default',//开启模版布局功能,并指定基础页'LAYOUT_ON'=>true,'LAYOUT_NAME'=>'Public/layout',//layout.html文件);第二步:/Weibo/Home/View/default/Public/layout.html(1)基础页引入头尾文件(2)基础页,{__CONTENT__}将被子页面的内容替换

标题{__CONTENT__}第三步:/Weibo/Home/View/default/User/index.html添加内容部分最后打印结果:这里是头文件内容部分这里是脚文件自模版可以设置不载入模版页/Weibo/Home/View/default/User/index.html子模版不需要载入模版基页,可以在开头加上{__NOLAYOUT__}

{__NOLAYOUT__}内容部分打印结果:内容部分2.模版标签方式标签方式,并不需要在系统做任何配置,和模版继承类似,直接引入即可。/Weibo/Home/View/default/User/index.html直接继承

内容部分3.layout控制布局这个方法是在控制器里操作的。User控制器UserController.class.php设置指定基页

display();}}Weibo/Home/View/default/User/index.html添加内容部分最后打印结果:这里是头文件内容部分这里是脚文件九.模版替换在模版渲染之前,系统还会对读取的模版内容进行一些特殊字符串替换操作,也就实现了模版输出的替换和过滤。__ROOT__:会替换成当前网站的地址(不含域名)__APP__:会替换成当前应用的URL地址(不含域名)__MODULE__:会替换成当前模块的URL地址(不含域名)__CONTROLLER__(或者__URL__兼容考虑):会替换成当前控制器的URL地址(不含域名)__ACTION__:会替换成当前操作的URL地址(不含域名)__SELF__:会替换成当前的页面URL__PUBLIC__:会被替换成当前网站的公共目录通常是/Public/Weibo/Home/View/default/User/index.html添加:

__ROOT__
__APP__
__MODULE__
__CONTROLLER__
__ACTION_
__SELF__L
__PUBLIC__
打印结果:/ThinkPHP/ThinkPHP/index.php/ThinkPHP/index.php/Home/ThinkPHP/index.php/Home/User__ACTION_/ThinkPHP/Home/User/indexL/ThinkPHP/Public也可以更改默认的/Public和上传路径规则配置文件:Weibo/Common/Conf/config.cfg

'default','TMPL_PARSE_STRING'=>array('__PUBLIC__'=>'/Common',//更改默认的/Public替换规则'__UPLOAD__'=>'/Uploads',//增加新的上传路径替换规则));ThinkPHP--视图--内置标签ThinkPHP模版中的内置标签,所谓内置标签就是模版引擎提供的一组可以完成控制、循环和判断功能的类似HTML语法的标签。一.判断比较ThinkPHP内置了IF标签用于在模版中进行条件判断User控制器UserController.class.php设置变量

assign('user',$user);//渲染模版输出$this->display();}}Weibo/Home/View/default/User/index.html模版中进行条件判断:

Inserttitleher小新一护错误判断结果:小新注意:condition属性中支持eq等判断表达式,由于会导致模版解析混淆,所以不支持“>”、“<”等表达式。1.condition条件里可以使用PHP函数:Weibo/Home/View/default/User/index.html

Inserttitleher小新判断结果:小新2.condition条件里使用点语法,智能判断数组或对象:Weibo/Home/View/default/User/index.html

小新3.condition条条件里使用冒号语法,直接使用对象:Weibo/Home/View/default/User/index.html

小新4.condition条件里使用系统变量:Weibo/Home/View/default/User/index.html

小新一护错误默认情况下,case会自动添加break语句防止穿透,如果你就是想要穿透,那么可以去除break。当然,绝大部分不需要设置break。//去除break小新ThinkPHP提供了一组比较标签用于简单的变量比较,复杂的判断条件可以用IF标签替换。(1)eq或equal标签:等于

小新(2)neq或notequal标签:不等于(3)gt标签:大于(4)egt标签:大于等于(5)lt标签:小于(6)elt标签:小于等于(7)heq标签:恒等于(8)nheq标签:不恒等于注意:name的值和IF语句一样,可以是变量、数组、对象、函数或系统变量,其他比较标签使用方法类似,这里不在赘述。比较标签还提供了一个统一标签compare,比较类型通过type属性完成。(9)compare统一方法

小新ThinkPHP提供了一组范围判断标签:in、notin、between、notbetween四个标签,都用于判断变量是否在某个范围中。User控制器UserController.class.php设置id=1

assign('id',1);//渲染模版输出$this->display();}}1.in标签:Weibo/Home/View/default/User/index.html判断如果id是1,2,3

Inserttitleherid在范围内返回:id在范围内in标签,支持else写法

Inserttitleherid在范围内id不在范围内返回:id在范围内2.notin标签,正好相反:判断如果id是不是1Weibo/Home/View/default/User/index.html判断

Inserttitleherid不在范围内返回:id不在范围内3.between标签,从哪里到哪里的范围:判断如果id是1-10之间

Inserttitleherid在范围内返回:id在范围内4.notbetween标签,从哪里到哪里的范围:判断如果id是2-20之间

Inserttitleherid不在范围内返回:id不在范围内5.range标签,可以统一in、notin、between和notbetween:通过type=选择

Inserttitleherid在范围内返回:id在范围内6.name值可以是系统变量

Inserttitleheruser已存在返回:user已存在2.判断变量是否已赋值,没有创建或赋值为null,都算没有值

Inserttitleheruser还没有值3.判断变量是否已赋值,组合

Inserttitleheruser已存在user未存在返回:user已存在4.判断变量是否已赋值,系统变量

Inserttitleheruser为空值6.判断变量是否为空,不空则输出

Inserttitleheruser不为空值返回:user不为空值7.判断变量是否为空,组合

Inserttitleheruser为空值user不为空值返回:user不为空值8.判断变量是否为空,系统变量

InserttitleherAPP_PATH常量已定义返回:APP_PATH常量已定义10.判断常量是否定义,没定义输出

InserttitleherAPP_PATH常量未定义11.判断常量是否定义,组合

InserttitleherAPP_PATH常量已定义APP_PATH常量未定义返回:APP_PATH常量已定义二.遍历循环ThinkPHP内置标签提供了Volist标签、Foreach标签和For标签。User控制器UserController.class.php设置显示所有数据

assign('data',$user->select());$this->display();}}1.Volist标签:通常用于查询数据集的结果输出,通过select()方法返回的是一个二维数组,可以直接使用volist标签进行输出

Inserttitleher

注意:这里的name="data"中的data是控制器给模版定义的数据变量,要对应;这里的id="arr"中的arr是将要遍历循环的数组名,可以自定义。offset从第几条开始,起始值0,length共多少条

Inserttitleher

通过key输出排序

Inserttitleher

  • {$k}--{$arr.id}--{$arr.user}--{$arr.mail}
  • mod求当前余数,当前index除以2余1,输出偶数

    Inserttitleher

  • {$k}.{$arr.id}--{$arr.user}--{$arr.mail}
  • 没有指定k,也可以用i变量输出

    Inserttitleher

  • {$i}--{$vo.id}--{$vo.user}--{$vo.mail}
  • key变量,可以直接输出索引值,从0开始

    Inserttitleher

  • {$key}--{$vo.id}--{$vo.user}--{$vo.mail}
  • 没有数据的情况下使用empty填充

    Inserttitleher

  • {$vo.id}--{$vo.user}--{$vo.mail}
  • 输出:没有任何数据方式二:empty="设置变量"

    assign('empty','没有数据');$this->display();}}Inserttitleher

  • {$vo.id}--{$vo.user}--{$vo.mail}
  • 输出加红加粗:没有任何数据2.Foreach标签和Volist标签类似,只不过Foreach标签更加简单,没有额外属性。只支持key属性,但{$key}变量支持

    Inserttitleher

    3.For标签就是简单的循环标签。从1到99循环

    Inserttitleher{$i}
    除了start和end必须值,还有三个可选值。comparison是大于还是小于,默认值为lt(<);name是循环变量名,默认值为i;step是步进值,默认为1。完整形式

    Inserttitleher{$i}
    三.其他标签ThinkPHP模版中还有一些其他标签。在模版中定义变量,value值可以为变量($user)或系统变量($Think.get.user)

    Inserttitleher{$var}输出:123在模版中定义常量,value值可以为变量($user)或系统变量($Think.get.user)

    Inserttitleher{$Think.const.MY_NAME}输出:xixiimport导入标签可以智能的导入js和css文件ThinkPHP\Public\css\index.css做一个背景为灰色

    body{background:#ccc;}ThinkPHP\Public\css\index.js做一个弹出框

    alert('js');1.常规引入方法

    Inserttitleher3.使用import导入,basepath修改默认路径为./Common

    Inserttitleher4.load加载标签可以智能的加载js和css文件使用load加载

    Inserttitleher$a=1;$b=2;echo$a+$b;(2)用php语法做加法(不推荐用危险)

    Inserttitleher如果想原样输出标签极其内容,可以使用literal标签原样输出:

    Inserttitleherecho123;注意:什么都没有定义的情况下,会自动报错,错误信息提示如下模板不存在:./Weibo/Home/View/User/index.html

    /***volist标签解析循环输出数据集*格式:**{user.username}*{user.email}**@accesspublic*@paramarray$tag标签属性*@paramstring$content标签内容*@returnstring|void*/publicfunction_volist($tag,$content){//核心代码省略}在ThinkPHP中,Cx.class.php是自动加载的,所以并不需要各种配置或引入而可以直接编写标签代码即可运行。但如果是Html.class.php这种扩展性标签库,则需要通过其他方式才可以运行:

    /***select标签解析*格式:*@accesspublic*@paramarray$tag标签属性*@returnstring|void*/publicfunction_select($tag){//核心代码省略}如果要使用Html.class.php的扩展标签,那么首先要导入这个标签在使用标签的时候,前面需要加上html:,表示这个是html标签库

    Inserttitleher源代码:注意:Cx.class.php因为是内置标签,所以不需要加Cx:,但Html.class.php则需要加上html:,否则会无法解析标签。方式一:可以将Cx和Html都设置为内置标签写在配置文件config.php里

    'cx,html',);设置成内置标签后则不需要html:了也不需要导入扩展标签

    Inserttitleher注意:设置内置标签有一定的危险性,因为可能会出现标签的重复导致冲突。如果没有设置为内置标签的话,那么都需要通过tablib进行导入,我们可以设置标签预加载。这样,就不需要每次都进行导入操作了。方式二:将Html标签预加载写在配置文件config.php里

    'html',);设置标签预加载不需要导入扩展标签

    Inserttitleher二.自定义扩展标签库有时感觉内置的标签不能满足项目日益繁杂的项目需求,这是可能想自己扩展一些标签来使用,那么自己怎么扩展标签呢?第一步:在Think/Library/Think/Template/TagLib下创建一个Test.class.php

    Inserttitleher测试标签源代码:测试标签ThinkPHP/Weibo/Home/

    ThinkPHP--视图--路由功能ThinkPHP的路由功能。就是配置URL,让URL更加的简洁和优雅。路由模式只对PATHINFO模式和兼容模式起作用。一.路由定义在使用路由功能之前,我们需要启用路由。启用路由前提是你的URL支持PATHINFO模式或者兼容模式,而ThinkPHP默认的就是PATHINF模式。只要配置如下启用:创建:ThinkPHP\Weibo\Home\View\default\User\index.html

    '配置值'//设置模块以及默认模块'MODULE_ALLOW_LIST'=>array('Home','Admin'),'DEFAULT_MODULE'=>'Home',//默认模块,可以省去模块名输入//启用路由功能'URL_ROUTER_ON'=>true,//配置路由规则'URL_ROUTE_RULES'=>array(//数字约束'u/:id\d'=>'User/index',),);通过给传过来的动态ID加md5

    ThinkPHP--视图--URL操作:ThinkPHP的URL操作。主要涉及到URL路径大小写、伪静态、生成以及模版中的U()方法。一.URL大小写系统默认的规范是根据URL里面的模块名、控制器名来定位到具体的控制器类。

    '配置值'//设置模块以及默认模块'MODULE_ALLOW_LIST'=>array('Home','Admin'),'DEFAULT_MODULE'=>'Home',//默认模块,可以省去模块名输入//启用路由功能'URL_ROUTER_ON'=>true,//配置路由规则//禁止访问的后缀'URL_DENY_SUFFIX'=>'html|pdf|ico|png|gif|jpg',);三.URL生成为了配合所使用的URL模式,我们需要能够动态的根据当前的URL设置生成对应的URL地址。为此,ThinkPHP内置了一个U()方法,用于URL的动态生成。定义格式:U('地址表达式',['参数'],['伪静态后缀'],['显示域名'])得到当前URL配置:ThinkPHP\Weibo\Home\Controller\UserController.class.php

    5,'type'=>'a'));}}得到地址:/ThinkPHP/index.php/Home/Member/add/id/5/type/a.html使用字符串参数1=值1,参数2=值2

    5),'xml');}}得到地址:/ThinkPHP/index.php/Home/User/add/id/5.xml四种模式的应用:(1)普通模式后URL生成将如下

    '配置值'//页面Trace'SHOW_PAGE_TRACE'=>true,//设置默认主题'DEFAULT_THEME'=>'default',//启用路由功能'URL_ROUTER_ON'=>true,//配置路由规则'URL_MODEL'=>0);得到地址:/ThinkPHP/index.phpm=Home&c=User&a=add&id=5(2)PATHINFO模式后URL生成将如下:

    '配置值'//页面Trace'SHOW_PAGE_TRACE'=>true,//设置默认主题'DEFAULT_THEME'=>'default',//启用路由功能'URL_ROUTER_ON'=>true,//配置路由规则'URL_MODEL'=>1);得到地址:/ThinkPHP/index.php/Home/User/add/id/5.xml(3)REWRITE模式后URL生成(它是PATHINFO的升级版,地址最短)将如下:

    '配置值'//页面Trace'SHOW_PAGE_TRACE'=>true,//设置默认主题'DEFAULT_THEME'=>'default',//启用路由功能'URL_ROUTER_ON'=>true,//配置路由规则'URL_MODEL'=>2);得到地址:/ThinkPHP/Home/User/add/id/5.xml(4)兼容模式后URL生成将如下:

    '配置值'//页面Trace'SHOW_PAGE_TRACE'=>true,//设置默认主题'DEFAULT_THEME'=>'default',//启用路由功能'URL_ROUTER_ON'=>true,//配置路由规则'URL_MODEL'=>3);得到地址:/ThinkPHP/index.phps=/Home/User/add/id/5.xml也可以生成路由地址,使用路由的规则生成的地址:配置文件设置:

    '配置值'//设置默认主题'DEFAULT_THEME'=>'default',//启用路由功能'URL_ROUTER_ON'=>true,//规则路由'u/:id\d'=>'Member/add',);ThinkPHP\Weibo\Home\Controller\UserController.class.php设置

    5),'xml');//生成规则路由地址echoU('/u/5');}}生成URL:/ThinkPHP/index.php/u/5.html生成正则路由地址配置文件设置:

    '配置值'//设置默认主题'DEFAULT_THEME'=>'default',//启用路由功能'URL_ROUTER_ON'=>true,//生成正则路由地址'/^u_(\d+)$/'=>'User/indexid=:1',);ThinkPHP\Weibo\Home\Controller\UserController.class.php设置

    5),'xml');//生成规则路由地址echoU('/u_5');}}生成URL:/ThinkPHP/index.php/u_5.html域名支持

    Inserttitleher{:U('Member/add',array('id'=>5))}生成URL:/ThinkPHP/index.php/Home/Member/add/id/5.html

    ThinkPHP--视图--控制器一.控制器操作我们首先复习一下基本的控制器定义和方法执行方式。第一步:控制器默认创建在当前模块下的Controller目录下;第二步:按照指定的命名规则:控制器名(首字母大写)+Controller.class.php;第三步:控制器里的方法必须是public公共的;

    '配置值'//配置控制器方法后缀'ACTION_SUFFIX'=>'Action',);每个方法后面加上Action,对于URL访问不需要加Action

    '配置值'//允许二级控制器'CONTROLLER_LEVEL'=>2,);第二步:在Controller目录下创建Member目录,在Member目录下创建一个控制器;CommentController.php

    '配置值'//启用Action参数绑定,默认为true,可以不写'URL_PARAMS_BIND'=>true,);注意:当你URL没有传递参数(id/5)的时候,那么页面会报错:参数错误或者未定义:id。当然,如果取消绑定,则不会报错'URL_PARAMS_BIND'=>false,。但是,为了程序的严谨性,一般需要不要取消参数绑定如果你个那个参数设定一个默认值,当没有传递参数的时候,会直接启用默认值:

    '配置值'//启用Action参数绑定,默认为true,可以不写'URL_PARAMS_BIND'=>true,//定义按顺序传参绑定'URL_PARAMS_BIND_TYPE'=>1,);传递两个参数

    //默认错误跳转对应的模板文件'TMPL_ACTION_ERROR'=>THINK_PATH.'Tpl/dispatch_jump.tpl',//默认成功跳转对应的模板文件'TMPL_ACTION_SUCCESS'=>THINK_PATH.'Tpl/dispatch_jump.tpl',配置文件可以自行修改跳转模版位置

    {$msgTitle}{$message}{$status}{$waitSecond}{$jumpUrl}自定义失败模版路径:ThinkPHP\Weibo\Home\View\default\Public\error.html

    {$msgTitle}{$message}{$status}{$waitSecond}{$jumpUrl}注意:如果对于数据库操作,采用了Ajax方式,那么success()和error()会自动ajaxReturn()方法返回数据提供调用。ThinkPHP还单独提供了重定向方法redirect(),参数和U()方法一样。这个方法使用的是URL规则。

    'htmlspecialchars',);如果系统设置了默认的过滤,本身某个函数又不想过滤,那么可以这么处理:设置屏蔽系统默认过滤

    True,);第二步:在Controller目录下建立User目录,在User目录建立index.class.php,再建立test.class.php。设置User模块下的index类

    ThinkPHP--视图--Session与CookieThinkPHP的Session与Cookie的处理,提供了对这两个核心变量的完善支持。一.Session系统提供了Session管理和操作的完善支持,只需要通过session()函数完成,该函数可以完成Session的设置、获取、删除和管理操作。一般来说,在ThinkPHP中不需要手动初始化session,系统会自动初始化(1)id说明:session_id值(2)name说明:session_name值(3)path说明:session_save_path值(4)prefix说明:session本地化空间前缀(5)expire说明:session.gc_maxlifetime设置值(6)domain说明:session.cookie_domain设置值(7)use_cookies说明:session.use_cookies设置值(8)use_trans_sid说明:session.use_trans_sid设置值(9)type说明:session处理类型,支持驱动扩展默认情况下,初始化之后系统会自动启动session,如果不希望系统自动启动session的话,可以如下设置:

    false,);1.创建并获取session的值

    三.图像处理1.使用crop()和save()方法可以实现图像的裁剪功能。在原有图片的基础上裁剪图片为高400宽400生成一张2.jpg(默认0,0坐标开始截起)

    open('./Public/1.jpg');//裁剪图片,高400,宽400通过save生成$image->crop(400,400)->save('./Public/2.jpg');}}在原有图片的基础上裁剪图片为高400宽400生成一张2.jpg(坐标100,100开始裁剪)

    open('./Public/1.jpg');//裁剪图片,坐标100,100开始裁剪$image->crop(400,400,100,100)->save('./Public/2.jpg');}}在原有图片的基础上裁剪图片为高400宽400生成一张2.jpg(坐标100,100开始裁剪),最后在缩放成200*200

    open('./Public/1.jpg');//裁剪图片,生成后的图片压缩成高宽200$image->crop(400,400,100,100,200,200)->save('./Public/2.jpg');}}2.使用thumb方法生成缩略图。生成缩略图300*300

    open('./Public/1.jpg');//生成缩略图$image->thumb(300,300)->save('./Public/2.jpg');}}注意:虽然我们设置了宽高300,但实际上它是300x168,因为生成缩略图采用默认等比例缩放的。如果想用其它缩略图模式,可以使用以下方式。(1)IMAGE_THUMB_SCALE=1;//等比例缩放类型(2)IMAGE_THUMB_FILLED=2;//缩放后填充类型(3)IMAGE_THUMB_CENTER=3;//居中裁剪类型(4)IMAGE_THUMB_NORTHWEST=4;//左上角裁剪类型(5)IMAGE_THUMB_SOUTHEAST=5;//右下角裁剪类型(6)IMAGE_THUMB_FIXED=6;//固定尺寸缩放类型生成缩略图,以中心点截取,直接传3也可以

    open('./Public/1.jpg');//生成缩略图,以中心点截取,直接传3也可以$image->thumb(300,300,Image::IMAGE_THUMB_CENTER)->save('./Public/2.jpg');}}3.使用water()方法可以生成一张包含水印的图片。在图片右下角添加水印并生成(把图片1.jpg右下角添加水印后拷贝成2.jpg)

    open('./Public/1.jpg');//在图片右下角添加水印并生成$image->water('./Public/logo.png')->save('./Public/2.jpg');}}由于默认是右下角水印位置,如果想更改水印位置,可以在第二参数使用如下:(1)IMAGE_WATER_NORTHWEST=1;//左上角水印

    open('./Public/1.jpg');//更改水印到左上角$image->water('./Public/logo.png',Image::IMAGE_WATER_NORTHWEST)->save('./Public/2.jpg');}}(2)IMAGE_WATER_NORTH=2;//上居中水印(3)IMAGE_WATER_NORTHEAST=3;//右上角水印(4)IMAGE_WATER_WEST=4;//左居中水印(5)IMAGE_WATER_CENTER=5;//居中水印(6)IMAGE_WATER_EAST=6;//右居中水印(7)IMAGE_WATER_SOUTHWEST=7;//左下角水印(8)IMAGE_WATER_SOUTH=8;//下居中水印(9)IMAGE_WATER_SOUTHEAST=9;//右下角水印设置水印的透明度,默认为80,1-100之间

    open('./Public/1.jpg');//设置水印的透明度,默认为80,1-100之间$image->water('./Public/logo.png',Image::IMAGE_WATER_NORTHWEST,30)->save('./Public/2.jpg');}}设置文本水印(文字:xixi,字体:./Public/consola.ttf,大小:20,颜色:#ffffff)

    open('./Public/1.jpg');//设置文本水印$image->text('xixi','./Public/consola.ttf',20,'#ffffff',Image::IMAGE_WATER_SOUTHEAST)->save('./Public/2.jpg');}}ThinkPHP--视图--验证码ThinkPHP的验证码功能,即Verify.class.php。此验证码可以支持验证码的生成和验证功能。一.生成验证码1.默认数字与字母大小写不区分的5位验证码

    entry();}}注意:生成的验证码会将信息保存在session中,可以使用print_r($_SESSION)来查看。如果想生成多个验证码,可以传递数字参数即可生成多个验证码

    30,//验证码字体大小'length'=>3,//验证码位数3位'useNoise'=>false,//关闭验证码杂点);//实例化验证码类,并传入参数$verify=new\Think\Verify($config);//生成验证码$verify->entry();}}采用的配置变量方式来修改验证码参数,也可以使用动态设置方法:(1)设置验证码字体为5.ttf文件

    fontttf='5.ttf';//生成验证码$verify->entry();}}(2)设置背景图片功能,随机使用

    useImgBg=true;//生成验证码$verify->entry();}}(3)取消曲线混淆

    useCurve=false;//生成验证码$verify->entry();}}(4)设置验证码的高宽和验证码的长度

    imageH=100;//设置验证码的宽$verify->imageW=100;//设置验证码的长度$verify->length=1;//生成验证码$verify->entry();}}(5)设置验证码背景颜色

    bg=array(200,200,200);//生成验证码$verify->entry();}}1.如果想让验证码显示中文字符,那么需要几个步骤:(1)在Think/zhttfs文件夹下引入中文字体文件,比如加粗雅黑msyhbd.ttf;(2)设置字体文件;(3)把中文字体雅黑msyhbd.ttf放到ThinkPHP/Libray/Think/Verify/zhttfs/msyhbd.ttf(4)设置中文验证码

    fontttf='msyhbd.ttf';//设置中文验证码$verify->useZh=true;//生成验证码$verify->entry();}}注意:由于中文字符较为庞大,你也可以限定指定的中文字符。2.限定中文字符

    fontttf='msyhbd.ttf';//设置中文验证码$verify->useZh=true;//限定中文字符$verify->zhSet='西西是个好人';//生成验证码$verify->entry();}}3.设置纯数字

    codeSet='0123456789';//生成验证码$verify->entry();}}三.验证码检测我们可以使用Verify.class.php类中的check方法检测验证码是否输入正确。第一步:在function.php里构建一个函数:\ThinkPHP\Weibo\Common\Common\function.php

    check($code,$id);}第二步:通过输入验证,来验证,是否返回true

    ThinkPHP--视图--文件上传ThinkPHP的文件上传功能,即Upload.class.php。上传类可以提供单个文件上传、多个文件上传等上传方式。一.上传单个表单1.创建上床表单路径:ThinkPHP\Weibo\Home\View\default\User\index.html

    Inserttitleher2.配置文件设置主体目录:ThinkPHP\Weibo\Common\Conf\config.php

    'default',);3.在控制器里创建一个upload方法,实现上传功能:ThinkPHP\Weibo\Home\Controller\UserController.class.php方式一:实例化上传Upload类

    maxSize=3145728;//设置上传大小,字节$upload->exts=array('jpg','gif','png','jpeg');//限定后缀$upload->savePath='./';//在根目录Uploads下//设置文件名$upload->saveName='123';//设置同名覆盖$upload->replace=true;//限制上传文件类型$upload->mimes=array('image/jpeg');$info=$upload->upload();//执行上传方法if(!$info){$this->error($upload->getError());//错误了}else{$this->success('上传成功!');//成功了}}}2.设置子目录格式为20180421这种格式

    maxSize=3145728;//设置上传大小,字节$upload->exts=array('jpg','gif','png','jpeg');//限定后缀$upload->savePath='./';//在根目录Uploads下//设置子目录格式$upload->subName=array('date','Ymd');$info=$upload->upload();//执行上传方法if(!$info){$this->error($upload->getError());//错误了}else{$this->success('上传成功!');//成功了}}}3.子目录采用函数返回

    maxSize=3145728;//设置上传大小,字节$upload->exts=array('jpg','gif','png','jpeg');//限定后缀$upload->savePath='./';//在根目录Uploads下//子目录采用函数返回$upload->subName='get_user_id';$info=$upload->upload();//执行上传方法if(!$info){$this->error($upload->getError());//错误了}else{$this->success('上传成功!');//成功了}}}在function.php中创建一个函数

    maxSize=3145728;//设置上传大小,字节$upload->exts=array('jpg','gif','png','jpeg');//限定后缀$upload->savePath='./';//在根目录Uploads下$info=$upload->upload();//执行上传方法if(!$info){$this->error($upload->getError());//错误了}else{//获取上传文件信息foreach($infoas$file){echo$file['savepath'].$file['savename'];}}}}5.$file数组可以使用的属性:

    Inserttitleher获取上传文件信息:

    maxSize=3145728;//设置上传大小,字节$upload->exts=array('jpg','gif','png','jpeg');//限定后缀$upload->savePath='./';//在根目录Uploads下$info=$upload->upload();//执行上传方法if(!$info){$this->error($upload->getError());//错误了}else{//获取上传文件信息foreach($infoas$file){echo$file['savepath'].$file['savename'].'
    ';}}}}返回:./2018-04-21/5adad5e96af27.jpg./2018-04-21/5adad5e96ce67.jpg./2018-04-21/5adad5e96e5d7.jpg

    array('Behavior\CheckLangBehavior'),);PS:这个行为主要是检测多语言功能。2.配置文件设置:ThinkPHP\Weibo\Common\Conf\config.php

    true,//设置默认主题目录'DEFAULT_THEME'=>'default',//设置可访问模块'MODULE_ALLOW_LIST'=>array('Home','Admin'),'DEFAULT_MODULE'=>'Home',//启用路由功能'URL_ROUTER_ON'=>true,//开启语言包功能'LANG_SWITCH_ON'=>true,//自动侦测语言开启多语言功能后有效'LANG_AUTO_DETECT'=>true,//允许切换的语言列表用逗号分隔'LANG_LIST'=>'zh-cn,en-us',//默认语言切换变量'VAR_LANGUAGE'=>'lang',);3.配置:ThinkPHP\Weibo\Home\View\default\User\index.html

    InserttitleherThinkPHP系统提供了三个默认语言包,分别是简体中文、英文、繁体中文。而这三种语言包保存在:Think\Lang下。我们想显示系统提示信息,可以通过L()方法来传入多语言变量。默认输出无法加载控制器通过cookie切换语言定义为英文4.配置:ThinkPHP\Weibo\Home\Controller\UserController.class.php

    array('Behavior\CheckLangBehavior'),);PS:这个行为主要是检测多语言功能。第二步:配置文件设置:ThinkPHP\Weibo\Common\Conf\config.php

    true,//设置默认主题目录'DEFAULT_THEME'=>'default',//设置可访问模块'MODULE_ALLOW_LIST'=>array('Home','Admin'),'DEFAULT_MODULE'=>'Home',//启用路由功能'URL_ROUTER_ON'=>true,//开启语言包功能'LANG_SWITCH_ON'=>true,//自动侦测语言开启多语言功能后有效'LANG_AUTO_DETECT'=>true,//允许切换的语言列表用逗号分隔'LANG_LIST'=>'zh-cn,en-us',//默认语言切换变量'VAR_LANGUAGE'=>'lang',);第三步:在Home目录下建立Lang目录;第四步:分别建立zh-cn.php和en-us.php两个文件;第五步:分别在两个语言包编写语言常量;中文常量:ThinkPHP\Weibo\Home\Lang\zh-cn.php

    'user','form_pass'=>'pass','form_email'=>'email','form_submit'=>'submit',);第六步:模版获取语言定义{$Think.lang.form_...}:ThinkPHP\Weibo\Home\View\default\User\index.html

    Inserttitleher

    {$Think.lang.form_user}:

    {$Think.lang.form_pass}:

    {$Think.lang.form_email}:

    第七步配置:ThinkPHP\Weibo\Home\Controller\UserController.class.php

    表1:think_auth_rule(type=1表示url访问允许访问Admin/Index/index这个页面这个页面的id是1)idnametitletypestatuscondition1Admin/Index/index后台首页11表2:think_auth_group(默认管理组status=1表示可以用,权限rules写的是允许访问Admin/Index/index权限的id=1,2,3,4,5)idtitlestatusrules1默认管理组11,2,3,4,5表3:think_auth_group_access(把组权限分配给3,3代表guest用户)uidgroup_id31第二步:数据配置文件引入:ThinkPHP\Weibo\Common\Conf\config.php

    ThinkPHP--视图--关联模型ThinkPHP的关联模型,关联模型可以非常容易的操作多种关联表的增、删、改、查。一.模型简介关联模型,一共有三种模式:一对一:ONE_TO_ONE,包括HAS_ONE和BELONGS_TO;一对多:ONE_TO_MANY,包括HAS_MANY和BELONGS_TO;多对多:MANY_TO_MANY。用表关系来理解这三种模式:一对一:用户表和身份证表,一个用户只能对应一个身份证,而一个身份证只能对应一个用户。这就是一对一。一对多:用户表和留言表:一个用户可以发表N条留言,而每条留言只能由某一个用户发表。这就是一对多。就算有多个用户发表了相同的留言内容,但ID却不一样,所以,不能理解为多对多。多对多:用户表和角色表:一个用户可以是认证专员,同时也是审核专员。那么角色表中的审核专员也可以是蜡笔小新的角色,也可以是路飞的角色。这就是多对多。二.关联操作创建用户数据表:think_user

    创建身份证表:think_card

    创建留言表:think_content

    创建角色表:think_role

    创建中间表实现多对多:think_group(西西用户id=1权限是管理员,认证专业,审核专员。西西用户id=2权限是认证专员,审核专员,西西用户3id=3权限审核专员)

    relation(true)->select();var_dump($arr);}}Card模型部分:ThinkPHP\Weibo\Home\Model\CardModel.class.php

    array(size=3)0=>array(size=4)'id'=>string'1'(length=1)'code'=>string'110102'(length=6)'uid'=>string'1'(length=1)'user'=>string'用户西西1'(length=13)1=>array(size=4)'id'=>string'1'(length=1)'code'=>string'110103'(length=6)'uid'=>string'2'(length=1)'user'=>string'用户西西2'(length=13)2=>array(size=4)'id'=>string'3'(length=1)'code'=>string'110104'(length=6)'uid'=>string'4'(length=1)'user'=>string'用户西西4'(length=13)3.用户表和留言表:HAS_MANY(一对多)表示一个用户发表N条留言User控制器部分:ThinkPHP\Weibo\Home\Controller\UserController.class.php

    relation(true)->select();print_r($arr);//通过print_r打印出来}}User模型部分:ThinkPHP\Weibo\Home\Model\UserModel.class.php

    Array([0]=>Array([id]=>1[user]=>用户西西1[email]=>xixi1@xixi.com[count]=>1[date]=>2018-04-1412:35:33[Content]=>Array([0]=>Array([content]=>我的第三条留言)[1]=>Array([content]=>我的第二条留言)))[1]=>Array([id]=>2[user]=>用户西西2[email]=>xixi2@xixi.com[count]=>2[date]=>2018-04-1100:00:00[Content]=>)[2]=>Array([id]=>3[user]=>用户西西3[email]=>xixi3@xixi.com[count]=>3[date]=>2018-04-2500:00:00[Content]=>)[3]=>Array([id]=>4[user]=>用户西西4[email]=>xixi4@xixi.com[count]=>4[date]=>2018-04-0300:00:00[Content]=>))4.用户表和留言表:BELONGS_TO(多对一)表示N条留言从属于某个用户。User控制器部分:ThinkPHP\Weibo\Home\Controller\ContentController.class.php

    relation(true)->select();var_dump($arr);}}User模型部分:ThinkPHP\Weibo\Home\Model\ContentModel.class.php

    array(size=3)0=>array(size=4)'id'=>string'1'(length=1)'content'=>string'我的第一条留言'(length=21)'uid'=>string'1'(length=1)'user'=>string'用户西西1'(length=13)1=>array(size=4)'id'=>string'2'(length=1)'content'=>string'我的第二条留言'(length=21)'uid'=>string'1'(length=1)'user'=>string'用户西西1'(length=13)2=>array(size=4)'id'=>string'3'(length=1)'content'=>string'我的第三条留言'(length=21)'uid'=>string'1'(length=1)'user'=>string'用户西西1'(length=13)PS:多对一的使用和一对一是一样的。5.用户表、角色表和中间关联表,MANY_TO_MANY实现多对多关联。User控制器部分:ThinkPHP\Weibo\Home\Controller\UserController.class.php

    Array([0]=>Array([id]=>1[user]=>用户西西1[email]=>xixi1@xixi.com[count]=>1[date]=>2018-04-1412:35:33[Role]=>Array([0]=>Array([id]=>1[title]=>管理员)[1]=>Array([id]=>2[title]=>认证专员)[2]=>Array([id]=>3[title]=>审核专员)))[1]=>Array([id]=>2[user]=>用户西西2[email]=>xixi2@xixi.com[count]=>2[date]=>2018-04-1100:00:00[Role]=>Array([0]=>Array([id]=>2[title]=>认证专员)[1]=>Array([id]=>3[title]=>审核专员)))[2]=>Array([id]=>3[user]=>用户西西3[email]=>xixi3@xixi.com[count]=>3[date]=>2018-04-2500:00:00[Role]=>Array([0]=>Array([id]=>3[title]=>审核专员)))[3]=>Array([id]=>4[user]=>用户西西4[email]=>xixi4@xixi.com[count]=>4[date]=>2018-04-0300:00:00[Role]=>Array()))注意:这里的用户表和角色表并没有关联字段,而是采用中间表来关联他们,再通过ThinkPHP的关联模式,进行多对多匹配。三.表与表之间进行管理后,还可以进行写入、更新和删除。1.新增:新增一个用户,同时增加一个身份证

    '123456',);$user->relation(true)->add($data);}}2.删除:删除一个用户,同时删除关联的身份证

    relation(true)->delete(4);}}3.修改:更新一个用户,同时更新对应的身份证

    '3209zz',);$user->relation(true)->where(array('id'=>3))->save($data);}}ThinkPHP--视图模型和分页一.视图模型关联模型可以解决一对一、一对多和多对多等关联操作。它们通过生成多条SQL语句然后进行数组拼装得到最终想要的结果。对于一对一这种HAS_ONE和BELONGS_TO的多表关联查询,可以使用视图模型。它采用的是联合查询(JOIN),非常适合此类查询需求。User控制器部分:ThinkPHP\Weibo\Home\Controller\UserController.class.php

    select());}}User模型部分:ThinkPHP\Weibo\Home\Model\UserViewModel.class.php

    array(size=3)0=>array(size=5)'id'=>string'1'(length=1)'user'=>string'用户西西1'(length=13)'email'=>string'xixi1@xixi.com'(length=14)'code'=>string'110102'(length=6)'content'=>string'我的第一条留言'(length=21)1=>array(size=5)'id'=>string'1'(length=1)'user'=>string'用户西西1'(length=13)'email'=>string'xixi1@xixi.com'(length=14)'code'=>string'110102'(length=6)'content'=>string'我的第二条留言'(length=21)2=>array(size=5)'id'=>string'1'(length=1)'user'=>string'用户西西1'(length=13)'email'=>string'xixi1@xixi.com'(length=14)'code'=>string'110102'(length=6)'content'=>string'我的第三条留言'(length=21)使用关联查询,显示User表且包含Card表关联的数据,未关联的则忽略。如果想把未关联的查询出来,可以使用LEFT左查询。

    array(size=4)0=>array(size=4)'id'=>string'1'(length=1)'user'=>string'用户西西1'(length=13)'email'=>string'xixi1@xixi.com'(length=14)'code'=>string'110102'(length=6)1=>array(size=4)'id'=>string'2'(length=1)'user'=>string'用户西西2'(length=13)'email'=>string'xixi2@xixi.com'(length=14)'code'=>string'110103'(length=6)2=>array(size=4)'id'=>string'4'(length=1)'user'=>string'用户西西4'(length=13)'email'=>string'xixi4@xixi.com'(length=14)'code'=>string'110104'(length=6)3=>array(size=4)'id'=>string'3'(length=1)'user'=>string'用户西西3'(length=13)'email'=>string'xixi3@xixi.com'(length=14)'code'=>null使用group分组去除重复数据显示每个用户最新一条留言:ThinkPHP\Weibo\Home\Controller\UserController.class.php

    group('id')->select());}}ThinkPHP\Weibo\Home\Model\UserViewModel.class.php

    array(size=4)0=>array(size=4)'id'=>string'1'(length=1)'user'=>string'用户西西1'(length=13)'email'=>string'xixi1@xixi.com'(length=14)'content'=>string'我的第一条留言'(length=21)1=>array(size=4)'id'=>string'2'(length=1)'user'=>string'用户西西2'(length=13)'email'=>string'xixi2@xixi.com'(length=14)'content'=>null2=>array(size=4)'id'=>string'3'(length=1)'user'=>string'用户西西3'(length=13)'email'=>string'xixi3@xixi.com'(length=14)'content'=>null3=>array(size=4)'id'=>string'4'(length=1)'user'=>string'用户西西4'(length=13)'email'=>string'xixi4@xixi.com'(length=14)'content'=>null二.数据分页ThinkPHP封装了数据分页功能,只要进行一些设置即可完成分页。配置文件设置分页变量名:ThinkPHP\Weibo\Common\Conf\config.php

    '配置值'//全局配置定义'DB_TYPE'=>'mysql',//数据库类型'DB_HOST'=>'127.0.0.1',//服务器地址'DB_NAME'=>'thinkphp',//数据库名'DB_USER'=>'xixi',//用户名'DB_PWD'=>'123456',//密码'DB_PORT'=>3306,//端口'DB_PREFIX'=>'think_',//数据库表前缀//页面Trace'SHOW_PAGE_TRACE'=>true,//设置默认主题目录'DEFAULT_THEME'=>'default',//设置分页变量名'VAR_PAGE'=>'page',);模版部分html5设置:ThinkPHP\Weibo\Home\View\default\User\index.html

    Inserttitleheriduseremail{$obj.id}{$obj.user}{$obj.email}

    {$page}

    User控制器部分设置:ThinkPHP\Weibo\Home\Controller\UserController.class.php

    select();S('list',$list,30);//把数据放到缓存里(设置缓存30秒,生成加密的文件名,以JSON数据序列化保存起来的}$this->assign('list',$list);//如果判断有缓存直接跳转到这里(执行缓存里的数据反序列化得到数据)$this->display();}}删除数据缓存方法:

    select();S('list',$list,30);//把数据放到缓存里(设置缓存30秒,生成加密的文件名,以JSON数据序列化保存起来的}//删除缓存S('list',null);$this->assign('list',$list);//如果判断有缓存直接跳转到这里(执行缓存里的数据反序列化得到数据)$this->display();}}二.快速缓存如果不想设置有效期存储,可以使用大F()方法的快速缓存。

    select();F('list',$list,TEMP_PATH);//本身放在Runtime/Data下的,手动设置到untime/Temp下}//删除缓存//F('list',null);$this->assign('list',$list);$this->display();}}三.查询缓存对于及时性要求不高的数据查询,我们可以使用查询缓存功能来提高性能。User控制器部分

    cache(true)->select();//指定缓存的Key会更加高效//$list=$user->cache('cache_user')->select();//获取缓存//var_dump(S('cache_user'));//删除缓存//S('cache_user',null);$this->assign('list',$list);$this->display();}}除了查询缓存之外,对于SQL查询语句本身也有解析缓存,就是把SQL语句给缓存下来,下次执行就不需要再解析了。当然,如果使用了查询缓存本身,由于已经将内容缓存,所以解析缓存基本上用的较少。四.静态缓存所谓静态缓存,就是第一次访问PHP时生成一个纯静态文件。当第二次访问时,就直接访问这个静态文件。特别适合类似于CMS系统这种页面状态变化较少的程序。配置文件设置静态缓存:ThinkPHP\Weibo\Common\Conf\config.php

    select();$this->assign('list',$list);$this->display();}}生成的页面缓存放在:ThinkPHP\Weibo\Html\Home_User_index_.html

    Inserttitleheriduseremail1用户西西1xixi1@xixi.com2用户西西2xixi2@xixi.com3用户西西3xixi3@xixi.com4用户西西4xixi4@xixi.com

    除了上面的缓存规则,还有其他的缓存规格选择://方法名'index'=>array('{id}',60),//控制器://User目录下的方法_ID'User:'=>array('User/{:action}_{id}',60),//控制器名:方法名'User:index'=>array('{id}',60),//将当前地址加密作为文件名'*'=>array('{$_SERVER.REQUEST_URI|md5}'),

    ThinkPHP--视图--调试方法ThinkPHP的调试方法,包括各种调试配置和方法。一.调试模式ThinkPHP专门为开发过程而设置了调试模式,调试模式开启后,特别方便我们进行排错和调整。但由于它执行效率会稍低,所以在正式部署项目的时候,关闭调试模式。//入口文件处,开启调试模式建议开发阶段开启部署阶段注释或者设为falsedefine('APP_DEBUG',true);调试模式在开发中的优势在于:1.开启日志记录,任何错误和调试信息都会详细记录;2.关闭模版缓存,模版修改可以及时生效;3.记录SQL日志,方便分析SQL;4.关闭字段缓存,数据表字段修改不受缓存影响;5.严格检查文件大小写,帮助提前发现Linux部署问题;6.通过页面Trace功能更好的调试和发现问题。二.异常处理和PHP默认的异常处理不同,ThinkPHP抛出的不单纯的错误信息,而是一个人性化的错误页面。当然,我们也可以自行调用这种错误信息。User控制器部分设置手动抛出异常

    select();//获取最近的SQL语句echo$user->getLastSql();}}User控制器部分设置查看SQL的错误信息

    '配置值'//全局配置定义'DB_TYPE'=>'mysql',//数据库类型'DB_HOST'=>'127.0.0.1',//服务器地址'DB_NAME'=>'thinkphp',//数据库名'DB_USER'=>'xixi',//用户名'DB_PWD'=>'123456',//密码'DB_PORT'=>3306,//端口'DB_PREFIX'=>'think_',//数据库表前缀//页面Trace'SHOW_PAGE_TRACE'=>true,//设置默认主题目录'DEFAULT_THEME'=>'default',//运行的日志记录级别'LOG_LEVEL'=>'EMERG,ALERT,CRIT,ERR',);User控制器部分添加手动写入日志方法

    select();//手动写入,第二参数为级别,第三为强制Log::record('手动日志','WARN',true);//不受配置文件影响(强制写入)//Log::write('日志','WARN');$this->assign('list',$list);$this->display();}}生成日志:ThinkPHP\Weibo\Runtime\Logs\18_04_22.log[2018-04-22T16:27:09+08:00]127.0.0.1/ThinkPHP/index.php/Home/User/index/WARN:手动日志七.TrackThinkPHP提供了一个非常方便的调试工具:页面Track。这个工具必须在调试模式下有效配置文件设置Track调试模式

    '配置值'//全局配置定义'DB_TYPE'=>'mysql',//数据库类型'DB_HOST'=>'127.0.0.1',//服务器地址'DB_NAME'=>'thinkphp',//数据库名'DB_USER'=>'xixi',//用户名'DB_PWD'=>'123456',//密码'DB_PORT'=>3306,//端口'DB_PREFIX'=>'think_',//数据库表前缀//页面Trace'SHOW_PAGE_TRACE'=>true,//设置要显示的调试模块'TRACE_PAGE_TABS'=>array('base'=>'基本','file'=>'文件','think'=>'流程','error'=>'错误','sql'=>'SQL','debug'=>'调试','user'=>'用户',),//设置默认主题目录'DEFAULT_THEME'=>'default',);User控制器部分设置调试方法显示在用户里

    select();//调试方法trace('调试方法','提示','user');$this->assign('list',$list);$this->display();}}

    THE END
    1.身份证18位数字分别代表什么视频原标题:身份证18位数字分别代表什么 身份证号码是每一个公民唯一的、终身不变的身份代码。这个号码一共有18位数字,这18位数字有个排序的规则,就是“地址码+出生日期码+顺序码+校验码”。生活中,还有一部分人身份证最后一位是字母,这是为什么呢?另外,按照《中华人民共和国居民身份证法》规定,居民身份证按年龄区https://www.workercn.cn/c/2024-11-27/8401707.shtml
    2.身份证号码上隐藏着的信息,你读懂了吗?18位身份证号码都有哪些不同含义? 来一起看看吧 ↓↓↓ 图片来源:人民日报微博 1-2位为省、自治区、直辖市代码; 3-4位为地级市、盟、自治州代码; 5-6位为县、县级市、区代码; 7-14位为出生年月日,比如19670401代表1967年4月1日出生; 15-17位为顺序码,是同一地址码所标示的区域范围内,对同年同月http://www.baokang.gov.cn/xxgk/xxgkml/jczwgk/hjglly/t_3349543.shtml
    3.涨知识身份证后4位数还有这么重要的含义!第3和第4位代表的是城市代码 第5和第6位代表的是区县代码 7-14位代表的是出生年月日 15和16位代表的是所在地派出所的代码 第17位代表的是性别,奇数是男性,偶数是女性 最后一位是校验码,有的人身份证是0-9的其中一个数字,也有的人是一个X,其实X代表的是数字10,由于直接用10来做尾号,身份证号码会变成https://www.cbbn.net/folder34/folder131/folder134/2021-04-06/qnWWhRKNuzdojjjl.html
    4.身份证号每一位号码的意义身份证每一位各个地区的省份编号都是从1(第二位)开始的,只有重庆是个例外,显然是因为重庆是1997年才从四川分离,加入直辖市小家庭的。如果未来的一天,你见到一张前两位为40的身份证,那么不用说,中南地区又新设了一个直辖市。 第3、4和5、6位 3、4:所在城市,比如西安市的代码:01 https://blog.csdn.net/lanchunhui/article/details/50612691
    5.公民身份证(18位的)前3位数字表示什么,第4位到第6位又表示什么?身份证号前六位是地区码,就是各县市区的行政区划代码。比如前六位是130503,13表示河北省,1305表示河北https://iask.sina.com.cn/b/1H3manKd1AkX.html
    6.2024港澳台居民申请大陆身份证攻略(最新政策+条件+流程+时间+材料最后一位为校验码。 身份证号码是由18位数字组成,分别表示: 第1、2位数字表示:所在省份的代码; 第3、4位数字表示:所在城市的代码; 第5、6位数字表示:所在区县的代码; 第7-14位数字表示:出生年、月、日(其中7、8、9、10位是年,11、12位是月,13、14位是日); https://www.extrabux.cn/chs/guide/7564945
    7.身份证的前六位数字代表地址信息还是出生日期蚂蚁庄园今日答题1月4日 1.身份证的前六位数字代表什么信息? 地址信息 出生日期 2.正确答案:地址信息 3.答案解析: 身份证号码前6位代表的是持证人的地址,第一位、第二位表示省或直辖市或自治区;第三位、第四位代表市辖区;第五位、第六位代表区、县、市等。https://m.ali213.net/news/gl2301/982615.html
    8.基于身份证号的数据分析根据身份证号身份证号共18位: 第1~2位:省份 第3~4位:市 第5~6位:区 第7~10位:出生年 第11~12位:出生月 第13~14位:出生日 第15~17位:顺序号 第18位:校验码 其中第18位校验码的计算方式: (1) 前17位按照位置各自乘以[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]。 (https://blog.51cto.com/u_16099248/9181639
    9.上海市中小学学生学籍号编制规则3.中国澳门学生:以澳门特区身份证号为学籍主号; 4.中国台湾学生:以台湾居民来往大陆通行证编号为学籍主号; 5.外籍学生:以有效护照编号为学籍主号; 6.其他学生,实行统一编号。具体含义如下: 二、学籍副号的编制规则 本市中小学生学籍副号编码由6部分共19位数字代码组成,具体编制规则如下: http://www.ps.edu.sh.cn/info/1041/4929.htm