ThinkPHP笔记
ThinkPHP笔记——配置文件设置基础要素
ThinkPHP笔记——配置文件设置基础要素配置文件主要是控制整个项目的配置参数,通过一系列的配置达到系统与ThinkPHP 更好的调控。
1、ThinkPHP的配置文件最常用的就是更改项目中的Conf文件中conf.php,比如我的Home/Conf/conf.php2、读取配置,使用C(),大写的C函数,而且配置文件的参数都是全局的,可以再任何地方访问的。
在index控制器中输入 echo C('APP_STATUS');即可输出Conf的值3、C函数读取二维配置: C('USER_ER_TYPE');4、C函数对配置文件的动态配置:一维C('DATA_CACHE_TIME','60');二维C('USER_ER_TYPE','1');5、扩展配置:扩展配置可以实现引入外部的config文件,实现配置文件的选择性调用。
而且扩展配置文件还可以即时生效,不需要更新缓存文件。
在conf文件中写入 'LOAD_EXT_CONFIG'=>'user'//这里的conf一般放在Conf目录中扩展配置文件的配置参数默认是一维参数,即使用C('APP_STATUS')就可以实现调用当然也可以使用二维的配置调用,方法是:'LOAD_EXT_CONFIG'=>array('USER'=>'user');这样就可以使用C('USER_ER_TYPE','1')方法调用了注意:扩展配置文件的文件名不能使用:config.php 、alias.php 、tags.php 、debug.php 、core.php。
thinkphp教程笔记总结
thinkphp教程笔记总结1、url的四种访问模式:1)PATHINFO模式(重点)Eg:http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值22)普通模式Eg:http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值2 3)REWRITE模式(重写模式)需要增加配置文件hac,服务器支持。
Eg:http://域名/项目名/模块名/方法名/键1/值1/键2/值24)兼容模式Eg:http://域名/项目名/入口文件?s=模块名/方法名/键1/值1/键2/值22、ThinkPHP输出:1)PHP原生输出方法。
Echo2)通过display方法输出。
想通过分配变量可以使用assign输出3)修改定界符:修改配置项。
避免与JQuery冲突…THPL_L_DELIM?-〉…<{? 修改左定界符…THPL_R_DELIM?-〉…<{? 修改右定界符3、ThinkPHP 的模型使用1)需要在方法中通过new Model (表名)的形式操作数据库$m=new Model(…User?);$arr=$m->sselect();需要通过配置项来配置数据库(数据表名第一个字母大写)还有一种简单使用模型的方法:$m=M(…User?); //等效为new Model$arr=$m->sselect();使用模型的实力可以对数据进行操作,操作的工作一般就是对数据库进行增删改查。
增c create $m->add()删d delete $m->delete()改u update $m->save()查r read $m->select()4、ThinkPHP 3.1.2 CURD特性ThinkPHP 3 读取数据1)对数据的读取Read$m=new Model('User');$m=M('User');a.select $m->select();//获取所有数据以数组形式返回b.find $m->find($id);//获取单条数据c.getField(字段名)//获取一个具体的字段值$arr=$m->where('id=2')->getField('username'); //ThinkPHP 的连贯操作ThinkPHP 3 创建数据对数据的添加Create$m=new Model('User');$m=M('User');$m->字段名=值$m->add();返回值是新增的id号代码示例:public function add(){$m=new Model('User');$m->username=$_POST['username'];$m->sex=$_POST['sex'];$newId=$m->add();if($newId>0){$this->success("Add new user successfully",index);}else{$this->error("Add new user failed",index); }}ThinkPHP 3 删除数据$m=M('User');$m->delete(2); //删除id为2的数据$m->where('id=2')->delete(); //与上面效果相同也是删除id为2的数据返回值是受影响行数ThinkPHP 3 更新数据$m=M('User');$data['id']=1;$data['username']='ztz2';$m->save($data);返回值是受影响行5、ThinkPHP 3.1.2 查询方式find只能查询一天记录,select可以查询多条记录一、普通查询方式字符串$arr=$m->where("sex=0 and username='gege'")->find();数组$data['sex']=0;$data['username']='gege';$arr=$m->where($data)->find();注意这种方式默认是and的关系如果使用or关系需要添加数组值$data['sex']=0; $data['username']='gege';$data['_logic']='or';二、表达式查询方式$data['id']=array('lt',6);$arr=$m->where($data)->select();EQ 等于NEQ 不等于GT 大于EGT 大于等于LT 小于ELT 小于等于示例代码:public function show(){$m=new Model('User');$data['id']=array("LT",25);$arr=$m->where($data)->select();var_dump($arr);$this->display(); }LIKE 模糊查询$data['username']=array('like','%ge'); //查询username以ge 结尾的user$data['username']=array('like','%ge%'); //查询username包含ge的user$arr=$m->where($data)->select();NOTLIKE //注意 not 和like中间不能有空格$data['username']=array('notlike','%ge%'); //查询username 不包含ge的user $arr=$m->where($data)->select();注意如果一个字段要匹配多个通配符$data['username']=array('like',array('%ge%','%2%','%五%'),'and'); //如果没有第三个值默认关系是or关系$arr=$m->where($data)->select();BETWEEN$data['id']=array('between',array(5,7));$arr=$m->where($data)->select();//SELECT * FROM `tp_user` WHERE ( (`id` BETWEEN 5 AND 7 ) )$data['id']=array('not between',array(5,7));//注意 not 和between中间一定要有空格$arr=$m->where($data)->select();IN$data['id']=array('in',array(4,6,7));$arr=$m->where($data)->select();//SELECT * FROM `tp_user` WHERE ( `id` IN (4,6,7) )$data['id']=array('not in',array(4,6,7)); not和in之间一定要有空格$arr=$m->where($data)->select();//SELECT * FROM `tp_user` WHERE ( `id` NOT IN (4,6,7) )常用连贯操作a)where 帮助我们设置查询条件b) order 对结果进行排序$arr=$m->order('id desc')->select();$arr=$m->order(array('id'=>'desc','sex'=>'asc'))->select();c) limit 限制结果limit(2,5)limit('2,5')limit(10)//limit(0,10) d) fieldd) 设置查询字段field('username as name,id')field(array('username'=>'name','id')field('id',true) //获取除了id以外的所有字段e) tablef) groupg) Havingh) 补充i. alias 用于给当前数据表定义别名字符串ii. page 用于查询分页内部会转换成limit 字符串和数字iii. join* 用于对查询的join支持字符串和数组iv. union* 用于对查询的union支持字符串、数组和对象v. distinct 用于查询的distinct支持布尔值vi. lock 用于数据库的锁机制布尔值vii. cache 用于查询缓存支持多个参数以后在缓存部分再详细描述viii. relation 用于关联查询需要关联模型扩展支持字符串ix. validate 用于数据自动验证数组x. auto 用于数据自动完成数组xi. filter 用于数据过滤字符串xii. scope* 用于命名范围字符串、数组模板的使用a) 规则模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html .tpl 更换模板文件的后缀名修改配置文件:'TMPL_TEMPLATE_SUFFIX'=>'.html',//更改模板文件后缀名b) 修改模板文件目录层次'TMPL_FILE_DEPR'=>'_',//修改模板文件目录层次c) 模板主题'DEFAULT_THEME'=>'your',//设置默认模板主题需要在TPL下面新建一个your文件夹作为模板主题文件如何动态修改模板主题1、在后台准备一个功能修改config.php文件中的默认模板项2、通过url传递t=主题参数可以修改不同的模板(需三方同时使用)'DEFAULT_THEME'=>'your', //设置默认模板主题'TMPL_DETECT_THEME'=>true, //自动侦测模板主题'THEME_LIST'=>'your,my', //支持的模板主题列表模板的输出a)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'); //参数二为制定编码,参数三为模版的输出类型。
thinkphp学习笔记
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。
全新ThinkPHP框架笔记(都是干货)
ThinkPHP学习笔记【thinkphp的优点】1.自动加载,动态编译,节约系统效率2.ajax,视图,分组,权限管理,关联操作,主从数据库,缓存3.自动验证,自动完成,映射4.支持4种url解析模式,方便seo【版本说明】A: alpha 内部测试B: beta 公开测试或者给客户进行测试C: RC 开发倒计时,一般没什么问题F:final 正式版本【主入口文件可选配置】开启调试模式:define(‘APP_DEBUG’,’TRUE’); //将模拟linux操作系统来帮我们识别大小写,而且方法名的大小写与模板文件的大小写相关定义公共模块的目录,放到应用目录外define('COMMON_PATH', './Common/');【url访问规则】访问模式:0 普通模式:参数形式1 pathinfo模式:http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值2智能识别'URL_PATHINFO_MODEL'=>1;非智能识别:m/模块名/a/方法名'URL_PATHINFO_MODEL'=>1;2 rewrite重写:伪静态,index.php取消掉3 兼容模式:http://域名/index.php?s=/user/g修改方法:在config.php中,增加配置项:'URL_MODEL'=>1(or 2,3,0);重写模式要在apache配置中(httpd.conf)开启rewrite,.htaccess(记事本添加可以在保存名字的时候加上双引号)注:通过url不能执行私有方法,但定义的私有方法的意义体现在可以对该类下的公有方法的验证等相关操作【配置】修改url的分隔符:’URL_PATHINFO_DEPR’=>’/’修改模板定界符:’TMPL_L_DELIM’=>’<{’, ’TMPL_R_DELIM’=>’}>’开启页面trace :‘show_page_TRACE’=>true,大C方法:读取配置文件参数,可利于此分配到模板中调用eg:$a=C('DB_HOST');【控制器的使用】1.渲染视图$this->display()://参数1:模板,参数2:编码;参数3:类型(xml,txt)加载其他的控制器下面的模板:$this->display('index:login');加载其他模板目录的模板:目录名@模块名:模板名加载自定义路径的模板:直接写全相对路径和模板名(加上后缀),以主入口文件为相对位置2.参数传递C:$this->assign(‘data’,$name);V:hello {$data} //动态数据的输出,{}为默认定界符3.跳转:// 操作完成3秒后跳转到/Article/index$this->success('操作完成','你的路径',3);// 操作失败5秒后跳转到/Article/error$this->error('操作失败','/Article/error',5);4.重定向:$this->redirect('New/category', array('cate_id' => 2), 5, '页面跳转中...');5. 安全获取用户数据:I('post.');I('ername') ==== $_POST['username']6.生成urlU('url路径',array()) //array传递参数U('index/test',array('id'=>10))7.关于空操作:防止黑客不断的请求网站的各种页面,通过一些错误信息来判断网站的框架,编写语言以及数据库类型等信息,不利于网站的安全用处:实现错误页面和一些URL的优化php原生处理方式:魔术方法:__call($method,$arg){echo '您操作的方法不存在'}; //参数:方法,参数Thinkphp处理方式:_empty(){}8.关于跨模块操作:A("") //实例化控制器对象R("模块/控制器/操作") //实例化控制器对象并调用相关方法【常量相关】系统常量:__ROOT__ // 项目根目录地址__APP__ //当前项目的入口文件地址__URL__ //当前模块地址__SELF__ /当前url地址自定义常量:在相应的配置文件进行如下配置:'TMPL_PARSE_STRING'=>array('__A__'=>'qawedad','__B__'=>'asdasda')【关于视图层】1.数组的遍历:<volist name=’data’ id=’vo’><{$vo.id}>|<{$ername}> 得到数组的值</volist>2.模板url替换{:U('模块/控制器/方法',array('key'=>'value'))} 会自动为你生成一个url__MODULE__/控制器/方法/参数===等价于/index.php/模块名__APP__/模块/控制器/方法/参数===等价于/index.php/模块/控制器/方法/参数__URL__/方法/参数==== 等价于/index.php/module/controller/方法__ROOT__ /模块/控制器/方法/参数3. css/ js/ image加载(1). 传统方法:<script type='text/javascript' src='/Public/Js/Util/Array.js'><link rel="stylesheet" type="text/css" href="/App/Tpl/default/Public/css/style.css" />(2). import 方法(3) load 方法<load href="/Public/Js/Common.js" /><load href="/Public/Css/common.css" />(4).js/css标签<js href="/Public/Js/Common.js" /><css href="/Public/Css/common.css" />、4.视图文件的路径以所加载视图的控制器的路径为相对路径,所以视图中加载css/js/images 的路径需要使用以项目根目录开始的绝对路径eg:/thinkphp/public/css/style.css/开始:绝对路径./ :项目目录,文件本身所在目录的上级目录../ :上级目录路径的封装:将所用到的路径定义为一个常量,然后再视图中调用查看当前控制器可以使用的常量:get_defined_const();调用配置常量:{$Think.const.CSS_PATH}模板引擎Smarty编号输出:{$v@iteration}日期处理:{$v.time|date_format:"%Y-%I-%d %H:%M:%S"} //变量调节器【数据库配置】方法一:‘DB_TYPE’=>’mysql’, //数据库抽象层的选择‘DB_HOST’=>’localhost’,‘DB_NAME’=>’thinkphp’,‘DB_USER’=>’root’,‘DB_PWD’=>’’,‘DB_POST’=>’3306’‘DB_PREFIX’=>’tp_’, //表前缀方法二:DSN方式‘DB_DSN’=>’mysql://root:@localhost:3306/thinkphp’, //优先级高于方法一‘DB_PREFIX’=>’tp_’, //表前缀主从数据库的配置'DB_DEPLOY_TYPE'=>1,'DB_HOST'=>'192.168.1.1,localhost','DB_NAME'=>'tp,thinkphp',读写分离'DB_RW_SEPARATE'=>true //自动将第一台数据库做写入的数据库,后面的数据库作为读的数据库'DB_FILES_CACHE' 字段缓存【模型的使用:】获取不同表前缀的名字:protected $truename;对于多服务器的情况,怎么修改表字段:protected $fields=array(0=>'id',1=>'username',2=>'password','_pk'=>'id', //主键(系统将主键默认为id)'_aotoinc'=>true //自增)跨同服务器的数据库protected $dbName='';D(); thinkphp 实例化模型类的方法M();thinkphp中的M 和D 的区别是什么?M() 是model() 的快捷键方式该方法将自己实例化表对象不需要创建表的模型类D() 是快速创建模型类实现表对象的快捷方法,使用D() 必须在你的model层创建相应的表模型类模型实例化:1.$goods= new GoodsModel(); //实例化继承了model基类的个性化需求模型类2. $goods = D('goods'); //快捷函数:和1方法等同$goods = D(); //创建model基类对象,相当于一个数据库的链接,去执行原生sql语句3.$goods = M('goods'); //创建基类model对象,操作goods数据表数据查询1.find2.selectgroup(分组) order(排序) distinct(去掉重复) //自动调用的方法(魔术方法/空方法)3.getByXxxx('aa') //查询字段xxxx的值为aa的,也是自动调用的方法4.条件having 和wherehaving是在where的基础上进行二次筛选,having对查询的字段进行筛选,where对表中的字段进行筛选having可以和聚合函数一起使用(sum count max)5.表单数据收集:create【缓存】把数据库信息获取出来,放在一个缓存介质里边,重复的数据就从缓存中读取缓存介质:内存、file文件、数据库读写方法:memcache内存缓存get() set()file文件缓存: fopen() fwrite()db数据库: insert() select()ThinkPhp封装的方法: S(name) S(name,value)thinkphp缓存默认:文件缓存S('name',value,time) //time 单位为秒,不设置默认为永久,缓存文件可以看到缓存时间清除缓存S('name',null)【自动完成】对表单信息的处理,比如密码加密,获取时间,数据存入数据库create()方法【自动映射】表单映射到数据库字段注:三大自动分别是自动完成,自动加载,自动映射【权限管理】角色的意义:对权限打包,方便权限分配表的设计:user表:user_id,role_id权限表(菜单表)node:权限id node_id父权限id node_pid控制器controller方法action全路径url级别level角色表role:角色id role_id权限ids node_ids查询思路:用户表查角色id 通过角色id查找权限$sql="select b.node_ids from user a join role b on a.role_id=b.role_id where er_id=".$_SESSION['user_id']查找一级权限$sql="select * from node where node_level=0";if($_SESSION['id']!=1){$sql.=" and node_id in (node_ids) ";}查找下级权限$sql=" select * from node where node_level=1";if($_SESSION['id']!=1){$sql.=" and node_id in (node_ids) ";}遍历思路:循环一级菜单变量,然后循环二级菜单变量pid=一级菜单变量id的项url权限控制:写一个父类,然后对当前控制器及方法与用户权限表进行对应。
THINKPHP学习笔记10 17
问题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()方法即可。
thinkphp学习笔记-9页word资料
-------------------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++}。
ThinkPHP笔记完全配置参考手册
ThinkPHP笔记——完全配置参考手册ThinkPHP2.0配置CHECK_FILE_CASE -- windows环境下面的严格检查大小写。
/* 项目设定*/'APP_DEBUG' => false, // 是否开启调试模式'APP_DOMAIN_DEPLOY' => false, // 是否使用独立域名部署项目'APP_PLUGIN_ON' => false, // 是否开启插件机制'APP_FILE_CASE' => false, // 是否检查文件的大小写对Windows平台有效'APP_GROUP_DEPR' => '.', // 模块分组之间的分割符'APP_GROUP_LIST' => '', // 项目分组设定,多个组之间用逗号分隔,例如'Home,Admi n''APP_AUTOLOAD_REG' => false, // 是否开启SPL_AUTOLOAD_REGISTER'APP_AUTOLOAD_PATH' => 'Think.Util.',// __autoLoad 机制额外检测路径设置,注意搜索顺序'APP_CONFIG_LIST' => array('taglibs','routes','tags','htmls','modules','actions'),// 项目额外需要加载的配置列表,默认包括:taglibs(标签库定义),routes(路由定义),tags(标签定义),(ht mls)静态缓存定义, modules(扩展模块),actions(扩展操作)/* Cookie设置*/'COOKIE_EXPIRE' => 3600, // Coodie有效期'COOKIE_DOMAIN' => '', // Cookie有效域名'COOKIE_PATH' => '/', // Cookie路径'COOKIE_PREFIX' => '', // Cookie前缀避免冲突/* 默认设定*/'DEFAULT_APP' => '@', // 默认项目名称,@表示当前项目'DEFAULT_GROUP' => 'Home', // 默认分组'DEFAULT_MODULE' => 'Index', // 默认模块名称'DEFAULT_ACTION' => 'index', // 默认操作名称'DEFAULT_CHARSET' => 'utf-8', // 默认输出编码'DEFAULT_TIMEZONE' => 'PRC', // 默认时区'DEFAULT_AJAX_RETURN' => 'JSON', // 默认AJAX 数据返回格式,可选JSON XML ...'DEFAULT_THEME' => 'default', // 默认模板主题名称'DEFAULT_LANG' => 'zh-cn', // 默认语言/* 数据库设置*/'DB_TYPE' => 'mysql', // 数据库类型'DB_HOST' => 'localhost', // 服务器地址'DB_NAME' => '', // 数据库名'DB_USER' => 'root', // 用户名'DB_PWD' => '', // 密码'DB_PORT' => 3306, // 端口'DB_PREFIX' => 'think_', // 数据库表前缀'DB_SUFFIX' => '', // 数据库表后缀'DB_FIELDTYPE_CHECK' => false, // 是否进行字段类型检查'DB_FIELDS_CACHE' => true, // 启用字段缓存'DB_CHARSET' => 'utf8', // 数据库编码默认采用utf8'DB_DEPLOY_TYPE' => 0, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)'DB_RW_SEPARATE' => false, // 数据库读写是否分离主从式有效/* 数据缓存设置*/'DATA_CACHE_TIME' => -1, // 数据缓存有效期'DATA_CACHE_COMPRESS' => false, // 数据缓存是否压缩缓存'DATA_CACHE_CHECK' => false, // 数据缓存是否校验缓存'DATA_CACHE_TYPE' => 'File', // 数据缓存类型,支持:File|Db|Apc|Memcache|Shmop|Sqli te| Xcache|Apachenote|Eaccelerator'DATA_CACHE_PATH' => TEMP_PATH,// 缓存路径设置(仅对File方式缓存有效)'DATA_CACHE_SUBDIR' => false, // 使用子目录缓存(自动根据缓存标识的哈希创建子目录) 'DATA_PATH_LEVEL' => 1, // 子目录缓存级别/* 错误设置*/'ERROR_MESSAGE' => '您浏览的页面暂时发生了错误!请稍后再试~',//错误显示信息,非调试模式有效'ERROR_PAGE' => '', // 错误定向页面/* 静态缓存设置*/'HTML_CACHE_ON' => false, // 默认关闭静态缓存'HTML_CACHE_TIME' => 60, // 静态缓存有效期'HTML_READ_TYPE' => 0, // 静态缓存读取方式0 readfile 1 redirect'HTML_FILE_SUFFIX' => '.shtml',// 默认静态文件后缀/* 语言设置*/'LANG_SWITCH_ON' => false, // 默认关闭多语言包功能'LANG_AUTO_DETECT' => true, // 自动侦测语言开启多语言功能后有效/* 日志设置*/'LOG_RECORD' => false, // 默认不记录日志'LOG_FILE_SIZE' => 2097152, // 日志文件大小限制'LOG_RECORD_LEVEL' => array('EMERG','ALERT','CRIT','ERR'),// 允许记录的日志级别/* 分页设置*/'PAGE_ROLLPAGE' => 5, // 分页显示页数'PAGE_LISTROWS' => 20, // 分页每页显示记录数/* SESSION设置*/'SESSION_AUTO_START' => true, // 是否自动开启Session// 内置SESSION类可用参数//'SESSION_NAME' => '', // Session名称//'SESSION_PATH' => '', // Session保存路径//'SESSION_CALLBACK' => '', // Session 对象反序列化时候的回调函数/* 运行时间设置*/'SHOW_RUN_TIME' => false, // 运行时间显示'SHOW_ADV_TIME' => false, // 显示详细的运行时间'SHOW_DB_TIMES' => false, // 显示数据库查询和写入次数'SHOW_CACHE_TIMES' => false, // 显示缓存操作次数'SHOW_USE_MEM' => false, // 显示内存开销'SHOW_PAGE_TRACE' => false, // 显示页面Trace信息由Trace文件定义和Action操作赋值'SHOW_ERROR_MSG' => true, // 显示错误信息/* 模板引擎设置*/'TMPL_ENGINE_TYPE' => 'Think', // 默认模板引擎以下设置仅对使用Think模板引擎有效'TMPL_DETECT_THEME' => false, // 自动侦测模板主题'TMPL_TEMPLATE_SUFFIX' => '.html', // 默认模板文件后缀'TMPL_CACHFILE_SUFFIX' => '.php', // 默认模板缓存后缀'TMPL_DENY_FUNC_LIST' => 'echo,exit', // 模板引擎禁用函数'TMPL_PARSE_STRING' => '', // 模板引擎要自动替换的字符串,必须是数组形式。
笔记(自己整理的thinkphp笔记)
笔记(⾃⼰整理的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: 字符串加⼊斜线。
ThinkPHP学习笔记
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学习笔记
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,即完成一个控制器的定义。
thinkphp学习笔记
一、框架文件介绍二、创建应用1.在项目目录创建入口文件2.创建虚拟主机,访问应用三、路由形式1.什么是路由答:系统从URl参数中分析出当前请求分组、控制器和操作的过程就是“路由”。
2.Tp框架路由共有4种形式①基本get形式http://网址/index.php?m=分组&c=控制器&a=操作方法该方式是最底层的get形式、传统的参数传递方式,不时尚、不安全。
②pathinfo路径形式[默认方式]http://网址/index.php/分组/控制器/操作方法http://网址/index.php/Home/Index/advert③rewrite重写形式(伪静态技术)省略index.php入口文件http://网址/分组/控制器/操作方法http://网址/Home/Index/index④兼容形式http://网址/index.php?s=/分组/控制器/操作方法http://网址/index.php?s=/Home/Index/advert以上四种形式除了第③种,其他的url模式都可以使用四、创建控制器五、View视图模板入口程序文件index.php路由解析(控制器、操作方法)1.简单模板view调用$this->display(); //模板名称及当前控制器、当前操作方法的名称一致$this->display(模板名称); //调用当前控制器对应目录指定名称的模板$this->display(控制器/模板名称); //调用其他控制器下的具体模板文件Tp框架有两种模式:开发(调式)、生产【默认】生产模式:错误提示模糊开发模式:错误提示友好define(‘APP_DUBUG’ ,true); //开发define(‘APP_DUBUG’ ,false); //生产2.已有模板及tp框架做结合具体实现步骤:A.复制模板文件到View指定目录B.复制css、img、js静态文件到系统指定目录C.把静态资源(css、img、js)文件的路径设置为“常量”信息(在index入口文件设置)D.在模板文件中通过常量引入静态资源(css、img、js)文件,路径相对入口文件设置最好设置绝对地址(相对工作站点虚拟主机目录的绝对地址)为了后期模板维护方便,通过常量设置静态资源文件访问目录地址E.css文件本身的图片设置,其路径相对c ss文件本身设置后续a、d重复实现即可2.1静态资源文件引入2.2静态资源文件存放①通过独立路由可以访问②不要暴露太多目录信息在模板index.html里边引入css文件,相对地址为什么相对index.php入口文件设置?Index.php+Controller控制器+模板文件==混编文件引入css文件2.3 css文件引入图片路径设置绝对、相对地址:一个文件引入另一个文件,另一个文件的相对地址就相对引入文件设置。
简单介绍ThinkPHP3.1.3使用笔记
简单介绍ThinkPHP3.1.3使⽤笔记ThinkPHP是国内⼀款⾮常不错的框架了,在学习ThinkPHP之前进我们必须了解php mysql及mvc模式了,懂了这些你才可以学习ThinkPHP了,下⾯我就简单的介绍我的学习笔记吧。
框架只是⼯具,它只是将你所经常⽤的代码按照⼀定的模式整理起来。
⽅便程序员快速开发,也⽅便团队协调⼯作。
但框架的基础是语⾔。
如果连PHP有多少个超级全局变量都不知道的话,还是需要返回去好好打打基础。
磨⼑不误砍柴⼯。
我的⼀个前辈说过,阅读⾼⼿写的代码是程序员迅速提升的最佳捷径。
确实是这样,如果只是照着书写个简单的增改删查,也许你永远是⼀个低级程序员(也写程序猿,也写程序媛)。
要⼤胆的跳出思维限制。
在⾃⼰尝试学习的时候要多改框架。
积极使⽤echo,print_r,var_dump等。
在你驾驭了框架的时候,当然可以按照⾃⼰的实际需求修改了,它再⽜逼也是你完成项⽬的⼯具⽽已。
就像骑车⼦,先可以买整车,当充分了解的时候,你就可以按照⾃⼰的需求组车了。
兴趣是学习最⼤的动⼒。
如果喜欢,⼀定坚持下去。
我觉得现在的社会⼤部分⼈的幸福指数是很低的,⼯作虽然是糊⼝的⼿段,但也是陪伴⼏乎你⼀⽣的东西,不要⼲了⼏⼗年⾃⼰的⼯作,回头想想没有⼀点乐趣。
学习ThinkPHP之前需要掌握的东西:PHP,MySql,MVC模式。
再说ThinkPHP框架缓存之前,我想说说,ThinkPHP绝对是可以和CI相媲美的优秀框架。
⽽且是国内数⼀数⼆的PHP框架。
TP中有⼀个常量APP_DEBUG,位于⼊⼝⽂件ThinkPHP.php中。
这个常量是⽤来设置是否开启调试模式,我们可以在引⼊⼊⼝⽂件前进⾏⾃定义。
如果将其置为FALSE,则会在runtime⽂件夹下⽣成⼀份~runtime.php的⽂件(路径和⽂件名均可修改)。
但是⽂件去掉注释,空格和换⾏。
如果直接看这份⽂件,太过费事。
查看源码,我们可以在runtime.php中找到⼀个函数:build_runtime_cache(),在写⼊缓存前使⽤了函数strip_whitespace()。
THINKPHP学习笔记
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)面向对象开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。
业务实体在内存中表现为对象,存在关联和继承关系,在数据库中表现为关系数据,无法表达关联和继承关系。
thinkPHP学习笔记18-29
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语句。
ThinkPHP教学笔记剖析
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方法。
thinkphp5.1学习笔记
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⾥不含参数。
ThinkPhp5笔记
ThinkPhp5笔记一、project 应用部署目录├─application 应用目录(可设置)│├─common 公共模块目录(可更改)│├─index 模块目录(可更改)││├─config.php模块配置文件││├─common.php模块函数文件││├─controller控制器目录││├─model模型目录││├─view视图目录││└─ ...更多类库目录│├─command.php 命令行工具配置文件│├─common.php 应用公共(函数)文件│├─config.php 应用(公共)配置文件│├─database.php 数据库配置文件│├─tags.php 应用行为扩展定义文件│└─route.php 路由配置文件├─extend 扩展类库目录(可定义)├─public WEB 部署目录(对外访问目录)│├─static 静态资源存放目录(css,js,image)│├─index.php 应用入口文件│├─router.php 快速测试文件│└─.htaccess 用于 apache 的重写├─runtime 应用的运行时目录(可写,可设置)├─vendor 第三方类库目录(Composer)├─thinkphp 框架系统目录│├─lang 语言包目录│├─library 框架核心类库目录││├─think Think 类库包目录││└─traits系统 Traits 目录│├─tpl 系统模板目录│├─.htaccess 用于 apache 的重写│├─.travis.yml CI 定义文件│├─base.php 基础定义文件│├─composer.json composer 定义文件│├─console.php 控制台入口文件│├─convention.php 惯例配置文件│├─helper.php 助手函数文件(可选)│├─LICENSE.txt 授权说明文件│├─phpunit.xml 单元测试配置文件│├─README.md README 文件│└─start.php 框架引导文件├─build.php 自动生成定义文件(参考)├─composer.json composer 定义文件├─LICENSE.txt 授权说明文件├─README.md README 文件├─think 命令行入口文件二、安装三、TP5运行原理(重点)技术:(1)mvc设计模式m 模型v 视图c 控制器原理:c调度M获取数据,加载视图将数据显示给客户端(2)模板引擎技术(TP5内置的模板引擎,并不是smarty)(3)命名空间在没有开启路由的情况下访问格式:index.php 入口文件index 应用下的模块Index 模块下的控制器index 控制器下的方法2.配置架构(重点)(1)搭建虚拟主机(2)构架<1>url 访问:不支持普通的模式只支持pathinfo模式pathinfo 模式:简化url地址,可以提高网站的收录排名,有利于seo 优化<2>开启错误调试:application/config.php// 应用调试模式'app_debug' => true,// 应用Trace'app_trace' => true,(3)配置3.路由(重点)(1)普通使用:Route::rule(路由规则,'模块/控制器/方法','请求方式','[伪静态设置]',[参数类型设置]);格式:Route::rule("/index/:id","index/Index/index5",'get',['ext'=>'h tml'],['id'=>'\d+']);(2)请求方式路由Route::get("路由规则","模块/控制器/方法");格式:Route::get("/test","index/Index/index");(3)快捷路由把所有的访问操作统统交给同一个路由规则(/test)处理Route::controller("路由规则","模块/控制器");格式:Route::controller("/test","index/Index");namespace app\admin\controller;app 应用admin 模块controller 控制器(4)路由别名通过路由别名访问控制器下的所有方法Route::alias("别名","模块/控制器");格式:Route::alias("users","admin/Test");4.控制器(重点)(1)控制器初始化_initializesession 在tp5里是自动开启session使用:<1>导入sessionuse think\Session;<2>session 设置 Session::set('session名字','session值');<3>session 获取 Session::get('session名字');<4>session 检测 Session::has("session 名字");<5>session 删除 Session::delete("session 名字");(2)重定向$this->redirect("/路由规则/方法"); 主要用于购物车和结算页. 无限分类<?phpnamespace app\admin\controller;//导入Controlleruse think\Controller;use think\Db;class Cate extends Allow{//加载添加模板public function getAdd(){//获取分类信息// $cate=Db::table("cates")->select();$cate=$this->cates();//加载模板return $this->fetch("Cate/add",['cate'=>$cate]); }//执行添加public function postInsert(){//创建请求对象$request=request();//获取pid和name参数$data=$request->only(['pid','name']);//获取pid参数$pid=$request->param("pid");//判断if($pid==0){//添加是顶级分类// echo "<pre>";// var_dump($data);//拼接path$data['path']="0";}else{//添加不是顶级分类// echo "<pre>";// var_dump($data);//获取父类信息 (id=$pid)$info=Db::table("cates")->where("id","{$pid}")->find();// echo "<pre>";// var_dump($info);//拼接path 父类path.父类id$data['path']=$info['path'].",".$info['id'];}// echo "<pre>";// var_dump($data);//执行数据库的插入if(Db::table("cates")->insert($data)){// echo "111";$this->success("添加成功","/cate/index");}else{// echo "000";$this->error("添加失败","/cate/add");}}//调整类别顺序加分隔符public function cates(){$cate=Db::query("select *,concat(path,',',id) as paths from cates order by paths");//遍历foreach($cate as $key=>$value){// echo $value['path']."<br>";//获取path$path=$value['path'];//把path 转换为数组$arr=explode(",",$path);// echo "<pre>";// var_dump($arr);//获取逗号个数$len=count($arr)-1;// echo $len."<br>";//str_repeat 重复字符串$cate[$key]['name']=str_repeat("---|",$len).$value['name']; }return $cate;}//分类列表public function getIndex(){//获取分类信息// $cate=Db::table("cates")->select();$cate=$this->cates();return $this->fetch("Cate/index",['cate'=>$cate]);}//执行删除public function getDelete(){//创建请求对象$request=request();$id=$request->param("id");//执行删除//判断当前类别下是否具有子类信息//获取$s=Db::table("cates")->where("pid","{$id}")->Count();// echo $s;if($s>0){$this->error("请先干掉孩子","/cate/index");}//执行删除if(Db::table("cates")->where("id","{$id}")->delete()){$this->success("删除成功","/cate/index");}else{$this->error("删除失败","/cate/index");}}public function getEdit(){$request=request();$id=$request->param("id");//获取需要修改的数据$info=Db::table("cates")->where("id","{$id}")->find();//获取类别信息$cate=Db::table("cates")->select();return$this->fetch("Cate/edit",['info'=>$info,'cate'=>$cate]);}//执行修改public function postUpdate(){$request=request();$id=$request->param('id');$data['name']=$request->param('name');if(Db::table("cates")->where("id","{$id}")->update($data)){ $this->success("修改成功","/cate/index");}else{$this->error("修改失败");}}}前台分类<?phpnamespace app\index\widget;use think\Controller;use think\Db;class Cate extends Controller{public function getcatebypid($pid){$cate=Db::table("cates")->where("pid",$pid)->select();$data=[];//遍历foreach($cate as $key=>$value){//shop 下标用来存储当前父类的子类信息$value['id']==子类pid$value['shop']=$this->getcatebypid($value['id']);$data[]=$value;}return $data;}//加载头部public function header(){$cate=$this->getcatebypid(0);//加载模板return $this->fetch("Cate:header",['cate'=>$cate]);}//加载尾部方法public function footer(){return $this->fetch("Cate:footer");}}><nav class="nav-main mega-menu"><ul class="nav nav-pills nav-main" id="mainMenu">{foreach name="cate" item="row"}<li class="dropdown"> <a class="dropdown-toggle" href="#"> {$row['name']} <i class="fa fa-angle-down"></i> </a> {if condition="$row['shop']"}<ul class="dropdown-menu">{foreach name="row['shop']" item="rows"}<li class="dropdown-submenu"> <a href="#">{$rows['name']}</a>{if condition="$rows['shop']"}<ul class="dropdown-menu">{foreach name="rows['shop']" item="rowss"}<li><a href="index.html">{$rowss['name']}</a></li>{/foreach}</ul>{/if}</li>{/foreach}</ul>{/if}</li>{/foreach}</ul></nav>用户添加修改<?phpnamespace app\admin\controller;//导入Controlleruse think\Controller;use think\Db;class User extends Allow{//列表public function getIndex(){$request=request();//获取搜索的关键词$keywords=$request->get('keywords');// echo $keywords;//获取数据$user=Db::table("users")->where('username',"like","%".$key words."%")->paginate(4);//加载模板return$this->fetch("User/index",['user'=>$user,'request'=>$request-> param(),'keywords'=>$keywords]);}//添加public function getAdd(){//加载模板return $this->fetch("User/add");}//执行添加public function postInsert(){//请求对象$request=request();//获取参数$data=$request->only(['username','email','password']); $data['status']=2;$data['token']=rand(1,10000);// echo "<pre>";// var_dump($data);// echo "111";//验证操作$result=$this->validate($request->param(),'User');if(true!==$result){// echo $result;$this->error($result,'/user/add');}// echo "111";$s=Db::table("users")->insert($data);if($s){$this->success("添加成功",'/user/index');}else{$this->error("添加失败",'/user/add');}}//执行删除public function getDelete(){//获取id//创建请求对象$request=request();$id=$request->param('id');// echo $id;if(Db::table("users")->where('id',$id)->delete()){$this->success("删除成功","/user/index");}else{$this->error("删除失败");}}public function getEdit(){$request=request();$id=$request->param('id');//获取需要修改的数据$info=Db::table("users")->where("id",$id)->find();return $this->fetch("User/edit",['info'=>$info]);}public function postUpdate(){$request=request();//获取参数$data=$request->only(['username','email']);// $data=if(Db::table("users")->where("id",$request->param('id'))->u pdate($data)){$this->success("修改成功","/user/index");}else{$this->error("修改失败","/user/edit");}}}登录<?phpnamespace app\admin\controller;//导入Controlleruse think\Controller;use think\Db;use think\Session;class Login extends Controller{public function getLogin(){//加载模板return $this->fetch("Login/login");}//执行登录public function postDologin(){//获取输入的验证码//创建请求对象$request=request();$fcode=$request->param('fcode');//检测验证码if(!captcha_check($fcode)){$this->error("验证码错误","/adminlogin/login");}else{// echo "111";//检测管理员和密码//获取数据库数据$info=Db::table("admin_users")->where('name',$request->p aram('name'))->find();if(!$info){$this->error("用户名不正确","/adminlogin/login");}else{//检测密码if($info['password']==$request->param('password')){//把用户的信息存储在session里Session::set('islogin',$info['id']);// (1)获取当前登录用户的所有权限信息(当前用户所能访问到的控制器和方法)$node=Db::query("select ,n.mname,n.aname from user_role as ur,role_node as rn,node as n where ur.rid=rn.rid and rn.nid=n.id and uid={$info['id']}");// echo "<pre>";// var_dump($node);exit;// (2)处理权限信息//后台首页权限(每个管理员都拥有)$nodelist['admin'][]="getindex";//如果有add 添加insert 如果有edit 添加update//遍历foreach($node as $v){$nodelist[$v['mname']][]=$v['aname'];//如果有add 添加insertif($v['aname']=="getadd"){$nodelist[$v['mname']][]="postinsert";}//如果有edit 添加updateif($v['aname']=="getedit"){$nodelist[$v['mname']][]="postupdate";}}// echo "<pre>";// var_dump($nodelist);exit;// (3)把当前登录的用户所具有的权限信息(当前用户所能访问到的控制器和方法)存储在session里Session::set('nodelist',$nodelist);// echo "后台首页";$this->success("登录成功","/admin/index");}else{$this->error("密码不正确","/adminlogin/login");}}}}//退出public function getLogout(){//销毁session作用域Session::delete('islogin');$this->success("退出成功","/adminlogin/login");}}文件上传<?phpnamespace app\admin\controller;//导入Controlleruse think\Controller;use think\Db;class File extends Controller{public function getIndex(){//加载模板return $this->fetch("File/index");//执行上传public function postUpload(){//普通上传// $request=request();// //1.获取表单数据// $file=$request->file("image");// //2.移动到项目根目录下// if($file){// // ROOT_PATH 根目录 DS 分隔符全局变量// $info=$file->move(ROOT_PATH.'public'.DS.'uploads');// //后缀// echo $info->getExtension()."<br>";// //文件信息// echo $info->getSaveName()."<br>";// }else{// echo "error";// // $this->error($file->getError(),"/file/index");// }//验证上传$request=request();// //1.获取表单数据$file=$request->file("image");//添加验证规则 validate 验证方法$result=$this->validate(['file2'=>$file],['file2'=>'require|ima ge|fileSize:31456677788888'],['file2.require'=>'请选择上传文件','file2.image'=>'非法图像文件','file2.fileSize'=>'图像大小超出']);//对比if(true!==$result){$this->error($result,"/file/index");//2.移动到根目录下$info=$file->move(ROOT_PATH.'public'.DS.'uploads');//获取savename$savename=$info->getSaveName();// echo $savename;$img=\think\Image::open("./uploads/".$savename);//名字$name=time()+rand(1,10000);//后缀$type=$img->type();//裁剪//$img->crop(100,100)->save("./uploads/"."crop/".$name.".".$typ e);//缩放//$img->thumb(100,100)->save("./uploads/"."crop/".$name.".".$t ype);//翻转// $img->flip()->save("./uploads/"."crop/".$name.".".$type);//旋转// $img->rotate(-90)->save("./uploads/"."crop/".$name.".".$type);//水印//$img->water("./logo.jpg",\think\Image::WATER_NORTHWEST)-> save("./uploads/"."crop/".$name.".".$type);//文字水印//$img->text('sm',"./msyh.ttf",25,"#ffffff")->save("./uploads/"."cro p/".$name.".".$type);// var_dump($img); 可以听见我说话吗}}图片删除Ajax分页php代码<?phpnamespace app\admin\controller;//导入Controlleruse think\Controller;use think\Db;class Article extends Controller{public function getIndex(){//创建数据对象$request=request();//获取数据总条数$tot=Db::table("articles")->Count();// echo $tot;//每页显示的数据条数2$rev=3;//获取数据最大页$sums=ceil($tot/$rev);$pp=array();//循环for($i=1;$i<=$sums;$i++){$pp[$i]=$i;}//获取page$page=$request->get('page');//判断if(empty($page)){$page=1;}//获取偏移量$offset=($page-1)*$rev;//准备sql// {$offset} 数据偏移量 {$rev} 每页显示的数据条数$sql="select * from articles limit {$offset},{$rev}";//判断是否为Ajaxif($request->isAjax()){//执行sql$article=Db::query($sql);//加载模板return $this->fetch("Article/test",['article'=>$article]);// exit;}//执行sql$article=Db::query($sql);//加载模板return$this->fetch("Article/index",['pp'=>$pp,'article'=>$article]);}}html代码:<div class="dataTables_paginate paging_full_numbers" id="">{foreach name="pp" item="row"}<li style="list-style-type:none;width:30px;height:30px;text-align:center;line-height:30px;float:left"><ahref="javascript:void(0)" class="btn btn-info" onclick="page({$row})">{$row}</a></li>{/foreach}</div>js 代码:<script type="text/javascript">function page(page){// alert(page);// alert($);//Ajax$.get("/article/index",{page:page},function(data){// alert(data);//赋值把响应数据赋值给id为uid div$("#uid").html(data);});}</script>Ajax批量删除php代码://Ajax 删除public function getDel(){//接收uname参数$uname=isset($_GET['uname'])?$_GET['uname']:'';if($uname==""){echo "请至少选中一条数据";exit;}//遍历foreach($uname as $key=>$value){if(Db::table("users")->where("id","{$value}")->delete()){}}echo 1;}html代码:<tr><!-- javascript:void(0) 屏蔽a连接的默认行为--><td colspan="7"><a href="javascript:void(0)" class=" btn btn-info allchoose">全选</a><a href="javascript:void(0)" class=" btn btn-info nochoose">全不选</a><a href="javascript:void(0)" class=" btn btn-info fchoose">反选</a></td></tr><tr><td colspan="7"><a href="javascript:void(0)" class="btn btn-success del">删除</a></td></tr>js代码:<script type="text/javascript">//全选$(".allchoose").click(function(){//选中全部的input each JQuery 遍历$("#DataTables_Table_1").find("tr").each(function(){// alert('sss');//获取tr下的input$(this).find(":checkbox").attr("checked",true); });})//全不选$(".nochoose").click(function(){//选中全部的input each JQuery 遍历$("#DataTables_Table_1").find("tr").each(function(){ // alert('sss');//获取tr下的input$(this).find(":checkbox").attr("checked",false); });})//反选$(".fchoose").click(function(){$("#DataTables_Table_1").find("tr").each(function(){ //判断if($(this).find(":checked").attr("checked")){//设置为不选中$(this).find(":checkbox").attr("checked",false);}else{//选中$(this).find(":checkbox").attr("checked",true);}});});//删除$(".del").click(function(){arr=[];//遍历全部的input$(":checkbox").each(function(){//判断选中的inputif($(this).attr("checked")){//获取选中的idid=$(this).val();// alert(id);//push 添加arr.push(id);}})// alert(arr);//Ajax$.get("/user/del",{uname:arr},function(data){// alert(data);if(data==1){// alert("删除成功");if($(":checked").attr("checked")){//遍历arrfor(var i=0;i<arr.length;i++){//获取选中的input$("input[value="+arr[i]+"]").parents("tr").remove(); }}}else{alert(data);}});})</script>图片批量上传<form action="{地址}"method="POST" enctype="multipart/form-data"><input name="image[]"type="file"value="" multiple='multiple' /><input type="submit"value="提交" /></form>import('.UploadFile');$upload=new UploadFile();// 实例化上传类$upload->maxSize =3145728 ;// 设置附件上传大小$upload->allowExts =array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型$upload->savePath ='{本地路径}';// 设置附件上传目录if(!$upload->upload()){ $this->error($upload->getErrorMsg ());die;//输出错误提示}else{ $info=$upload->getUploadFileInfo(); //取得成功上传的文件信息foreach($info as $key=>$value){ $data[$key]['path'] = '{本地路径}'.$value['savename'];//这里以获取在本地的保存路径为例 } }。
赵桐正thinkphp课件笔记
本节课大纲:一、ThinkPHP的介绍通模式模式4.兼容模式ThinkPHP 输出和模型使用本节课大纲:一、ThinkPHP 3 的输出(重点)a、通过 echo 等PHP原生的输出方式在页面中输出b、通过display方法输出想分配变量可以使用assign方法c、修改左右定界符休要修改配置文件中的配置项'TMPL_L_DELIM'=>'<{', 启调试功能启调试模式define('APP_DEBUG',true);2.我们需要设置配置文件,开启页面trace'SHOW_PAGE_TRACE'=>true,tml(.tpl)更换模板文件的后缀名(修改配置文件)'TMPL_TEMPLATE_SUFFIX'=>'.html',以带参数$this->display(本模块文件夹下的其他模板文件);$this->display('index2');$this->display(其他文件夹下的模板文件);$this->display('Public:error');/Public/Css', '__JS__'=>__ROOT__.'/Public/Js',),配置项'URL_PATHINFO_DEPR'=>'-',tml',量输出2.数组输出{$name[1]}{$name['k2']}{$}3.对象输出{$name:k}{$name->k}二、系统变量{$三、使用函数{$name|strtoupper} 生成的编译后文件是 <php echo (strtoupper($name)); >{$name|date='Y m d H:i:s',###}四、默认值{$name|default='这里是默认值'}五、运算符+ - * / % ++ --{$name++}# ThinkPHP 模板中的基本语法本节课大纲:一、导入CSS和JS文件1、css linkjs scr<link rel='stylesheet' type='text/css' href='__PUBLIC__/Css/'/><script src='__PUBLIC__/Js/'></script><import type='js' file='' /> Other'/>围标签in<in name='n' value='9,10,11,12'>在这些数字里面<else/>不在这些数字的范围内</in><notin name='n' value='9,10,11,12'>在这些数字里面<else/>不在这些数字的范围内</in>between<notbetween name='n' value='1,10'>{$n}在1-10之间<else/>{$n}不在1到10之间</between>标签来判断模板变量是否已经赋值,<present name='m'>m有赋值<else/>m没有赋值</present>empty标签判断模板变量是否为空,<empty name='n'>n为空赋值<else/>n有值</empty>判断常量是否已经定义在模板中定义常量模板中变量赋值五、其他标签使用1、在模板中直接使用PHP代码<php> echo "我是赵桐正" </php>2、建议更改左右定界符在配置文件中改变'TMPL_L_DELIM'=>'<{', Tpl/default/Public/" /><include file="read" /><include file="Public:header" /><include file="blue:User:read" /><include file="$tplName" /><include file="header" title="ThinkPHP框架"keywords="开源WEB开发框架"/>在模板中变量用[变量]接受<include file='file1,file2' />二、模板渲染1、自动开启模板渲染设置配置文件'LAYOUT_ON'=>true,模块class EmptyAction extends Action{function index(){$city=M('City');$arr=$city->select();$this->assign('list',$arr);$name=MODULE_NAME;$this->display("City:$name");}}二、前置操作和后置操作## ThinkPHP 控制器的模块和操作本节课大纲:一、空模块和空操作1、空操作function _empty($name){$this->show("$name 不存在<a href='__APP__/Index/index'>返回首页</a>");}2.空模块class EmptyAction extends Action{function index(){$city=M('City');$arr=$city->select();$this->assign('list',$arr);$name=MODULE_NAME;$this->display("City:$name");}}# ThinkPHP URL本节课大纲:一、URL规则1、默认是区分大小写的2、如果我们不想区分大小写可以改配置文件'URL_CASE_INSENSITIVE'=>true,则表达式配置路由'my'=>'Index/index',则表达式配置路由四、URL重写五、URL生成## ThinkPHP URL#讲师:赵桐正微博:zhaotongzheng本节课大纲:一、多应用配置技巧二、使用分组三、页面跳转$this->success('查询成功',U('User/test'));$this->redirect('User/test','',5,'页面正在跳');四、Ajax技巧。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ThinkPHP框架I.ThinkPHP的介绍:一、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 项目模板目录ThinkPHP的MVC对应的目录//了解M 项目目录/应用目录/Lib/ModelV 项目目录/应用目录/TplC 项目目录/应用目录/Lib/Actionurl的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修改URL的分隔符:在Conf文件下的config.php加入:'URL_PATHINFO_DEPR'=>'-',打开REWRITE模式(有助于搜索优化):1.打开Apache配置文件:httpd.conf中的LoadModule rewrite_module modules/mod_rewrite.so2.编写(.htaccess)文件到项目中开启开发模式(不使用缓存文件);//开启调试模式:define('APP_DEBUG',true);II.ThinkPHP输出和模型的使用:一、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_', //设置表前缀index.phpConfig.phpAction.class.php 也可以使用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,//开启页面TraceIII.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);返回值是受影响行数IV.查询方式的一般使用:一、普通查询方式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);V.连贯操作:一、常用连贯操作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* 用于命名范围字符串、数组VI.视图:一、模板的使用(重点)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',),VIII.模板中的变量一、变量输出(重点)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++}IX.模板中的基本语法一、导入CSS和JS文件1、css linkjs scr<link rel='stylesheet' type='text/css' href='__PUBLIC__/Css/test.css'/><script src='__PUBLIC__/Js/test.js'></script>2.import<import type='js' file='Js.test' /> //导入Public文件夹下面的Js目录中的test.js文件,import标签可以省略type属性,默认就是js的<import type='css' file='Css.test' />//可以更改默认文件夹设置basepath属性<import type='js' file='Js.my' basepath='./Other'/>3.load//方法可以自动检测导入的文件类型<load href='__PUBLIC__/Js/test.js' />二、分支结构1、if<if condition='$sex eq "男"'>男人是泥巴做的<else />女人是水做的</if><if condition='$age lt 18'>未成年<elseif condition='$age eq 18'/>青春年少<else />成年</if>> gt< lt== eq<= elt>= egt!= neq=== heq!== nheq<switch name='number'><case value='1'>一个和尚挑水吃</case><case value='2'>两个和尚台水吃</case><case value='3'>三个和尚没水吃</case><default/> 这里是默认值</switch>三、循环结构1.for<table border='1' width='500'><for start='10' end='00' name='j' step='-2' comparison='gt'><tr><td>{$j}</td><td>abc</td></tr></for></table>2.volist<volist name='list' id='v'>{$ername}<br/></volist>3.foreach<foreach name='list' item='v' key='k'>{$k}-------{$v}<br/></foreach>四、特殊标签1、比较标签eq或者equal 等于neq 或者notequal 不等于gt 大于egt 大于等于lt 小于elt 小于等于heq 恒等于nheq 不恒等于2.范围标签in<in name='n' value='9,10,11,12'>在这些数字里面<else/>不在这些数字的范围内</in><notin name='n' value='9,10,11,12'>在这些数字里面<else/>不在这些数字的范围内</in>between<notbetween name='n' value='1,10'>{$n}在1-10之间<else/>{$n}不在1到10之间</between>3.present标签来判断模板变量是否已经赋值,<present name='m'>m有赋值<else/>m没有赋值</present>4.Emptyempty标签判断模板变量是否为空,<empty name='n'>n为空赋值<else/>n有值</empty>5.Defined判断常量是否已经定义6.Define在模板中定义常量7.Assing模板中变量赋值五、其他标签使用1、在模板中直接使用PHP代码<php> echo "我是赵桐正" </php>2、建议更改左右定界符在配置文件中改变'TMPL_L_DELIM'=>'<{', //修改左定界符'TMPL_R_DELIM'=>'}>', //修改右定界符X.模板的使用技巧一、模板包含<include file="完整模板文件名" /><include file="./Tpl/default/Public/header.html" /><include file="read" /><include file="Public:header" /><include file="blue:User:read" /><include file="$tplName" /><include file="header" title="ThinkPHP框架"keywords="开源WEB开发框架"/>在模板中变量用[变量]接受<include file='file1,file2' />二、模板渲染1、自动开启模板渲染设置配置文件'LAYOUT_ON'=>true,//开启模板渲染准备一个模板渲染页面,在页面中使用{__CONTENT__}接受具体模板页面的内容如果在摸一个具体模板中不希望使用渲染模板,可以在页首添加{__NOCONTENT__}2、不开启自动模板渲染可以在每一个具体页面的页首添加<layout name='layout'/>3.使用技巧在渲染模板文件中也可以使用其他模板文件的内容<include file='Public:header'/><body><p>这里是渲染页面!!!</p>{__CONTENT__}</body></html>三、模板的继承XI.URL一、URL规则1、默认是区分大小写的2、如果我们不想区分大小写可以改配置文件'URL_CASE_INSENSITIVE'=>true,//url不区分大小写3、如果模块名为UserGroupAction那么url找模块就必要要写成http://localhost/thinkphp4/index.php/user_group/index4、如果'URL_CASE_INSENSITIVE'=>false那么url也可以写为http://localhost/thinkphp4/index.php/UserGroup/index二、URL伪静态'URL_HTML_SUFFIX'=>'html|shtml|xml',//限制伪静态的后缀三、URL路由1、启动路由要在配置文件中开启路由支持2、使用路由1.规则表达式配置路由'my'=>'Index/index',//静态地址路由':id/:num'=>'Index/index',//动态地址路由'year/:year/:month/:date'=>'Index/index',//动态和静态混合地址路由'year/:year\d/:month\d/:date\d'=>'Index/index',//动态和静态混合地址路由加上\d代表类型只能是数字'my/:id$'=>'Index/index',// 加上$说明地址中只能是my/1000 后面不能有其他内容了2.正则表达式配置路由'/^year\/(\d{4})\/(\d{2})\/(\d{2})/'=>'Index/index?year=:1&month=:2&date=: 3'3、注意事项:1.越复杂的路由越往前面放'URL_ROUTE_RULES'=>array('my/:year/:month:/:day'=>'Index/day','my/:id\d'=>'Index/index','my/:name'=>'Index/index',)2.可以使用$作为完全匹配的路由规则'URL_ROUTE_RULES'=>array('my/:id\d$'=>'Index/index','my/:name$'=>'Index/index','my/:year/:month:/:day$'=>'Index/day',),3.用正则匹配的方式'URL_ROUTE_RULES'=>array('/^my\/(\d+)$/'=>'Index/index?id=:1','/^my\/(\w+)$/'=>'Index/index?name=:1','/^my\/(\d{4})\/(\d{2})\/(\d{2})$/'=>'Index/day?year=:1&month=:2&day=:3', ),四、URL重写五、URL生成六、页面间跳转$this->success('查询成功',U('User/test'));$this->redirect('User/test','',5,'页面正在跳');七、Ajax技巧ThinkPHP配置项1.'URL_PATHINFO_DEPR'=>'-',//修改URL的分隔符2.'TMPL_L_DELIM'=>'<{', //修改左定界符3.'TMPL_R_DELIM'=>'}>', //修改右定界符4.'DB_TYPE'=>'mysql', //设置数据库类型5.'DB_HOST'=>'localhost',//设置主机6.'DB_NAME'=>'thinkphp',//设置数据库名7.'DB_USER'=>'root', //设置用户名8.'DB_PWD'=>'', //设置密码9.'DB_PORT'=>'3306', //设置端口号10.'DB_PREFIX'=>'tp_', //设置表前缀11.'DB_DSN'=>'mysql://root:@localhost:3306/thinkphp',//使用DSN方式配置数据库信息12.'SHOW_PAGE_TRACE'=>true,//开启页面Trace13.'TMPL_TEMPLATE_SUFFIX'=>'.html',//更改模板文件后缀名14.'TMPL_FILE_DEPR'=>'_',//修改模板文件目录层次15.'TMPL_DETECT_THEME'=>true,//自动侦测模板主题16.'THEME_LIST'=>'your,my',//支持的模板主题列表17.'TMPL_PARSE_STRING'=>array( //添加自己的模板变量规则a)'__CSS__'=>__ROOT__.'/Public/Css',b)'__JS__'=>__ROOT__.'/Public/Js',18.),19.'LAYOUT_ON'=>true,//开启模板渲染20.'URL_CASE_INSENSITIVE'=>true,//url不区分大小写21.'URL_HTML_SUFFIX'=>'html|shtml|xml',//限制伪静态的后缀22.'APP_GROUP_LIST' => 'Home,Admin', //项目分组设定23.'DEFAULT_GROUP' => 'Home', //默认分组。