ThinkPHP自学笔记
- 格式:pdf
- 大小:336.58 KB
- 文档页数:9
thinkphp5.1学习笔记tp配置技巧配置的get和settp5.1的配置在config⽬录⾥,⼀个⽂件是⼀个⼀级配置项,每个⽂件⼀⾏是⼆级配置项。
use think\facade\Config;//导⼊Config 门脸public function get(){//获取全部配置// dump(Config::get());//只获取app配置项dump(Config::get('app.'));dump(Config::pull('app'));//获取⼆级配置项dump(Config::get('app.app_debug'));dump(Config::get('app_debug'));//由于app是默认⼀级配置项,可以省略dump(Config::has('default_lang'));//检查是否有这个配置项,true/falsedump(Config::get('database.hostname'));}public function set(){//动态设置,静态设置是修改配置⽂件dump(Config::set('app_debug'));}}使⽤助⼿函数public function helper(){//助⼿函数不依赖于Config,不需要导⼊Config类//dump(config());//获取全部配置,相当于Config::get()dump(config('default_lang'));dump(config('?default_lang'));//查看是否存在,true/falsedump(config('database.hostname','localhost'));//设置,返回新的设置值localhost}traittrait ⽅法优先级⼩于⽗类,当两个trait ⽅法同名,会出错,需要如下:use Demo1 ,Demo2{Demo1::hello insteadof Demo2;Demo2::hello as Demo2hello;}容器/依赖注⼊/静态代理/请求对象容器与依赖注⼊的原理任何url的访问都是定位到控制器的,<?phpnamespace app\index\controller;class Demo1{public function d1(\app\common\B $b){//拿B做参数,当访问的d1⽅法⾃动实例化⼀个B,但是URL⾥不含参数。
数据库部分mysql,mssql,pgsql,sqllite,oracle,ibase,PdoConfig.php//数据库抽象层到底选择哪一个,无论选哪个数据库连接方式,都是使用thinkphp封装好的方法进行增删改查‘DB_TYPE’=>’mysql’,‘DB_HOST’=>’localhost’, //主机名‘DB_NAME’=>’User’, //库名‘DB_USER’=>’root’, //用户‘DB_PWD’=>’12345’, //密码‘DB_PORT’=>’3306’, //端口‘DB_PREFIX’=>’think_’//表前缀这个设置应该放在公共位置在另外一个页面之中定义一个配置项,然后将各个应用下的自定义(个性)配置文件组合起来return 返回去原理 a.php<?phpreturn array(‘abc’=>’中国’,‘bcd’=>’中华’,);?>b.php<?php$arr=include ‘a.php’;var_dump($arr); //这时b页面就可以?>操作:与主入口文件平级的目录新建config.inc.php<?php//写下公共配置?>分别在admin 和home 子应用下的config.php写下<?php$arr1=array(//个性配置);$arr2=include ‘./config.inc.php’;return array_merge($arr1,$arr2);?>在个性配置时:admin URL模式为‘URL_MODEL’=>0,home 的为‘URL_MODEL’=>2, //rewrite//另外thinkphp还为我们提供了其他的数据库连接方式DNS1.手动连接数据库形式$dns=’mysql://username:password@ localhost:3306/DBNAME’;用来跨库操作;$db=new Db($dsn);2.$dsn=array(‘dbms’=>’mysql’,‘DB_HOST’=>’localhost’, //主机名‘DB_NAME’=>’User’, //库名‘DB_USER’=>’root’, //用户‘DB_PWD’=>’12345’, //密码‘DB_PORT’=>’3306’, //端口‘DB_PREFIX’=>’think_’//表前缀);$db=new Db($dsn);3.自定义数据库类Model/UserModel.class.php<?phpclass UserModel extends Mode{protected $connection=array(‘dbms’=>’mysql’,‘DB_HOST’=>’localhost’, //主机名‘DB_NAME’=>’User’, //库名‘DB_USER’=>’root’, //用户‘DB_PWD’=>’12345’, //密码‘DB_PORT’=>’3306’, //端口‘DB_PREFIX’=>’think_’//表前缀);}?>主从数据库比较适合高并发高负载mysql可能以后是一个瓶颈开启数据库的分布式在公共配置文件中config.inc.php ‘DB_DEPLOY_TYPE’=>1,这时’DB_HOST’=>’localhost,192.168.0.1,192.168.0.2,……’剩下的数据库名和用户名密码最好设置成统一的或者写成上面的形式读写分离写的数据比较少而读的数据是海量的‘DB_RW_SEPARATE’=>true,此时主服务器为写服务器其他的为读服务器(数据库同步可以看数据库集群)所有的数据库配置均可以在ThinkPHP/common/convention.php 中设置自定义配置高于默认设置读取配置文件中的参数C();C(‘DB_HOST’)C(‘URL_MODEL’)C(‘DB_PREFIX’)等连接数据库之后的相关操作IndexAction.class.php如何实例化模型1.创建一个基础模型2.实例化一个系统自带的数据库操作类 2.0更加科学更加方便我们可以不用自己定义相关的数据库操作类thinkphp会自动帮我们找到这个数据库当中的表,并把表当中的相应的字段全部拿过来直接操作这个对象就是操作这张表new Model 在Model当中上传一个我们需要操作的表即可首字母大写原因因为我们命名表的时候think_user thinkphp 会按照大小写来区别你在前边有没有加下划线(1)$User=new Model(‘User’)表名为think_user_message 时$abc=new Model(‘UserMessage’) 或Model(‘User_message’)实例化对象之后就能直接使用这个模型操作类当中的方法进行相应的操作$user=new Model('User');$list=$user->select();dump($list);array(2) {[0] => array(3) {["id"] => string(1) "1"["username"] => string(4) "aaaa"["password"] => string(32) "74b87337454200d4d33f80c4663dc5e5"}[1] => array(3) {["id"] => string(1) "2"["username"] => string(4) "bbbb"["password"] => string(32) "65ba841e01d6db7733e90a5b7f9e6f80"}}对于我们来说操作数组非常方便,而用数组分配到魔板当中进行遍历显示也是非常方便的所以thinkphp默认返回一个数组对于传统模式fetch_rows ………可以不用去管遍历形成数组的过程,已经遍历好了M() $user=M(‘User’);你需要实例化一个表勇士实例化一个自己写的数据库操作类(2)CommonModel.class.php<?phpclass CommonModel extends Model{public function abc(){echo ‘aaa’;}}?>IndexAction.php$user=M(‘User’,’CommonModel’);$user->abc();相当于$user= new CommonModel(‘user’);这样可以封装一些额外的逻辑方法(3)实例化一个用户定义模型需要手动创建一个模型 user 可以针对这张表来写一个自定义模型在自动模型当中可以封装thinkphp为我们提供的一些高级功能,还可以封装一些自定义方法来实现更加复杂的业务逻辑。
数据库部分2实例化模型的时候一般用M(‘user’)当表名为think_user_messageM(‘userMessage’) 或M(‘UserMessage’)对应创建UserMessageModel.class.php当这个类中想操作别的表名时真正表名为think_user_message_infoprotected $tableName=’UserMessageInfo’当表前缀不是think_ 时如cms_ blog_ 等protected $trueTableName=’cms_user’;跨库操作protected $dbName=’’;获取字段磁盘当中自动创建一个文件来写入我们的表字段信息一般情况下多服务器我们一般不向本地文件系统当中写入数据一方面担心无法解决到底在那个服务器上上传数据一方面为了节约系统的I/O开销,我们可以将对应的字段写到我们的Model里面来这样的话能够提高效率的同时节约I/O开销实现更加智能的用户信息判断字段protected $fields=array(0=>’id’,1=>’username’,2=>’password’,‘_pk’=’id’,‘_autoinc’=true,);$对象->getPk(); //获取主键$对象->getDbFields(); //夺取列信息CURD//创建更新读取删除(插入)create为什么要创建?创建的功能比我们想象的多它会自动获取相关数据自动令牌验证完成自动映射自动填充自动验证(三大自动)如果开启字段缓存还会匹配字段如果不存在字段他会获取字段(create)他是一系列方法的集合他返回一个数组,如果创建失败他会返回false可不可以不用创建?进了能使用创建会给我们很大的便利,他会将我们获取到的相关数据往一个对象成员属性里加注自动令牌!?完成信息的添加,修改有的人把网站页面另存为到了本地模拟了很多组数据不停的刷新向数据库中写入他还隐藏表单当中的ID给改了不仅可以改ID 为1 还可以改ID为2的处理过程当中可以判断上级来源如果上级来源的地址等于哦我们呢网站的地址我们将其写入如果不是我网站的我就禁止其写入上级来源可以被模拟thinkphp 提供了更加先进的解决方案自动令牌向当期那的SESSION回话当中放上一个MD5加密的字符串他会见这个字符串插入到表单的</from>之前第二个地方就是表单当中有function add(){$user=new Model('user');//这个数组信息,如查你用上了自动添充等,他的返回值更多啊。
thinkphp学习笔记thinkphp学习笔记MVC1、ly/index.php-Home/Lib/Action/IndexAction.class.phphttp://127.0.0.1/ly/index.php/index/showurl的4种访问方式 //重点!1.PATHINFO 模式 -- 重点http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值22.普通模式http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值23.REWRITE模式(重写模式)http://域名/项目名/模块名/方法名/键1/值1/键2/值24.兼容模式http://域名/项目名/入口文件?s=模块名/方法名/键1/值1/键2/值2常用函数配制文件1、'URL_PATHINFO_DEPR'=->'-',修改Url的分隔符2、引用入口文件中,开启/关闭后DEBUG调试模式。
关闭缓存文件define(‘APP_DEBUG’,TRUE);3、开启REWRITE模式1)修改apache配制文件,去掉REWRITE前面的逗号文件;2)修改入口文件的目录下创建.htaccessRewriteEngine on//开启重写引擎RewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]//去掉index.php 这个符号4、输出this->display()控制器文件的名称与模板文件名相同。
写一个与方法名同名的文件分配一个变量个模板this->assign(表示名,具体的值)this—>assign(‘data’,$name)前台页面的{}输出,在thinkphp中表示定界符5、修改左右定界符在配置文件中添加‘TML-L-DELIM’=>‘<{’,修改左定界符‘TML-L-DELIM’=>‘}>’,修改右定界符6、thinkphp/Home/Lib/Action/IndexAction.class.phpclass IndexAction excends Action{public function index(){$m=new Model('User');//新建一个模型类,并传如一个数据表$m=M('User');//等效于$m=new Model('User'),表名第一个字母大写$arr=$m->select();//将返回的对象调用一个select方法,并将返回的值赋值$var_dump($arr)$this->assign('data',$arr[0]['username']);//将$arr[0]['username']的值分配给data$this->assign('data',$arr);//将整个数组拿出来$this->display();//输出模板}public funcion show(){$this->display;}}thinkphp/Home/Tpl/Index/index.htmlhello <{$data}>//遍历数组//name传送过来的标示,模板遍历数组<{$vo.id}><{$/doc/9d12655846 .html,ername}><{$vo.sex}>thinkphp/Home/Conf/config.class.phpreturn array('URL_PATHINFO_DERP'=>'/',/修改YRL的分隔符/'TMPL_L_DELIM'=>'<{',//修改左定界符'TMPL_R_DELIM'=>'}>',//修改右定界符'DB_TYPY'=>'mysql',//设置数据库类型'DB_HOST'=>'localhost',//设置主机'DB_NAME'=>'myselft',//设置数据库名'DB_USER'=>'root',//设置数据库用户'DB_PWD'=>'root',//设置数据库密码'DB_PORT'=>'3306'//设置数据库访问端口'DB_PREFIX'=>'my_',//设置表前缀'DB_DSN'=>'mysql://root:@localhost:3306/mysql'//使用dsn方式配置数据库信息如果两者同时存在优选使用dsn方式)C-CREATE $m->add()U-UPDATE $m->save()R-READ $m->selectD-DELETE $m->delete()开启调试功能中的page_trace1)开启调试模式define(‘APP_DEBUG’,true)2)设置配置文件中加入配置项,开启页面trace'SHOW_PAGE_TRACE'=>TRUE。
thinkphp3.2.3学习笔记3.2框架初始的⽬录结构如下:1. 部署⽬录(或者⼦⽬录)2. ├─index.php ⼊⼝⽂件3. ├─README.md README⽂件4. ├─Application 应⽤⽬录5. ├─Public 资源⽂件⽬录6. └─ThinkPHP 框架⽬录3.2版本⾃带了⼀个完整的应⽤⽬录结构和默认的应⽤⼊⼝⽂件。
其中,Application 和Public ⽬录下⾯都是空的。
README.md⽂件仅⽤于说明,实际部署的时候可以删除。
上⾯的⽬录结构和名称是可以改变的,这取决于你的⼊⼝⽂件和配置参数。
Application⽬录默认是空的,但是第⼀次访问⼊⼝⽂件会⾃动⽣成,参考后⾯的⼊⼝⽂件部分。
其中框架⽬录ThinkPHP的结构如下:1. ├─ThinkPHP 框架系统⽬录(可以部署在⾮web⽬录下⾯)2. │├─Common 核⼼公共函数⽬录3. │├─Conf 核⼼配置⽬录4. │├─Lang 核⼼语⾔包⽬录5. │├─Library 框架类库⽬录6. ││├─Think 核⼼Think类库包⽬录7. ││├─Behavior ⾏为类库⽬录8. ││├─Org Org类库包⽬录9. ││├─Vendor 第三⽅类库⽬录10. ││├─... 更多类库⽬录11. │├─Mode 框架应⽤模式⽬录12. │├─Tpl 系统模板⽬录13. │├─LICENSE.txt 框架授权协议⽂件14. │├─logo.png 框架LOGO⽂件15. │├─README.txt 框架README⽂件16. │└─index.php 框架⼊⼝⽂件上述应⽤的⽬录结构只是默认设置,事实上,在实际部署应⽤的时候,我们建议除了应⽤⼊⼝⽂件和Public 资源⽬录外,其他⽂件都放到⾮WEB⽬录下⾯,具有更好的安全性。
⼊⼝⽂件:define('APP_PATH','./Apps/');define('DIR_SECURE_', 'default.html');//⽀持多个安全⽂件写⼊define('DIR_SECURE_', 'index.html,index.htm');//默认的安全⽂件只是写⼊⼀个空⽩字符串,如果需要写⼊其他内容,可以通过DIR_SECURE_CONTENT参数来指定define('DIR_SECURE_CONTENT', 'deney Access!');define('RUNTIME_PA TH','./Runtime/');define('APP_DEBUG',True);define('THINK_PA TH',realpath('../Think').'/');require THINK_PATH.'ThinkPHP.php';//require './ThinkPHP/ThinkPHP.php';*配置⽂件的定义格式均采⽤返回PHP数组的⽅式*惯例配置⽂件(位于ThinkPHP/Conf/convention.php)*应⽤配置⽂件调⽤所有模块之前都会⾸先加载的公共配置⽂件(默认位于Application/Common/Conf/config.php)获取已经设置的参数值:C('参数名称')设置新的值:C('参数名称','新的参数值');扩展配置可以⽀持⾃动加载额外的⾃定义配置⽂件,并且配置格式和项⽬配置⼀样。
thinkPHP学习笔记18-29预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制【知识回顾】数据库模型model应用mysql数据库操作(增、删、查、改)【链接数据库配置】convertion.phpconfig.php1.在config.php里面做数据库链接配置2.新建model,并修改其trueTablename属性3.修改表前缀4.字段缓存设置tp框架执行过程中会使用到数据表中的字段信息,通过sql语句“show colums from table”,出于性能考虑,可以把字段缓存,避免每次重复执行SQL语句。
5. 可以根据当前情况对model进行个性化设置【实例化Model的三种方式】1.$goods=new 命名空间GoodModel();2.$goods=D(“模型标志”);a)$goods=D(“Goods”);b)该¥goods是父类Model的对象,单操作的数据表还是sw_goodsc)$goods=D()实例化Model对象,没有具体操作数据表,与M()方法效果一致;3.$obj=M();a)实例化父类Modelb)可以直接调用父类Model里面的属性,获得数据库相关操作c)自定义Model就是一个空壳,没必要实例化自定义modeld)$obj=M(“数据表标志”);实例化Model对象,实际操作具体的数据表D()和M()的区别前者是tp3.1.3里面对new操作的简化方法后者在使用,就是实例化Model父类两者都在函数库文件定义ThinkPHP/Common/functions.php 注意,如果没有对应的Model模型文件,也可以直接实例化model对象进行操作D(),M()都可以实例化操作一个没有具体Model模型类文件的数据表【数据查询】select() 是数据模型的一个指定方法,可以获得数据表的数据信息返回一个二维数组,是数据表的全部信息1.配置smartya)配置变量信息(1)convertion.php(2)Behavior.php(页面底部显示配置,smarty配置)(3)系统里面还有一些零散的配置信息b)在config.php 里面配置smarty实用信息模板引擎配置参数(不能直接修改,在config.php里面重写)2.具体使用(从tp引擎变成smarty引擎)a)css样式如果有{},需要使用{literal}标签禁止smarty解析b)关键字$Think变为$smarty3.tp 引擎会对关键字常量进行替换,例如:__CONTROLLER__ __MODEL__smarty引擎不会给替换,需要设置为:{$smarty.const.__CONTROLLER__}【各种查询条件设置】$obj=D(标志);创建对象$obj->select();select 字段,字段from 表名where 条件group by 字段having 条件order by 排序limit 限制条数;select %DISTINCT%%FIELD% from %TABLE%%JOIN% where %% group %% having %%order %% limit %%UNION%%COMMENT%$obj->field(字段,字段);查询制定字段$obj->table(数据表);通过具体数据表查询$obj->where(参数); 查询的限制条件$obj->group(字段); 根据分组进行查询$obj->having(参数条件);having限制条件$obj->order(“price desc/asc”);排序查询$obj->limit([偏移量,]条数);查询条数限制sql 语句里面具体的设置条件在tp框架模型里边体现为体现为具体的方法操作以上方法理论上都是父类model对应的方法父类model具体存在的方法:field(),where(),limit()还有一些方法在__call()自动调用函数里面:table(),group(),order(),having() 在__call()魔术方法里面会判断当前执行的方法是否是一个method属性的元素信息,如果存在就会执行以上多个方法是同时使用多个进行显示(并且没有顺序要求)$obj->limit(5)->field(…id,name?)->order(…pieceasc?)->table(…sw_goods?)->select();以上许多方法执行没有顺序要求,许多方法执行后都是把具体的参数赋予到Model属性option里面,最后根据option拼装sql语句。
问题1:thinkPHP默认访问的模块、控制器、方法是什么?问题2:thinkPHP对模块缺失如何处理?frameset绝对路径写法thinkPHP常量写法【空操作和空控制器的使用】空操作:访问不存在的方法空控制器:访问不存在的控制器http://网址/index.php/Home/User/loginhttp://网址/index.php/Home/User/login空操作http://网址/index.php/Home/beijing/login空控制器空操作一般网站出于安全考虑,不给用户提供任何错误信息“空操作”的本质意思:一个对象(控制器)调用本身不存在的方法在OOP里面,对象调用不存在的方法,出于用户体验的考虑,我们可以使用类里面的魔术方法:function__call();普通控制器父类的位置Controller类中的__call()方法从以上代码可知,空操作有两种解决方法:1.在对应控制器里面制作一个方法,名称为“_empty”,则这个控制器的空操作都会执行该方法。
(推荐使用)2.给空操作的名称制作一个同名模板,系统会自动调用。
【空控制器】http://网址/index.php/Home/Tianjin/login空控制器:在实例化控制器对象的时候,没有找到制定的类什么时候实例化控制对象:ThinkPHP/Library/Think/App.class.php熟记文件:index.php入口文件ThinkPHP/ThinkPHP.php框架核心文件ThinkPHP/Library/Think/Think.class.php框架核心文件ThinkPHP/Library/Think/App.class.php框架应用文件App.class.php内部包括控制器对象创建,以及对象调用指定的方法呈现内容空控制器处理方案:可以制作一个控制器,名称为EmptyController.class.php在该控制器内部只需要有一个_empty()方法即可。
-------------------ONE-----------------------------一、ThinkPHP的介绍//了解MVCM - Model 模型工作:负责数据的操作V - View 视图(模板)工作:负责前台页面显示C - Controller 控制器(模块)工作:描述功能框架二、ThinkPHP的获取//了解http://thinkphp三、ThinkPHP核心文件介绍//了解├─ThinkPHP.php 框架入口文件├─Common 框架公共文件├─Conf 框架配置文件├─Extend 框架扩展目录├─Lang 核心语言包目录├─Lib 核心类库目录│├─Behavior 核心行为类库│├─Core 核心基类库│├─Driver 内置驱动││├─Cache 内置缓存驱动││├─Db 内置数据库驱动││├─TagLib 内置标签驱动││└─Template 内置模板引擎驱动│└─Template 内置模板引擎└─Tpl 系统模板目录四、实验环境搭建//了解五、项目搭建//重点#项目目录结构及说明:Home 前台应用文件夹├─Common 项目公共文件目录├─Conf 项目配置目录├─Lang 项目语言目录├─Lib 项目类库目录│├─Action Action类库目录│├─Behavior 行为类库目录│├─Model 模型类库目录│└─Widget Widget类库目录├─Runtime 项目运行时目录│├─Cache 模板缓存目录│├─Data 数据缓存目录│├─Logs 日志文件目录│└─Temp 临时缓存目录└─Tpl 项目模板目录-------------------TWO-----------------------------一、什么是MVC //了解M -Model 编写model类对数据进行操作V -View 编写html文件,页面呈现C -Controller 编写类文件(UserAction.class.php)二、ThinkPHP的MVC特点//了解三、ThinkPHP的MVC对应的目录//了解M 项目目录/应用目录/Lib/ModelV 项目目录/应用目录/TplC 项目目录/应用目录/Lib/Action四、url访问C //了解五、url的4种访问方式//重点!1.PA THINFO 模式-- 重点!!!!!!http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值22.普通模式http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值23.REWRITE模式http://域名/项目名/模块名/方法名/键1/值1/键2/值24.兼容模式http://域名/项目名/入口文件?s=模块名/方法名/键1/值1/键2/值2-------------------THREE-----------------------------一、ThinkPHP 3 的输出(重点)a、通过echo 等PHP原生的输出方式在页面中输出b、通过display方法输出想分配变量可以使用assign方法c、修改左右定界符休要修改配置文件中的配置项'TMPL_L_DELIM'=>'<{', //修改左定界符'TMPL_R_DELIM'=>'}>', //修改右定界符二、ThinkPHP 3 的模型使用(重点)需要在方法中通过new Model(表名)的形式操作数据库$m=new Model('User');$arr=$m->select();'DB_TYPE'=>'mysql', //设置数据库类型'DB_HOST'=>'localhost',//设置主机'DB_NAME'=>'thinkphp',//设置数据库名'DB_USER'=>'root', //设置用户名'DB_PWD'=>'', //设置密码'DB_PORT'=>'3306', //设置端口号'DB_PREFIX'=>'tp_', //设置表前缀-------------------FOUR-----------------------------一、ThinkPHP 3 的输出(重点)a、通过echo 等PHP原生的输出方式在页面中输出b、通过display方法输出想分配变量可以使用assign方法c、修改左右定界符休要修改配置文件中的配置项'TMPL_L_DELIM'=>'<{', //修改左定界符'TMPL_R_DELIM'=>'}>', //修改右定界符二、ThinkPHP 3 的模型使用(重点)需要在方法中通过new Model(表名)的形式操作数据库$m=new Model('User');$arr=$m->select();'DB_TYPE'=>'mysql', //设置数据库类型'DB_HOST'=>'localhost',//设置主机'DB_NAME'=>'thinkphp',//设置数据库名'DB_USER'=>'root', //设置用户名'DB_PWD'=>'', //设置密码'DB_PORT'=>'3306', //设置端口号'DB_PREFIX'=>'tp_', //设置表前缀也可以使用DSN方法进行配置'DB_DSN'=>'mysql://root:@localhost:3306/thinkphp',//使用DSN方式配置数据库信息如果两种方式同时存在,以DSN方式为优先还有一种简单实用模型的方式M() 等效为new Model();$m=M('User');$arr=$m->select();使用模型的实例可以对数据进行操作,操作的工作一般就是对数据库进行增删改查CURD 增-C Create $m->add()删-D Delete $m->delete()改-U Update $m->save()查-R Read $m->select()三、补充(了解)a、模板可以遍历数组<volist name='data' id='vo'><{$vo.id}>----<{$ername}>-----<{$vo.sex}><br/></volist>b、我们可以开启调试功能中的page_trace1.开启调试功能//3.开启调试模式define('APP_DEBUG',true);2.我们需要设置配置文件,开启页面trace'SHOW_PAGE_TRACE'=>true,//开启页面Trace-------------------FIVE-----------------------------一、ThinkPHP 3 的CURD介绍(了解)二、ThinkPHP 3 读取数据(重点)对数据的读取Read$m=new Model('User');$m=M('User');select$m->select();//获取所有数据,以数组形式返回find$m->find($id);//获取单条数据getField(字段名)//获取一个具体的字段值$arr=$m->where('id=2')->getField('username');三、ThinkPHP 3 创建数据(重点)对数据的添加Create$m=new Model('User');$m=M('User');$m->字段名=值$m->add();返回值是新增的id号四、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);返回值是受影响行数-------------------SIX-----------------------------一、普通查询方式a、字符串$arr=$m->where("sex=0 and username='gege'")->find();b、数组$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 小于LIKE 模糊查询$data['username']=array('like','%ge');$arr=$m->where($data)->select();NOTLIKE$data['username']=array('notlike','%ge%'); //notlike中间没有空格$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));$arr=$m->where($data)->select();//SELECT * FROM `tp_user` WHERE ( `id` NOT IN (4,6,7) )-------------------SEVEN----------------------------一、普通查询方式a、字符串$arr=$m->where("sex=0 and username='gege'")->find();b、数组$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 小于LIKE 模糊查询$data['username']=array('like','%ge');$arr=$m->where($data)->select();NOTLIKE$data['username']=array('notlike','%ge%'); //notlike中间没有空格$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));$arr=$m->where($data)->select();//SELECT * FROM `tp_user` WHERE ( `id` NOT IN (4,6,7) )三、区间查询$data['id']=array(array('gt',4),array('lt',10));//默认关系是and 的关系//SELECT * FROM `tp_user` WHERE ( (`id` > 4) AND (`id` < 10) )$data['id']=array(array('gt',4),array('lt',10),'or') //关系就是or的关系$data['name']=array(array('like','%2%'),array('like','%五%'),'gege','or');四、统计查询count //获取个数max //获取最大数min //获取最小数avg //获取平均数sum //获取总和五、SQL直接查询a、query 主要数处理读取数据的成功返回数据的结果集失败返回boolean false$m=M();$result=$m->query("select * from t_user where id >50");var_dump($result);b、execute 用于更新个写入操作成功返回影响行数失败返回boolean false$m=M();$result=$m->execute("insert into t_user(`username`) values('ztz3')");var_dump($result);------------------EIGHT---------------------------一、常用连贯操作1.where帮助我们设置查询条件2.order对结果进行排序$arr=$m->order('id desc')->select();$arr=$m->order(array('id'=>'desc','sex'=>'asc'))->select();3.limit限制结果limit(2,5)limit('2,5')limit(10)//limit(0,10)4.field设置查询字段field('username as name,id')field(array('username'=>'name','id')field('id',true) //获取除了id以外的所有字段5.table6.group7.having二、补充alias 用于给当前数据表定义别名字符串page 用于查询分页(内部会转换成limit)字符串和数字join* 用于对查询的join支持字符串和数组union* 用于对查询的union支持字符串、数组和对象distinct 用于查询的distinct支持布尔值lock 用于数据库的锁机制布尔值cache 用于查询缓存支持多个参数(以后在缓存部分再详细描述)relation 用于关联查询(需要关联模型扩展支持)字符串validate 用于数据自动验证数组auto 用于数据自动完成数组filter 用于数据过滤字符串scope* 用于命名范围字符串、数组------------------NINE---------------------------一、模板的使用(重点)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、display1.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);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);三、模板中的赋值(重点)//$this->assign('name','赵桐正');$this->name='赵桐正2';$this->display();四、模板替换(重点)__PUBLIC__:会被替换成当前网站的公共目录通常是/Public/__ROOT__:会替换成当前网站的地址(不含域名)__APP__:会替换成当前项目的URL地址(不含域名)__GROUP__:会替换成当前分组的URL地址(不含域名)__URL__:会替换成当前模块的URL地址(不含域名)__ACTION__:会替换成当前操作的URL地址(不含域名)__SELF__:会替换成当前的页面URL更换模板变量规则,修改配置项'TMPL_PARSE_STRING'=>array( //添加自己的模板变量规则'__CSS__'=>__ROOT__.'/Public/Css','__JS__'=>__ROOT__.'/Public/Js',------------------TEN---------------------------一、变量输出(重点)1.标量输出2.数组输出{$name[1]}{$name['k2']}{$name.k1}3.对象输出{$name:k}{$name->k}二、系统变量{$Think.get.id}三、使用函数{$name|strtoupper} 生成的编译后文件是<?php echo (strtoupper($name)); ?>{$name|date='Y m d H:i:s',###}四、默认值{$name|default='这里是默认值'}五、运算符{$name++}。
thinkphp3.2笔记(4)模板函数的使⽤foreach标签⼀模板函数的使⽤1.代码效果:函数会按照从左到右的顺序依次调⽤。
如果你觉得这样写起来⽐较⿇烦,也可以直接这样写:{:substr(strtoupper(md5($name)),0,3)}默认值输出{$user|default="这家伙很懒,什么也没留下"}2 模板运算符{:3+4*2-1} 效果10{3+4*2-1} 效果 {3+4*2-1}在使⽤运算符的时候,不再⽀持点语法和常规的函数⽤法,例如:{$user.score+10} //错误的{$user['score']+10} //正确的{$user['score']*$user['level']} //正确的{$user['score']+myFun($user['level'])} //正确的⼆ foreach 标签foreach标签类似与volist标签,只是更加简单,没有太多额外的属性,例如:<foreach name="list" item="vo">{$vo.id}:{$}</foreach>name表⽰数据源 item表⽰循环变量。
可以输出索引,如下:<foreach name="list" item="vo" >{$key}|{$vo}</foreach>也可以定义索引的变量名<foreach name="list" item="vo" key="k" > { $k}|{$vo}</foreach>三 if标签与⽐较标签⽐较标签⽐较标签⽤于简单的变量⽐较,复杂的判断条件可以⽤if标签替换,⽐较标签是⼀组标签的集合,基本上⽤法都⼀致,如下:<⽐较标签 name="变量" value="值">内容</⽐较标签>系统⽀持的⽐较标签以及所表⽰的含义分别是:标签含义eq或者 equal 等于neq 或者notequal 不等于gt ⼤于egt ⼤于等于lt ⼩于elt ⼩于等于heq 恒等于nheq 不恒等于他们的⽤法基本是⼀致的,区别在于判断的条件不同,并且所有的⽐较标签都可以和else标签⼀起使⽤。
ThinkPHP课程目标:1、关于mvc和tp的简介2、快速入门3、学习tp中的各个组件(M、V、C)控制器模型视图4、实用项关于MVC和TP的简介:一、什么是框架框架,即framework。
其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。
二、为什么使用框架●代码重用●合理分工●解决多人协作开发问题三、主流的php框架●Zend Framework●Yii●Symfony●Codelgniter●ThinkPHP●……四、什么是MVC●MVC是施乐帕克研究中心(Xerox PARC)在八十年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用。
●MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。
使用MVC应用程序被分成三个核心部件:模型、视图、控制器。
●M:model模型表示企业数据和业务规则●V:view视图是用户看到并与之交互的界面●C:controller控制器接受用户的输入并调用模型和视图去完成用户的需求我们去吃饭,大堂经理问我们:客官来点什么?我们:来地沟油!经理让服务员将我们带到包房经理将我们点的菜发给厨房厨房开始做菜,好了之后,通知经理经理让服务员将菜端给我们经理:控制器后厨:模型菜:数据服务员:视图五、获取ThinkPHP●●下载thinkphp3.0●直接部署到项目中●php5.2所有tp版本要求php必须是5以上的,tp3中要求是5.2以上的快速入门一、了解TP目录结构将下载的tp3.0压缩包进行解压,可看到两个夹:Examples:代码示例ThinkPHP:这是我们想用的框架程序我们需要将Thinkphp 文件夹移动至我们的项目中,打开ThinkPHP文件夹,可以看到如下内容:●ThinkPHP.php 框架入口文件●Common 框架公共文件目录●Conf 框架配置文件目录●Lang 框架系统语言目录●Lib系统核心基类库目录●Tpl 系统模板目录●Extend 框架扩展目录二、开发流程●创建项目,并将ThinkPHP获得●创建入口文件●配置项目●创建控制器●创建模型(可以不存在自定义模型)●创建模板●运行调试,调优●部署到生产环境三、入口文件●所有项目都是从入口文件开始的●定义框架路径●定义项目路径●定义项目名称●载入框架入口文件四、第一个ThinkPHP项目1、创建项目2012,将thinkphp复制到我们网站的根路径下,在htdocs下创建index.php文件●require("ThinkPHP/ThinkPHP.php");●THINK_PATH●APP_NAME●APP_PATH在tp中,由于目录结构稍微复杂,所以在第一次访问入口文件时,会帮助我们自动创建项目结构运行路径:http://localhost/index.php,可以看到如下界面,说明运行成功2、了解项目目录结构●Common 项目公共文件目录●Conf 项目配置目录●Lang 项目语言包目录●Lib项目类库目录●Tpl 项目模板目录●Runtime项目运行时目录3、为什么输入地址之后,可以看到内容http://localhost/index.php由于请求的是这个url,如果没有写任何信息,表示请求Index模块的index动作也就是说:会自动请求IndexAction这个类下的index方法为什么这样自动请求??●DEFAULT_MODULE:默认的默认模块名●DEFAULT_ACTION:默认的动作名这个是由于这两个配置选项来决定的在配置文件Conf/config.php中添加如下内容:这时会请求StudentAction这个类下的add方法。