thinkphp3.2.3学习笔记
Think3.2入门笔记
![Think3.2入门笔记](https://img.taocdn.com/s3/m/80cc9331ff00bed5b9f31d46.png)
1.钩子TP的钩子是在网页执行某些行为的时候触发某些事件,主要应用场合是在不想更改主体代码但是又想添加某些功能,使用钩子会比较灵活。
2.widget组件和全局标签{//加载导航栏}{~$navbar=W("Nav/def")}<foreach name="navbar" item="abc"><li><a href="#">{$abc.nav_title}</a></li></foreach>widget一般适合在一些自己做的项目上使用,可以让代码更简洁<taglib name = "Home\Tag\Nav" /><nav:load></nav:load>使用自定义标签的话,第一个可以灵活传入参数,第二能对代码有一定的混淆作用3.在PHP中输出代码字符注意事项代码如上,echo与左边的单引号之间要加空格,否则可能无法正常运行。
因为这样写是没用换行符的,如果开头不加空格有可能导致编译出错4.block标签的作用Block 标签是为了继承模板,一般是在基础模板中定义好各自的block区,然后子模板继承了基础模板后,根据自己的情况灵活修改各个block区比如base模板如下:<include file="Online/index/header" title="新闻标题" /><hr/><block name="customer">自定义区</block><include file="Online/index/footer" />在base模板里面定义好这个区域后,在子模板这样写:<extend name="Online/index/base" /><block name="customer">登录模块</block>那就可以在子模板中自己定义customer里面的内容,但是其他地方依旧继承base 模板里面的5.display()输出详解// 不带任何参数自动定位当前操作的模板文件$this->display();表示系统会按照默认规则自动定位模板文件,其规则是:如果当前没有启用模板主题则定位到:当前模块/默认视图目录/当前控制器/当前操作.html如果有启用模板主题则定位到:当前模块/默认视图目录/当前主题/当前控制器/当前操作.htm l 比如UserController中的login()执行$this->theme("Online")->display();就是在该模块中的默认试图目录view中的Online(主题)文件夹——User(当前控制器)文件夹——l ogin.html(当前方法)space是为了防止定义的变量和方法出现同名7.为了实现某些方法/函数复用,可以把这些功能封装到一个类里面进行扩展。
thinkphp学习笔记
![thinkphp学习笔记](https://img.taocdn.com/s3/m/80fddcff5ef7ba0d4a733b7b.png)
一、ThinkPHP的介绍//了解MVCM - Model 模型工作:负责数据的操作V - View 视图(模板)工作:负责前台页面显示C - Controller 控制器(模块)工作:描述功能框架二、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 项目模板目录一、什么是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_', //设置表前缀一、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 小于ELT小于等于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 小于ELT小于等于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.3学习笔记
![thinkphp3.2.3学习笔记](https://img.taocdn.com/s3/m/1dc4381b4b7302768e9951e79b89680203d86b18.png)
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学习笔记-9页word资料
![thinkphp学习笔记-9页word资料](https://img.taocdn.com/s3/m/3c175533f12d2af90342e622.png)
-------------------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.3 开发大型商城项目完整笔记
![Thinkphp3.2.3 开发大型商城项目完整笔记](https://img.taocdn.com/s3/m/00583cc849649b6648d747f3.png)
2
3.子级(多级)空间.......................................................................................................... 41 3.1 空间元素访问的三种形式 ...................................................................................... 42
目录
一、 TinkPHP 框架........................................................................................................... 5 二、创建应用 ........................................................................................................................... 8
1.路由.................................................................................................................................... 9 2.创建控制器........................................................................................................................ 9 3.创建 view 模板 ............................................................................................................... 10 4.display()三种使用形式.................................................................................................. 10 5.创建模板文件.................................................................................................................. 11 6.已有模板与框架结合...................................................................................................... 11 7.css 引入图片 ................................................................................................................... 12 三、后台页面搭建 ................................................................................................................. 13 1.列表展示【熟悉 target 属性使用】 ............................................................................ 15 2.商品控制器...................................................................................................................... 16 四、细节处理 ......................................................................................................................... 17 1、配置文件介绍............................................................................................................... 17 2.tp 的两种开发模式......................................................................................................... 18 3.开启 Smarty 模板引擎 .................................................................................................. 19 4.Smarty 模板{}标记有冲突............................................................................................. 19 五、框架的执行流程 ............................................................................................................. 20
笔记(自己整理的thinkphp笔记)
![笔记(自己整理的thinkphp笔记)](https://img.taocdn.com/s3/m/d666eefe112de2bd960590c69ec3d5bbfd0ada37.png)
笔记(⾃⼰整理的thinkphp笔记)ThinkphpLesson_1 ThinkPHP.3.1.2.介绍及安装1.总结a)Home放前台,Admin放后台, Public放共有的资源2.配置gvim打开安装⽬录下的_vimrc⽂件,添加set nu! 显⽰⾏数colorscheme darkblue 背景颜⾊设置为深蓝⾊gvim配置不⾃动⽣成备份⽂件默认情况下⽤gVim编辑⽂件时,会⾃动⽣成带~的备份⽂件。
如果不想在编辑⽂件时⾃动⽣成备份⽂件的话,可以这么做:打开gVim安装⽬录下的vimrc_example.vim,将其中的如下部分中的else语句⽤引号注释掉:if has("vms")set nobackup " do not keep a backup file, use versions insteadelseset backup " keep a backup file即将上⾯四句改为:if has("vms")set nobackup " do not keep a backup file, use versions instead" else" set backup " keep a backup file⾥,else部分⽤双引号注释掉即可。
set backup是设置使⽤⾃动⽣成备份⽂件的命令。
windows上gvim的编码设置Windows系统默认的编码是cp936,所以⽤gvim⼀打开⽂件,默认是⽤gb2312编码打开的。
这导致很多时候打开的⽂件是乱码,不能正常显⽰,那要怎么解决这个问题呢?很简单,看下⾯的设定:打开gvim,到菜单栏找到“编辑”,在下拉菜单找到“启动设定”点击“启动设定”进去,你会看到相应的配置⽂件在⽂件的末尾加⼊如下设定:set encoding=utf-8set fileencodings=utf-8,chinese,latin-1if has("win32")set fileencoding=chineseelseset fileencoding=utf-8endifsource $VIMRUNTIME/delmenu.vimsource $VIMRUNTIME/menu.vimlanguage messages zh_CN.utf-8保存后退出gvim,重新启动,惊喜出现了,乱码不见了,是不是很简单,可以动⼿试⼀试了!3.ThinkPHP核⼼⽂件介绍├─ThinkPHP.php 框架⼊⼝⽂件├─Common 框架公共⽂件├─Conf 框架配置⽂件├─Extend 框架扩展⽬录├─Lang 核⼼语⾔包⽬录├─Lib 核⼼类库⽬录│├─Behavior 核⼼⾏为类库│├─Core 核⼼基类库│├─Driver 内置驱动││├─Cache 内置缓存驱动││├─Db 内置数据库驱动││├─TagLib 内置标签驱动││└─Template 内置模板引擎驱动│└─Template 内置模板引擎└─Tpl 系统模板⽬录4.项⽬⽬录结构及说明Home 前台应⽤⽂件夹├─Common 项⽬公共⽂件⽬录├─Conf 项⽬配置⽬录├─Lang 项⽬语⾔⽬录├─Lib 项⽬类库⽬录│├─Action Action类库⽬录│├─Behavior ⾏为类库⽬录│├─Model 模型类库⽬录│└─Widget Widget类库⽬录├─Runtime 项⽬运⾏时⽬录│├─Cache 模板缓存⽬录│├─Data 数据缓存⽬录│├─Logs ⽇志⽂件⽬录│└─Temp 临时缓存⽬录└─Tpl 项⽬模板⽬录Lesson_2 ThinkPHP.3.1.2.MVC模式和URL访问1.字符串串接的⽅法使⽤’ . ’分割的两个字符串会在显⽰时串接起来2.开启调试功能有时由于缓存的原因,导致⾃⼰做的修改不能⽴即⽣效, 此时删除Runtime⽂件夹即可, 也可以开启调试模式, 这样系统不会再缓存. 但是建议在项⽬搭建到服务器时,关闭调试模式开启调试功能(在项⽬⽂件夹下的index.php中)define('APP_DEBUG',true);我们需要设置配置⽂件(Conf/config.php),开启页⾯trace'SHOW_PAGE_TRACE'=>true,//开启页⾯Trace3.ThinkPHP的MVC对应的⽬录M 项⽬⽬录/应⽤⽬录/Lib/ModelV 项⽬⽬录/应⽤⽬录/TplC 项⽬⽬录/应⽤⽬录/Lib/Action4.url的4种访问⽅式PATHINFO 模式-- 重点http://域名/项⽬名/⼊⼝⽂件/模块名/⽅法名/键1/值1/键2/值2例如: http://localhost/thinkPHPTest/Index.php/Index/show/name/yinliang访问的是\Home\Lib\Action\ IndexAction.class.php的index⽅法,并将name=’yinliang’传递给后台普通模式http://域名/项⽬名/⼊⼝⽂件?m=模块名&a=⽅法名&键1=值1&键2=值2 例如: http://localhost/thinkPHPTest/Index.php?m=Index&a=show&name=yinliang&age=12REWRITE模式http://域名/项⽬名/模块名/⽅法名/键1/值1/键2/值2兼容模式http://域名/项⽬名/⼊⼝⽂件?s=模块名/⽅法名/键1/值1/键2/值2Lesson_3,4 ThinkPHP.3.1.2.输出和模型使⽤1.配置项⽬⽂件详解(__ROOT__\Home\Conf\config.php)'URL_PATHINFO_DEPR'=>'/',//修改URL的分隔符'TMPL_L_DELIM'=>'<{', //修改左定界符'TMPL_R_DELIM'=>'}>', //修改右定界符'DB_TYPE'=>'mysql', //设置数据库类型'DB_HOST'=>'localhost',//设置主机'DB_NAME'=>'thinkphp',//设置数据库名'DB_USER'=>'root', //设置⽤户名'DB_PWD'=>'', //设置密码'DB_PORT'=>'3306', //设置端⼝号'DB_PREFIX'=>'tp_', //设置表前缀'DB_DSN'=>'mysql://root:@localhost:3306/thinkphp',//使⽤DSN⽅式配置数据库信息'SHOW_PAGE_TRACE'=>true,//开启页⾯Trace'TMPL_TEMPLATE_SUFFIX'=>'.html',//更改模板⽂件后缀名'TMPL_FILE_DEPR'=>'_',//修改模板⽂件⽬录层次'TMPL_DETECT_THEME'=>true,//⾃动侦测模板主题'THEME_LIST'=>'your,my',//⽀持的模板主题列表'TMPL_PARSE_STRING'=>array( //添加⾃⼰的模板变量规则'__CSS__'=>__ROOT__.'/Public/Css','__JS__'=>__ROOT__.'/Public/Js',),'LAYOUT_ON'=>true,//开启模板渲染'URL_CASE_INSENSITIVE'=>true,//url不区分⼤⼩写'URL_HTML_SUFFIX'=>'html|shtml|xml',//限制伪静态的后缀'APP_GROUP_LIST' => 'Home,Admin', //项⽬分组设定'DEFAULT_GROUP' => 'Home', //默认分组2.项⽬配置(__ROOT__\index.php)//1.确定应⽤名称Homedefine('APP_NAME','Home');//2.确定应⽤路径define('APP_PATH','./Home/');//3.开启调试模式define('APP_DEBUG',true);//4.应⽤核⼼⽂件require './ThinkPHP/ThinkPHP.php'>3.获取表单中的数据html中的form表单如下⽤户名密码验证码获取表单数据的Action对象函数如下public function do_login(){echo "fasdfasdfsd";dump($_POST['username']);}注:如果表单中的method="get",则上述函数中的$_POST要改为$_GET4.超链接地址的写法同项⽬下的超链接可不写ip地址如要访问项⽬thinkphp下的UserAction中的delete函数,可写为delete但是为了防⽌因项⽬名称(thinkphp)的更改,导致系统不能使⽤,可使⽤”__URL__”替换”/thinkphp/index.php/User/”,如以上地址改写为delete5.ThinkPHP 3 的输出a)通过echo 等PHP原⽣的输出⽅式在页⾯中输出b)通过display⽅法输出,如想分配变量可以使⽤assign⽅法,如在Action中// 本类由系统⾃动⽣成,仅供测试⽤途class IndexAction extends Action {public function index(){$this->assign('name','yinliang'); //给变量name分配值yinliang$this->display(); //输出Home\Tpl\Index\index.html}public function show(){echo "show: hello world";}}>html页⾯中显⽰的⽅法:在Home\Tpl\Index\index.html中要访问name变量可以在⽂件中添加{$name}(修改了左右定界符的则把{,}分别修改为修改后的左右定界符) 如:Hello {$name}6.建议修改左右定界符(为了防⽌{$data }与Jquery语法混淆)休要修改配置⽂件(Conf/config.php)中的配置项'TMPL_L_DELIM'=>'<{', //修改左定界符'TMPL_R_DELIM'=>'}>', //修改右定界符7.ThinkPHP 3 的模型使⽤(与数据库链接,操作数据库)a)创建数据库的步骤i.进⼊phpmyadmin URL为http://127.0.0.1/phpmyadmin/ii.点击数据库标签跳转到创建数据库的页⾯iii.左侧的输⼊框输⼊数据库的名字(例如thinkphp3), 右侧选择数据库编码为utf8_general_ci 点击创建iv.点击创建的数据库(例如thinkphp3),即可创建表v.先输⼊要创建的表的名字, 再输⼊标的字段数,点击执⾏vi.接下来的页⾯A_I表⽰⾃增, 索引下拉列表可以选择主键,唯⼀等属性, 整理表⽰编码格式vii.存储引擎选择MyISAMviii.……………………………..b)配置数据库(在Conf/config.php中配置数据库相关信息)'DB_TYPE'=>'mysql', //设置数据库类型'DB_HOST'=>'localhost',//设置主机'DB_NAME'=>'thinkphp',//设置数据库名'DB_USER'=>'root', //设置⽤户名'DB_PWD'=>'', //设置密码'DB_PORT'=>'3306', //设置端⼝号'DB_PREFIX'=>'tp_', //设置表前缀加表前缀是为了更好的区分表,⽐如cw_代表财务cg_代表采购,如果没有表前缀,则将tp_去掉即可注: 也可以使⽤DSN⽅法进⾏配置'DB_DSN'=>'mysql://root:@localhost:3306/thinkphp',//使⽤DSN⽅式配置数据库信息如果两种⽅式同时存在,以DSN⽅式为优先c)在Action的index函数中获取值public function index(){$m=new Model(User);//记住U⼤写$arr=$m->select();//user表中的所有数据都被放到数组$arr中$this->assign('name',$arr[1]['username']);//将name赋值为数组$arr中下标为//1的元素的username的值$this->display();}d)还有⼀种简单实⽤模型的⽅式M() 等效为new Model();$m=M('User');$arr=$m->select();e)使⽤模型的实例可以对数据进⾏操作,操作的⼯作⼀般就是对数据库进⾏增删改查CURD增-C Create $m->add()删-D Delete $m->delete()改-U Update $m->save()查-R Read $m->select()f)模板可以遍历数组:html页⾯中<{$vo.id}>----<{$/doc/6fc0f7fadd3383c4bb4cd2f2.html ername}>-----<{$vo.sex}>在Action中的index中给array赋值public function index(){$m=new Model('User');$arr=$m->select();$this->assign('array',$arr);$this->assign('name',$arr[1]['username']);$this->display();}Lesson_5,6,7 ThinkPHP.3.1.2.输出和模型使⽤.21.ThinkPHP 3.1.2 CURD特性a)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');b)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'];$newId=$m->add();if($newId>0){$this->success("Add new user successfully",index);$this->error("Add new user failed",index);}}c)ThinkPHP 3 删除数据$m=M('User');$m->delete(2); //删除id为2的数据$m->where('id=2')->delete(); //与上⾯效果相同,也是删除id为2的数据返回值是受影响⾏数代码⽰例:public function delete(){$id=$_GET['id'];$m=new Model('User');var_dump($id);// $m->delete(11);$count=$m->where('id='.$_GET['id'])->delete();if($count>0){$this->success("Data have been delete successfully");// $this->success("数据删除成功");}else{$this->error("The operation of deleting data exit error");// $this->error("数据删除失败");}}d)ThinkPHP 3 更新数据$m=M('User');$data['username']='ztz2';$m->save($data);返回值是受影响⾏数代码⽰例:public function update(){$m=new Model('User');$data['username']=$_POST['username'];$data['sex']=$_POST['sex'];$count=$m->save($data);if($count>0){$this->success("Data have been modify successfully",index);}else{$this->error("The operation of modifing data exit error",index);}}Lesson_8,9,10 ThinkPHP.3.1.2.查询⽅式的⼀般使⽤1.ThinkPHP 3.1.2 查询⽅式a)find只能查询⼀天记录,select可以查询多条记录i.普通查询⽅式ii.字符串$arr=$m->where("sex=0 and username='gege'")->find();iii.数组$data['sex']=0;$data['username']='gege';$arr=$m->where($data)->find();注意:这种⽅式默认是and的关系,如果使⽤or关系,需要添加数组值$data['sex']=0;$data['username']='gege';$data['_logic']='or';iv.表达式查询⽅式$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();}b)LIKE 模糊查询$data['username']=array('like','%ge');//查询username以ge结尾的user$data['username']=array('like','%ge%');//查询username包含ge的user$arr=$m->where($data)->select();c)NOTLIKE$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();d)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();e)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) )f)区间查询$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['username']=array(array('like','%2%'),array('like','%五%'),'gege','or');g)统计查询count //获取个数$data['username']=array(array("LIKE","%s%"),array("LIKE","%d%"),array("LIKE","%g%"),"or"); echo $m->where($data)->count();max //获取最⼤数echo $m->max("id");min //获取最⼩数echo $m->min("id");avg //获取平均数echo $m->avg("id");sum //获取总和echo $m->sum("id");h)SQL直接查询query 主要数处理读取数据的` 成功返回数据的结果集失败返回boolean false$m=M();$result=$m->query("select * from tp_user where id >50");var_dump($result);execute ⽤于更新个写⼊操作成功返回影响⾏数失败返回boolean false$m=M();$result=$m->execute("insert into tp_user(`username`) values('ztz3')");var_dump($result);2.总结a)多条件检索时, 从页⾯传递给后台的某个值可能为空. 可以使⽤isset函数进⾏判断, 如:if(isset($_POST[‘username’])&& $_POST[‘username’]!=null){$where[‘username’] = array(‘like’,” %{$_POST[‘username’]}% ”);}Lesson_11 ThinkPHP 3.1.2 连贯操作1.PHP中类的构造⽅法所有类的构造⽅法都如下,只是参数可以不⼀样function __construct($tableName){}2.字符串操作函数AddSlashes: 字符串加⼊斜线。
thinkphp3.2笔记(3)视图渲染模板的赋值与显示系统变量
![thinkphp3.2笔记(3)视图渲染模板的赋值与显示系统变量](https://img.taocdn.com/s3/m/3302ac370622192e453610661ed9ad51f01d5477.png)
thinkphp3.2笔记(3)视图渲染模板的赋值与显⽰系统变量⼀视图1 视图渲染渲染模板输出最常⽤的是使⽤display⽅法,调⽤格式:display('[模板⽂件]'[,'字符编码'][,'输出类型'])模板⽂件的写法⽀持下⾯⼏种:⽤法描述不带任何参数⾃动定位当前操作的模板⽂件[模块@][控制器:][操作] 常⽤写法,⽀持跨模块模板主题可以和theme⽅法配合完整的模板⽂件名直接使⽤完整的模板⽂件名(包括模板后缀)、下⾯是⼀个最典型的⽤法,不带任何参数:// 1. 不带任何参数⾃动定位当前操作的模板⽂件$this->display();//2 .带参数$this->display('goods2');//3. 指定其他控制器下的模板控制器:操作$this->display('Index:add');//4. 指定其他模块的模板 [模块@][控制器:][操作]$this->display('Admin@index:add');//5 . 完整模板名称要注意模板⽂件位置是相对于项⽬的⼊⼝⽂件,⽽不是模板⽬录。
$this->display('./add.html');2 display和fetch ⽅法的区别display: 获取具体的模板内容并且⾃动输出fetch: 获取模板内容,但是不会⾃动输出如果要⽤到fetch输出模板,先⽤fetch,后⽤show$this->show($this->fetch('goods'));3 模板替换1)创建⽅法渲染模板<link rel="stylesheet" type="text/css" href="/Public/css.css"/>public 前⾯的/理解为根⽬录2. 替换规则在进⾏模板渲染之前,系统还会对读取的模板内容进⾏⼀些特殊字符串替换操作,也就是实现了模板输出的替换和过滤。
ThinkPHP学习记录
![ThinkPHP学习记录](https://img.taocdn.com/s3/m/671e5e6227d3240c8447ef76.png)
ThinkPHP学习记录MVC:现在我们总绌MVC的处理过程,首先控制器接收用户的请求,来决定应调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的规图格式化模型返回的数据,并通过表示层呈现给用户。
对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。
内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。
因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
AOP(面向方面编程),可以说是OOP(面向对象编程)的补充和完善。
OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。
当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。
也就是说,OOP 允许定义从上而下的关系,但并不适合定从左到右的关系。
而AOP技术则恰恰相反,它刟用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。
所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便亍减少系统的重复代码,降低模块间的耦合度。
AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。
而剖开的切面,也就是所谓的“方面”了。
使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。
业务处理的主要流程是核心关注点,不与之关系不大的部分是横切关注点。
横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。
比如权限认证、日志、事务处理。
Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
ThinkPHP学习笔记
![ThinkPHP学习笔记](https://img.taocdn.com/s3/m/89440e1aba1aa8114431d9ad.png)
ThinkPHP框架ThinkPHP框架 (1)Day01 (3)一、如何学习框架: (3)2.ThinkPHP (3)2.1配置tp框架 (3)A/安装好.下载源码包 (3)B/新建一个项目目录shop (3)C/编写入口程序index.php (3)2.2项目目录说明: (4)2.3 url地址模式(4种): (4)2.4修改默认的控制器及方法名称: (4)2.5编写控制器: (4)2.51编写控制器规则: (4)例子:声明控制器Test (5)2.6Action的方法: (5)1)给模板传值 (5)2)显示模板 (5)3)跳转提示 (5)4)失败跳转 (6)练习: (6)2.7 m层的编写: (7)1、链接数据库 (7)2、测试数据库连接是否成功。
(7)3.数据模型类:(会员注册) (7)《例3.1.1userController》 (7)《3.1.2UserModel.class.php》 (8)3.1增加: (10)3.2查询: (11)3.2.1普通查询 (11)《例》 (11)3.2.2分组查询: (12)3.2.3链接查询: (12)Day02 (12)2.创建分组: (12)3.后台: (13)4.修改文章 (13)5.自动验证 (13)《例》自动验证 (14)6.自动填充: (15)《例》自动验证 (15)Day03 ==>V层: (15)1.Think标签 (15)1.1变量标签 (15)1.2循环标签 (16)1.3条件标签 (16)1.4变量调节器 (17)1.5模板引用标签 (17)1.6常量调用 (17)1.7预定义变量调用 (17)1.8模板替换标签,作用,用来产生url (17)Day04 (18)ThinkPHP总结: (19)一、如何学习框架: (19)1、url地址规则:(可能面试) (20)2.1 c层控制器规则: (20)2.2 Action基类的方法: (20)2.3、M层规则: (20)2.4定义模型的语法格式 (20)2.5获得模型对象的方法 (21)2.6 Model的方法: (21)2.6.1查询语句的语法格式 (21)select 字段列表from 表名 (21)表链接查询的语法格式 (22)2.6.2数据库操作写法例举: (22)2.6.3数据库操作写法例举: (23)3.1Think标签 (23)3.2变量调节器 (25)3.2页面重定向 (25)3.3 success页面 (25)3.4 ThinkPHP分页类的位置 (25)3.5ThinkPHP表单所有验证方式 (26)4.公共类: (26)4.1分页类 (26)4,2分页类步骤: (26)《例:分页类》 (27)4.3文件(图片)上传类:步骤 (27)《例:多文件上传》 (28)4.4验证码 (29)《例:验证码》 (29)Day01框架:项目的必要代码。
最新ThinkPHP学习笔记
![最新ThinkPHP学习笔记](https://img.taocdn.com/s3/m/17e711eb240c844769eaeebe.png)
Thinkphp1.单入口原理访问任何文件都必须通过某一个固定文件,如index.php,这就是单入口原理。
2.百度收录网站的时候,更倾向于目录和静态文件。
3.基础项目中一个模块就是一个文件夹,模块的增删改查操作就是文件夹里对应的文件。
4.在ThinkPHP中,一个模块就是一个类文件,也就是模块文件,而模块的增删改查操作,就是该类文件中的对应的方法。
5.在ThinkPHP中,要增加一个功能模块就是要加一个类文件,即模块文件,要对该模块增加一个操作,就是在该类文件中加一个方法。
6.在PHP中,在回标签(?>)之后不能有任何输出,包括空格,否则在被包含时可能会报错。
7.为了保险起见,不要加回标签(?>);8.在TP中有全局配置文件,这里的配置文件影响每一个应用,但有时候我们需要改变某个应用的配置项。
那么,我们就需要单独为该应用进行配置,这就是局部配置文件,、。
9.局部配置文件的优先级高于全局配置文件。
10.配置文件在项目的conf中。
11.要想读取配置文件中的任何一个选项,可以用一个C()方法。
例如:echo C('DEFAULT_CHARSET');12.C()方法用于获取配置文件中的选项。
(大写C);13.函数跟踪,在学习或观看一个项目时,为了知道某个函数的来源,需要对函数进行跟踪定位。
14.公共函数:在TP的Common中的common.php中的函数即为公共函数,可以在项目的任何地方使用。
15.局部函数:在项目应用中的Common中的common.php 文件中定义的函数,即为局部函数,该函数只在该应用中有效,在其他应用中不能使用。
16.公共类文件。
17.自定义类文件。
18.如何使用并包含自定义类文件。
Import(‘ORG.Mycls.Person’);$user=new Person();$user->show();19.定义变量并分配模板;public function index(){$name="李帅帅";$age="22";$this->assign('name',$name);$this->assign('age',$age);$this->display();}在模板中是这样接收:<h1>{$name}</h1><h1>{$age}</h1>20.定义控制器在Action文件夹中新建一个UserAction.class.php,即完成一个控制器的定义。
代码审计-thinkphp3.2.3框架漏洞sql注入
![代码审计-thinkphp3.2.3框架漏洞sql注入](https://img.taocdn.com/s3/m/610d5b0ec4da50e2524de518964bcf84b9d52d3a.png)
代码审计-thinkphp3.2.3框架漏洞sql注⼊开始复现审计⼀下tp3和tp5的框架漏洞,当个练习吧。
涉及注⼊的⽅法为where() table() delete()等。
环境 tp3.2.3 :0x01 注⼊成因测试代码:public function index2(){// $data = M('user')-> where('username = "admin"')->select();// dump($data);$id = i('id');$res = M('user')->find($id);I⽅法断点 跟进去看。
F7跟进, thinkphp/ThinkPHP/Common/functions.php :从283⾏开始看 ⾸先判断提交⽅式:......switch(strtolower($method)) {case 'get' :$input =& $_GET;break;case 'post' :$input =& $_POST;break;case 'put' :if(is_null($_PUT)){parse_str(file_get_contents('php://input'), $_PUT);}$input = $_PUT;break;case 'param' :switch($_SERVER['REQUEST_METHOD']) {case 'POST':$input = $_POST;break;case 'PUT':if(is_null($_PUT)){parse_str(file_get_contents('php://input'), $_PUT);}$input = $_PUT;break;default:$input = $_GET;}break;case 'path' :$input = array();if(!empty($_SERVER['PATH_INFO'])){$depr = C('URL_PATHINFO_DEPR');$input = explode($depr,trim($_SERVER['PATH_INFO'],$depr)); }break;case 'request' :$input =& $_REQUEST;break;case 'session' :$input =& $_SESSION;break;case 'cookie' :$input =& $_COOKIE;break;case 'server' :$input =& $_SERVER;break;case 'globals' :$input =& $GLOBALS;break;case 'data' :$input =& $datas;break;default:return null;}重点看过滤的地⽅think_filter:function think_filter(&$value){// TODO 其他安全过滤// 过滤查询特殊字符if(preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i',$value)){ $value .= ' ';}}这⾥基本就是成因了 ⿊名单过滤 但是有漏⽹之鱼 常见的updataxml()报错函数都没过滤。
THINKPHP个人总结学习方法
![THINKPHP个人总结学习方法](https://img.taocdn.com/s3/m/b376de16f12d2af90242e6a4.png)
<p><lable>作者:</lable><input type="text" name='author' size="20" /></p>
<p><lable>时间:</lable><input class="Wdate" type="text" name='sendtime' onClick="WdatePicker ({dateFmt:'yyyy/MM/dd/ HH:mm:ss'})" /></p>
示具体的新闻内容 }
public function addNews(){ $this->display('default:Index:addNews'); #添加新
闻模板 }
}
Tpl/default/Index/index.html 导航模板
<div class="content"> <a href="{:U('Index/newsList')}">显示新闻</a> <!--
简单的讲就是把所有的请求的内容都当成一个资源resource那么每个资源都对应一个唯一的标示然后呢我们来定义一个资源的连接器对资源进行操作如果用户请求的资源发生了改变但是所请求的资源标示符不发生改变需要正则来实现rest设计风格在你的配置文件中添加如下配置?urlrouteron?true开启路由?urlrouteron?true开启路由?restmethodlist??getpostput?允许的请求类型列表?restdefaultmethod??get?默认请求类型?restdefaulttype??html?默认的资源类型?restcontenttypelist??htmlxmljson?rest允许请求的资源类型列表下面来实现rest的路由规则
THINKPHP学习笔记
![THINKPHP学习笔记](https://img.taocdn.com/s3/m/428c9a7f01f69e314332949f.png)
Thinkphp学习笔记Thinkphp复习1、概况使用面向对象的开发结构和mvc模式,采用单一入口,融合了struts2的action 思想和jsp的taglib,ROR的orm映射和activerecord模式,封装了curd 常用操作,支持多数据库切换,分布式数据库,缓存,用于敏捷web应用开发,简化企业级开发2、什么是LAMPLAMP是基于Linux,Apache,Mysql,PHP的开放资源网络开发平台Linux是开放的操作系统Apache是最通用的网络服务器Mysql是带有基于网络管理工具的关系数据库PHP是流行的对象脚本语言LAMP是强大的网站解决方案3、什么是OOP面向对象编程(Object Oriented Programming)是一种计算机编程架构达到的目标:重用性,灵活性,扩展性基本原则:计算机程序由单个能起到子程序作用的单元或对象组合而成,每个对象都能够接收信息、处理数据、向其他对象发送信息。
其他一些概念组件:数据和功能一起在运行着的计算机程序中形成的单元,组件是模块化和结构化的基础。
抽象性:封装性:每类组组件都提供了一些与其他组件进行通信的借口,并规定其调用方法多态性:4、什么是mvcMvc是一个设计模式,强调输入-处理-输出分开,应用程序被分为三个核心部件(模型M:表示企业数据和业务规则视图V:用户交互界面处理器C:接收用户的输入,并调用模型和视图完成用户的需求。
本身不输出任何东西和做任何处理,它只是接受请求并决定调用哪个模型部件去处理请求,然后确定用哪个视图显示模型处理后返回的数据)5、什么是ORM对象-关系映射(Object/relation map)面向对象开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。
业务实体在内存中表现为对象,存在关联和继承关系,在数据库中表现为关系数据,无法表达关联和继承关系。
thinkphp3.2.3框架动态切换多数据库的方法分析
![thinkphp3.2.3框架动态切换多数据库的方法分析](https://img.taocdn.com/s3/m/e1d80553326c1eb91a37f111f18583d049640fec.png)
thinkphp3.2.3框架动态切换多数据库的⽅法分析本⽂实例讲述了thinkphp3.2.3框架动态切换多数据库的⽅法。
分享给⼤家供⼤家参考,具体如下:版本说明:thinkphp3.2.3新增⾃定义⾏为类⽂件位置:Application/Common/Behaviors/SwitchDbBehavior.class.php⽂件内容:namespace Common\Behaviors;class SwitchDbBehavior{//私有库id,如何连接公有库则设置为share字符串private $_privateId = '';/** ⾏为扩展的执⾏⼊⼝必须是run* $param 为引⽤传值,所以实参必须是变量*/public function run(&$params){//获取私有库id$this->_privateId = empty($params) && session('?privateId') ? (int)session('privateId') : trim($params);//echo 'curent database is '.$this->_privateId;//默认连接公有库if(empty($this->_privateId)) $this->_privateId = 'share';$this->_checkDb();//连接公有库if('share' == trim($this->_privateId)){$share = $this->_connectShare();}else//连接私有库{$share = $this->_connectPrivate($this->_privateId);}//循环修改数据库配置信息foreach($share as $dbKey=>$dbVal){C($dbKey,$dbVal);}}/** 判断数据库是否存在*/private function _checkDb(){//C('PRIVATEIDS') 在配置⽂件Appliation/Common/Conf/dbname.php中定义if(!in_array($this->_privateId,C('PRIVATEIDS'))){exit(__CLASS__.'->'.__FUNCTION__.': dbName error!');}}/** 返回连接私有库配置*/private function _connectPrivate($privateId){return array('DB_TYPE' => 'mysql', // 数据库类型'DB_HOST' => DB_WECHAT_HOST, // 服务器地址'DB_NAME' => DB_WECHAT_NAME.(int)$privateId, // 数据库名'DB_USER' => DB_WECHAT_USER, // ⽤户名'DB_PWD' => DB_WECHAT_PASS, // 密码'DB_PORT' => DB_WECHAT_PORT, // 端⼝'DB_PARAMS' => array(), // 数据库连接参数'DB_PREFIX' => '', // 数据库表前缀'DB_CHARSET'=> 'utf8', // 字符集'DB_DEBUG' => DB_WECHAT_DEBUG, // 数据库调试模式开启后可以记录SQL⽇志);}/** 返回连接公有库配置*/private function _connectShare(){return array('DB_TYPE' => 'mysql', // 数据库类型'DB_HOST' => DB_WECHAT_HOST, // 服务器地址'DB_NAME' => DB_WECHAT_SHARE_NAME, // 数据库名'DB_USER' => DB_WECHAT_USER, // ⽤户名'DB_PWD' => DB_WECHAT_PASS, // 密码'DB_PORT' => DB_WECHAT_PORT, // 端⼝'DB_PARAMS' => array(), // 数据库连接参数'DB_PREFIX' => '', // 数据库表前缀'DB_CHARSET'=> 'utf8', // 字符集'DB_DEBUG' => DB_WECHAT_DEBUG, // 数据库调试模式开启后可以记录SQL⽇志);}}以上⽂件中⽤到的常量在我们的配置⽂件Application/Common/Conf/constant.php中.内容如下:/*数据库配置*/define('DB_WECHAT_HOST','127.0.0.1'); //主机hostdefine('DB_WECHAT_USER','common'); //⽤户名define('DB_WECHAT_PASS','common'); //密码define('DB_WECHAT_NAME','wechat_'); //私有库前缀define('DB_WECHAT_SHARE_NAME','wechat_share'); //共有库名define('DB_WECHAT_PORT','3306'); //端⼝define('DB_WECHAT_DEBUG',TRUE); //数据库调试模式开启后可以记录SQL⽇志图中代码验证数据库存在不存在的C('PRIVATEIDS')在⽂件Application/Common/Conf/dbname.php中配置内容如下:<?php/** 本配置⽂件主要存储数据库后缀名,* 前缀为wechat_,* 在Application/Common/Behaviors/TestBehavior.class.php中验证* 注意:在新增数据库的时候,注意修改该⽂件** @author: liangxifeng* @date: 2016-08-13*/return array('PRIVATEIDS'=>array('share',1,2,3,4));constant.php和dbname.php则是在配置⽂件Application/Common/Conf/config.php中使⽤扩展配置选项配置加载;'LOAD_EXT_CONFIG' => 'constants,systemConfig,dbname',//加载常量配置在使⽤⾃定义⾏为类的时候要在Application/Common/Conf/中新增tags.php内容如下:/** 扩展⾏为类配置⽂件* @author:liangxifeng* @date:2016-08-13*/return array(//应⽤开始标签位添加切换数据库⾏为'action_begin'=>array('Common\\Behaviors\\SwitchDbBehavior'),);使⽤⽅法在注册session后或⼿动加载使⽤,⽐如在控制器中:public function index(){//注册session切换数据库session('privateId',2);//⼿动切换数据库为私有库tag('action_begin',$params='share');$wechat = D('Wechat');//查询数据库$res = $wechat->where('wechat_id=1')->find();echo "<pre>";var_dump($res);exit;}更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》及《》。
ThinkPHP3.2.3SQL注入分析
![ThinkPHP3.2.3SQL注入分析](https://img.taocdn.com/s3/m/2fb0f49fcd22bcd126fff705cc17552707225e3b.png)
ThinkPHP3.2.3SQL注⼊分析最近看到⼀些CMS都是ThinkPHP3.2.3⼆开的,因此就先来看看ThinkPHP3.2.3的SQL注⼊,同时也为ThinkPHP3.2.3的远程命令执⾏漏洞(CNVD-2021-32433)做准备。
环境搭建直接放WWW⽬录访问,会⾃动⽣成⼀些基础配置⽂件。
创建数据库,配置环境。
create database TP3;use TP3;create table tp_user(id int(8) AUTO_INCREMENT PRIMARY KEY,username varchar(255),password varchar(255));insert into tp_user(id,username,password) value(1,'admin','admin');配置当前模块配置⽂件(Application/Home/Conf/config.php),也可以配置管理配置⽂件(ThinkPHP/Conf/convention.php)<?phpreturn array(//'配置项'=>'配置值''DB_TYPE' => 'mysql', // 数据库类型'DB_HOST' => 'localhost', // 服务器地址'DB_NAME' => 'TP3', // 数据库名'DB_USER' => 'root', // ⽤户名'DB_PWD' => 'root', // 密码'DB_PORT' => '3306', // 端⼝'DB_PREFIX' => 'tp_', // 数据库表前缀'DB_PARAMS' => array(), // 数据库连接参数'DB_DEBUG' => false, // 数据库调试模式开启后可以记录SQL⽇志'DB_FIELDS_CACHE' => true, // 启⽤字段缓存'DB_CHARSET' => 'utf8', // 数据库编码默认采⽤utf8'DB_DEPLOY_TYPE' => 0, // 数据库部署⽅式:0 集中式(单⼀服务器),1 分布式(主从服务器)'DB_RW_SEPARATE' => false, // 数据库读写是否分离主从式有效'DB_MASTER_NUM' => 1, // 读写分离后主服务器数量'DB_SLAVE_NO' => '', // 指定从服务器序号);配置好环境后,在Application/Home/Controller/IndexController.class.php⽂件中添加下列⽅法,数据库连接成功。
Thinkphp中的I函数(Thinkphp3.2.3版本)
![Thinkphp中的I函数(Thinkphp3.2.3版本)](https://img.taocdn.com/s3/m/cc131ba4dc3383c4bb4cf7ec4afe04a1b071b02d.png)
Thinkphp中的I函数(Thinkphp3.2.3版本)I 函数的作⽤是获取系统变量,必要时还可以对变量值进⾏过滤及强制转化,I 函数的语法格式:I('变量类型.变量名/修饰符',['默认值'],['过滤⽅法或正则'],['额外数据源'])⼀、获取变量在PHP中获取变量值的⽅法有很多,⽐如:$_GET['变量名'],$_POST['变量名'],$_SESSION['变量名'],$_COOKIE['变量名'],$_SERVER['变量名'] 都可以获取相应的变量值,但在thinkphp中为了安全的原因建议统⼀使⽤ I 函数来获取变量值。
例如:获取 URL 地址栏中参数 id 的值,在php中我们⽤ $_GET['id'] 来获取,在thinkphp中我们可以⽤ I('get.id') 来获取。
同样的, $_POST['id'] 就⽤ I('post.id') 取代,I 函数的语法格式中的变量类型就是指的像 get 和 post 之类的请求⽅式,类似的变量类型还包括:变量类型含义get获取GET参数post获取POST参数param⾃动判断请求类型获取GET、POST或者PUT参数request获取REQUEST 参数put获取PUT 参数session获取 $_SESSION 参数cookie获取 $_COOKIE 参数server获取 $_SERVER 参数globals获取 $GLOBALS参数path获取 PATHINFO模式的URL参数data获取其他类型的参数,需要配合额外数据源参数如果要获取的变量类型是get、post 或 put,可以统⼀⽤ param 变量类型,param 变量类型是框架特有的⽀持⾃动判断当前请求类型的变量获取⽅式,例如:I('param.id') ,如果当前请求类型是GET,那么等效于 $_GET['id'],如果当前请求类型是POST或者PUT,那么相当于获取 $_POST['id'] 或者 PUT参数id。
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
![从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解](https://img.taocdn.com/s3/m/c7e9e27b24c52cc58bd63186bceb19e8b8f6ecf7.png)
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图⽂详解本⽂实例讲述了从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记。
分享给⼤家供⼤家参考,具体如下:⽤tp3.2.3做了不少项⽬,但是毕竟要与时代接轨,学习⼀些新的框架,⽐如tp5以下记录⼀些学习中遇到的问题及解决办法,还有tp3.2和tp5.0的⼀些区别,适合给⽤过tp3没⽤过tp5的童鞋做个参考。
随着学习不断更新......+++++++++++++++++++++++分割线总是要有的+++++++++++++++++++++++⾸先到下载了⼀个最新的完整版:直接扔到了服务器上,解压后⽬录结构如下:⽬录结构整体与tp3.2⼤同⼩异,⽂件夹⾸字母⼩写了,应⽤⼊⼝⽂件在根⽬录下 public/index.php,官⽅⽂档对public⽂件夹定义为WEB部署⽬录(对外访问⽬录):配置服务器域名解析的时候需要把项⽬根⽬录指向/public:<VirtualHost *:80>ServerAdmin 1977629361@DocumentRoot /var/www/tp/publicServerName ServerAlias DirectoryIndex index.php index.html index.htm</VirtualHost>根⽬录下 application/config.php 为应⽤(公共)配置⽂件,设置⼀些常⽤的配置,以下简称为“配置⽂件”:访问⽹址如下:访问等同于访问/index.php/index/Index/index(默认不区分⼤⼩写)即默认模块index,默认控制器Index,默认操作index配置⽂件修改分别为default_module、default_controller、default_action如果需要强制区分url⼤⼩写,修改 url_convert 为false:配置⽂件中设置 app_debug 为true,打开应⽤调试模式,以便开发调试:【隐藏url中的index.php⼊⼝⽂件】以Apache服务器为例,⾸先确认Apache配置⽂件httpd.conf中开启了mod_rewrite.so模块:然后把所有【AllowOverride】设为All:最后修改根⽬录下 public/.htaccess ⽂件内容为:<IfModule mod_rewrite.c>Options +FollowSymlinks -MultiviewsRewriteEngine onRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]</IfModule>去掉index.php也可访问:【隐藏前台url模块名】把index模块作为前台,在前台新建了⼀个User控制器:<?phpnamespace app\index\controller;class User{public function user(){return '这是User控制器的user操作';}}正常需要这样访问User控制器的user操作:为了前台url显⽰简洁⼀些,要去掉模块名index,然后就崩了:如果只有⼀个模块,可以在 /application/common.php 中添加:// 绑定当前访问到index模块define('BIND_MODULE','index');亲测访问成功:但是项⽬通常会有前后台的区分,⾄少两个模块,⽤上⾯的⽅法绑定index模块后,再访问其它模块就会报错:(新建了⼀个admin模块作为后台)<?phpnamespace app\admin\controller;class Index{public function index(){return '这是后台⾸页';}}对于多模块的情况,可以在 /application/route.php 中绑定默认模块路由(去掉上⾯的单模块绑定):use think\Route;Route::bind('index');前台访问成功:然后在/public/下新建⼀个⼊⼝⽂件admin.php,绑定后台模块admin,来访问后台:<?php// [ 应⽤⼊⼝⽂件 ]namespace think;// 定义应⽤⽬录define('APP_PATH', __DIR__ . '/../application/');// 加载框架引导⽂件require __DIR__ . '/../thinkphp/base.php';// 绑定当前⼊⼝⽂件到admin模块Route::bind('admin');// 关闭admin模块的路由App::route(false);// 执⾏应⽤App::run()->send();后台访问成功:(修改后台地址只需修改这个⽂件名即可)【返回数据】配置⽂件中默认输出类型 default_return_type 为html:直接打印输出字符串、数组,没什么特殊:public function index(){$str = 'hello,world!';$arr = array('state'=>1,'msg'=>'success');//打印字符串echo $str;//打印数组var_dump($arr);}返回json格式数据:public function index(){$arr = array('state'=>1,'msg'=>'success');return json($arr);//返回其它状态码或响应头信息//return json($arr, 201, ['Cache-control' => 'no-cache,must-revalidate']);//xml格式//return xml($arr);}(对于只做API开发的情况,可以设置default_return_type为json,直接return $arr即可返回json格式数据)【渲染模板、分配数据】如图建⽴视图层,index.html作为前台⾸页(内容为“这是⾸页”):tp3渲染模板直接在控制器⾥$this->display(),tp5并不⽀持。
Thinkphp各个版本总结------终结版本!
![Thinkphp各个版本总结------终结版本!](https://img.taocdn.com/s3/m/1daac71acd7931b765ce0508763231126edb778f.png)
Thinkphp各个版本总结------终结版本!Thinkphp各个版本总结:tp3.2.3,tp5.0,tp5.1差异终得闲暇时间(也就两三个⼩时)能够进⾏这6个⽉对tp框架的使⽤总结了:1.框架隐藏模块差异:tp3.2.3:其实还⽐较⿇烦//隐藏⼊⼝⽂件在与⼊⼝⽂件同级⽬录,将.htaccess⽂件中RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]修改为RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L]//配置设置默认模块访问模块‘DEFAULT_MODULE’=> 'Home'(Home为模块名称),//隐藏模块,关闭多模块访问‘MULTI_MODULE’=> false,//改变URL模式为重写模式'URL_MODEL' => 2,(注意要隐藏哪个模块在哪个模块下的配置⽂件下配置,否则关闭多模块访问会出现其他模块不能被访问)//在公共的配置⽂件配置,多模块访问'MODULE_ALLOW_LIST' => array( '模块名称1','模块名称2','模块名称3'),tp5:可以看见其中稳了隐藏url中的模块名我们需要进⾏设置的是⼀个BIND_MOULE常量define('APP_PATH', __DIR__ . '/../application/');define('BIND_MODULE','home');// define('CONTROLLER_NAME',\think\Request::instance()->controller());// 加载框架引导⽂件require __DIR__ . '/../thinkphp/start.php';tp5.1:隐藏模块名所需要的是利⽤Container中的链式⽅法进⾏bind⽅法中的绑定模块namespace think;// 加载基础⽂件require __DIR__ . '/../thinkphp/base.php';// ⽀持事先使⽤静态⽅法设置Request对象和Config对象// 执⾏应⽤并响应(5.1在此⽤bind实现隐藏模块名)Container::get('app')->bind('index')->run()->send();2.模板主题的设置思路是说⼿机端和电脑端在base的控制器中区别之后改变配置的模板路径tp3.2.3(极为简单):此刻你的$this->display();路径就是对应的moule/view/m/ 下的路径了if (is_mobile()) {//设置默认主题为 mC('DEFAULT_THEME','m');}tp5及以上:模板主题的思路是⾃动适配view的路径//模板主题的切换(适配各个平台以及双端)$theme = Env::get('module_path').'view/'.(get_platform()).'/'.(is_mobile()?'m/':'web/');$this->view->config('view_path',$theme);3.助⼿函数的升级(字母函数的升级)tp3.2.3:很明显⼤家都知道有所谓的字母函数可以进⾏使⽤,但是其实好⽤归好⽤,违反了许多代码的规范和习惯tp5以上由于我公司统⼀优先级是助⼿函数优先所以我也发掘了⼀些助⼿函数的差异:3.2版本 5.0版本C configE exceptionG debugL langT废除I inputN废除D modelM dbA controllerR actionB废除U urlW widgetS cacheF废除tp5.1以上:助⼿函数描述abort 中断执⾏并发送HTTP状态码action 调⽤控制器类的操作app 快速获取容器中的实例⽀持依赖注⼊behavior 执⾏某个⾏为bind 快速绑定对象实例cache 缓存管理call 调⽤反射执⾏callable ⽀持依赖注⼊class_basename 获取类名(不包含命名空间)class_uses_recursive 获取⼀个类⾥所有⽤到的traitconfig 获取和设置配置参数container 获取容器对象实例controller 实例化控制器cookie Cookie管理db 实例化数据库类debug 调试时间和内存占⽤dump 浏览器友好的变量输出env 获取环境变量(V5.1.3+)exception 抛出异常处理halt 变量调试输出并中断执⾏input 获取输⼊数据⽀持默认值和过滤json JSON数据输出jsonp JSONP数据输出lang 获取语⾔变量值model 实例化Modelparse_name 字符串命名风格转换redirect 重定向输出request 实例化Request对象response 实例化Response对象route 注册路由规则(V5.1.3+)session Session管理token ⽣成表单令牌输出trace 记录⽇志信息trait_uses_recursive 获取⼀个trait⾥所有引⽤到的traiturl Url⽣成validate 实例化验证器view 渲染模板输出widget 渲染输出Widgetxml XML数据输出其中要重点说的是request()这个助⼿函数!:tp3.2.3的CONTROLLER_NAME和ACTION_NAME在tp5以上都已经进⾏了废除tp5以上的获取⽅法:requset()->controller();request()->action();当然别忘了在模板⾥⾯要{:requset()->controller()}{:requset()->action()}当然还有的就是Request类的use:tp5.0版本:use think\Request;tp5.1版本:use think\facade\Env;然后就是Request::isAjax()Request::isGet()Request::isPost()...助⼿函数:request()->isGet()request()->isPost()request()->isAjax()其中很多tp5.0只要use之后就能使⽤的类静态调⽤⽅式在tp5.1你发现不⾏此时你需要查看⼿册中这个类是不是有facade,有得话就在think\后加上facade\,有的话你就加上去吧。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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('参数名称','新的参数值');扩展配置可以支持自动加载额外的自定义配置文件,并且配置格式和项目配置一样。
设置扩展配置的方式如下(多个文件用逗号分隔):// 加载扩展配置文件'LOAD_EXT_CONFIG' => 'user,db',获取变量I('变量类型.变量名',['默认值'],['过滤方法'])变量类型含义get 获取GET参数post 获取POST参数param 自动判断请求类型获取GET、POST或者PUT参数request 获取REQUEST 参数put 获取PUT 参数session 获取$_SESSION 参数cookie 获取$_COOKIE 参数server 获取$_SERVER 参数globals 获取$GLOBALS参数echo I('get.id'); // 相当于$_GET['id']echo I(''); // 相当于$_GET['name']echo I('get.id',0); // 如果不存在$_GET['id'] 则返回0echo I('',''); // 如果不存在$_GET['name'] 则返回空字符串采用方法过滤:// 采用htmlspecialchars方法对$_GET['name'] 进行过滤,如果不存在则返回空字符串echo I('','','htmlspecialchars');// 获取整个$_GET 数组I('get.');由于param类型是I函数默认获取的变量类型,因此事实上param变量类型的写法可以简化为:I('id'); // 等同于I('param.id')I('name'); // 等同于I('')param类型变量还可以用数字索引的方式获取URL参数(必须是PA THINFO模式参数有效,无论是GET还是POST方式都有效),例如:当前访问URL地址是那么我们可以通过echo I('param.1'); // 输出2013echo I('param.2'); // 输出06echo I('param.3'); // 输出01// 下面两种方式都不采用任何过滤方法I('','','');I('get.id','',false);判断请求类型常量说明IS_GET 判断是否是GET方式提交IS_POST 判断是否是POST方式提交IS_PUT 判断是否是PUT方式提交IS_DELETE 判断是否是DELETE方式提交IS_AJAX 判断是否是AJAX提交REQUEST_METHOD 当前提交类型AJAX返回$data = 'ok';$this->ajaxReturn($data);<script>$(function(){$('button').bind('click',function(){$.get('__URL__/getajax/id/{$_GET['id']}',function(jdate){if(jdate.status==1){$('.about_c p b').html(jdate.data)}})})})</script>空操作空操作是指系统在找不到请求的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。
使用函数{$|md5}{$create_time|date="y-m-d",###}//表示date函数传入两个参数,每个参数用逗号分割,这里第一个参数是y-m-d ,第二个参数是前面要输出的create_time 变量,因为该变量是第二个参数,因此需要用###标识变量位置,{$|substr=0,3} //前面输出的变量在后面定义的函数的第一个参数{$name|md5|strtoupper|substr=0,3} //支持多个函数过滤,多个函数之间用“|”分割{:substr(strtoupper(md5($name)),0,3)}默认值输出{$user.nickname|default="这家伙很懒,什么也没留下"}包含文件***********<include file="Public/f.html" /><include file="Public/f.html" title="ThinkPHP框架" keywords="开源WEB开发框架" />f.html:<title>[title]</title><meta name="keywords" content="[keywords]" />V olist标签<volist name="list" id="vo">{$vo.id}:{$}<br/></volist>输出其中的第5~15条记录<volist name="list" id="vo" offset="5" length='10'>{$}</volist>输出偶数记录<volist name="list" id="vo" mod="2" ><eq name="mod" value="1">{$}</eq></volist>Mod属性还用于控制一定记录的换行<volist name="list" id="vo" mod="5" >{$vo.uname}<eq name="mod" value="4"><br/></eq></volist>为空的时候输出提示:<volist name="list" id="vo" empty="暂时没有数据" >{$vo.id}|{$}</volist>输出循环变量<volist name="list" id="vo" key="k" >{$k}.{$}</volist>如果没有指定key属性的话,默认使用循环变量i,例如:<volist name="list" id="vo" >{$i}.{$}</volist>Foreach标签<foreach name="list" item="vo" >{$key}|{$vo.id}:{$}</foreach>可以定义索引的变量名<foreach name="list" item="vo" key="k" >{$k}|{$vo.id}:{$}</foreach>For标签开始值、结束值、步进值和循环变量都可以支持变量,开始值和结束值是必须,其他是可选。