站三界导航
首页 TP代码
  • TP5查询当天,昨天,当月数据whereTime()
    TP5查询当天,昨天,当月数据whereTime()

    Db::whereTime('time','today')->select()//获取今天的数据Db::whereTime('time','yesterday')->select()//获取昨天的数据Db::whereTime('time','week')->select()//获取本周的数据Db::whereTime('time','lastweek')->select()//获取上一周的数据Db::whereTime('time','month')->select()//获取本月的数据Db::whereTime('time','year')->select()//获取今年的数据Db::whereTime('time','lastyear')->select()//获取去年的数据//当天数据$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));$endToday=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1;$map['create_time']=array('between',array($beginToday,$endToday));//昨天数据$beginYesterday=mktime(0,0,0,date('m'),date('d')-1,date('Y'));$endYesterday=mktime(0,0,0,date('m'),date('d'),date('Y'))-1;$map['create_time']=array('between',array($beginYesterday,$endYesterday));//按日期和分类分组查询//create_time字段在数据库里为时间戳$list=M('user')->where($map)->field("DATE_FORMAT(FROM_UNIXTIME(create_time),'%Y-%m-%d')asdate,count(*)astotal,type")->group("DATE_FORMAT(FROM_UNIXTIME(create_time),'%Y-%m-%d'),type")->select();$list=array_reverse($list);//ip地址过滤$distinct_click_ip_list=M('user')->where(array('type'=>1))->field("DATE_FORMAT(FROM_UNIXTIME(create_time),'%Y-%m-%d')asdate,count(distinctcreate_ip)asdistinct_total,type")->group("DATE_FORMAT(FROM_UNIXTIME(create_time),'%Y-%m-%d'),type")->select();

    • TP代码
    • 329阅读
    • 2023-08-26

  • ThinkTP5框架获取客户端IP地址
    ThinkTP5框架获取客户端IP地址

    第一步:控制器引入tp框架内置得文件usethink\Request;创建个函数,并返回值publicfunctiongetHostIp(){//tp内置函数获取客户端ip$IP=request()->ip();return$IP;}第三步:调用函数测试

    • TP代码
    • 48阅读
    • 2023-08-02

  • Thinkphp5框架实现分页(模型和Db分页,多种方法)
    Thinkphp5框架实现分页(模型和Db分页,多种方法)

    现在很多网站的数据量的很多,如果全部在一页里显示效果不好,数据量太大,那怎么办?这时我们就需要分页,而分页的好处就是分段显示数据,这样页面就不用加载很多数据,需要时才加载,下面我教大家实现ThinkPHP5分页。在分页之前我们要先引入bootstrap的css。第一种:使用limit实现分页(不建议使用)limit方法也是模型类的连贯操作方法之一,主要用于指定查询和操作的数量,特别在分页查询的时候使用较多。ThinkPHP的limit方法可以兼容所有的数据库驱动类的。代码示例:Db::table('think_article')->limit('10,25')->select();从第10行开始的25条数据;使用limit很麻烦,不推荐大家使用,我就不详细讲了第二种:使用page实现分页page方法也是模型的连贯操作方法之一,是完全为分页查询而诞生的一个人性化操作方法。后台代码:$page=empty($params['page'])?1:$params['page'];//获取当前页数$Products=Db::table('Products')->alias('a')->join('ProductsBrandb','a.BrandId=b.BrandId')->where($wheres)->page($page,12)->select();$count=Db::table('Products')->count();//有多少条数据$sum=$count/12;//要分多少页$this->assign("Products",$Products);$this->assign("sum",$sum);$this->assign("page",$page);第三种:使用paginate实现分页(推荐)在tp5中使用bootstrap分页样式,其实根本不用那么麻烦,只需要引入bootstrap的css文件就可以了。原因是tp5在组装分页链接的时候,默认是组装bootstrap的分页样式链接,就是说,会自动加上class的属性。ThinkPHP5.0内置了分页实现,要给数据添加分页输出功能在5.0变得非常简单,可以直接在Db类查询的时候调用paginate方法。组装链接的函数在think5\thinkphp\library\think\paginator\driver\Bootstrap.php后台代码://每页显示12条数据$Products=Db::table('Products')->paginate(12);前台代码:<divclass="f_page">{$Products->render();}</div>第四种:模型分页新闻栏目(Newsfl)<?phpnamespaceapp\index\model;usethink\Model;classNewsflextendsModel//新闻栏目分类{publicfunctioncomm(){return$this->hasMany('News','newsfl_id','id');}}新闻(News)<?phpnamespaceapp\index\model;usethink\Model;classNewsextendsModel//新闻{}开发手册里的分页是如下形式:$list=Db::name('news')->where('status',1)->paginate(10);或者$list=News::where('status',1)->paginate(10);如果想在关联中实现分页,如下:$news=Newsfl::get($id)->comm()->paginate(3);注:comm()是关联方法HTML+CSS分页的样式<divclass="f_page">{$news->render()}</div>CSS/*分页样式*/.f_page{margin-top:10px;display:flex;}.f_page.pagination{position:relative;margin:auto;height:50px;}.f_page.pagination>li>a,.f_page.pagination>li>span{font-size:14px;padding:10px20px;margin:02px;color:#000;}.f_page.pagination>.active>span{background:#00ae66;color:#fff;}.f_page.pagination>.active>span:hover{background:#00ae66;}.f_page.pagination>.active>span,.f_page.pagination>.active>span:hover{border-color:#00ae66;}.f_pageullia:hover{background:#00ae66;text-decoration:none;color:#fff;}

    • TP代码
    • 36阅读
    • 2023-08-02

  • ThinkPHP5框架route(路由)的详解
    ThinkPHP5框架route(路由)的详解

    路由在框架中的作用打个比方的话,路由好比是WEB应用的总调度室,对于访问的URL地址,路由可以拒绝或者接受某个URL请求,并进行分发调度,而且还有一个副作用是因为路由规则可以随意定义,因此可以让你的URL请求地址更优雅,因为不会暴露实际的URL地址,也就意味着更安全,5.0的路由不仅仅只是支持路由到控制器的操作方法,甚至可以路由到任何的类或者闭包。1、路由模式路由可以理解为一种寻径功能模块,比如URL地址里面的index模块怎么才能省略呢,默认的URL地址显得有点长,下面就来说说如何通过路由简化URL访问。ThinkPHP5.0的路由比较灵活,并且不需要强制定义,可以总结归纳为如下三种方式:1.1、普通模式关闭路由,完全使用默认的PATH_INFO方式URL:'url_route_on'=>false,路由关闭后,不会解析任何路由规则,采用默认的PATH_INFO模式访问URL:http://zhansanjie/index.php/module/controller/action/param/value/...但仍然可以通过操作方法的参数绑定、空控制器和空操作等特性实现URL地址的简化。可以设置url_param_type配置参数来改变pathinfo模式下面的参数获取方式,默认是按名称成对解析,支持按照顺序解析变量,只需要更改为://按照顺序解析变量'url_param_type'=>1,1.2、混合模式开启路由,并使用路由定义+默认PATH_INFO方式的混合:'url_route_on'=>true,'url_route_must'=>false,该方式下面,只需要对需要定义路由规则的访问地址定义路由规则,其它的仍然按照第一种普通模式的PATH_INFO模式访问URL。1.3、强制模式开启路由,并设置必须定义路由才能访问:'url_route_on'=>true,'url_route_must'=>true,这种方式下面必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常。首页的路由规则采用/定义即可,例如下面把网站首页路由输出Hello,world!Route::get('/',function(){return'Hello,world!';});2、路由配置2.1、URL请求的执行流程:用户请求->路由解析->调度请求->执行操作->响应输出2.2、路由规则写在哪里:*路由规则写在与应用配置统计的route.php文件中*路由规则主要使用路由类Route::rule()方法注册2.3、设置路由配置文件列表:'route_config_file'=>['home','admin'],application/home.php配置home模块的路由规则,application/admin.php则配置admin模块的路由规则。虽然运行的时候依然会同时加载并注册,但定义的时候是明确分开了,便于协作。3、路由注册路由注册可以采用方法动态单个和批量注册,也可以直接定义路由定义文件的方式进行集中注册。3.1、动态注册和静态路由现在给该URL地址定义一个新的路由规则如下:Route::rule('hello/:name','index/Index/hello');现在我们来分析下rule方法的参数,第一个参数称为路由规则(通过路由访问的地址),第二个参数为该规则对应的路由地址(也就是原来定义路由之前访问的URL地址)。路由规则通常可以包含变量(例如其中的:name就是一个路由变量),路由规则中包含变量(包括可选变量)的就称该条路由规则为动态路由,没有包含任何变量的路由我们称之为静态路由,例如://静态路由规则Route::rule('hello','index/Index/hello');//动态路由规则Route::rule('hello/:name','index/Index/hello');注:ThinkPHP5.0的路由规则定义是从根目录开始,而不是基于模块名的。并且原来的访问地址会自动失效。3.2、URL请求类型我们知道一个URL请求类型有很多,常用的包括GET/POST/PUT/DELETE等,我们使用rule方法注册的路由,默认是支持任意请求类型访问的,不过你可以通过第三个参数来限定请求类型:Route::rule('hello/:name','index/index/hello','GET');注:只有通过GET请求的访问,该路由才会生效。不指定的话默认为任何请求类型如果你希望路由可以支持所有的请求类型,也可以使用:Route::any('hello/:name','index/index/hello');注:any方法其实和rule方法是一样的,区别在于不用写第三个参数。系统提供了为不同的请求类型定义路由规则的简化方法,例如:Route::get('new/:id','News/read');//定义GET请求路由规则Route::post('new/:id','News/update');//定义POST请求路由规则Route::put('new/:id','News/update');//定义PUT请求路由规则Route::delete('new/:id','News/delete');//定义DELETE请求路由规则Route::any('new/:id','News/read');//所有请求都支持的路由规则我们也可以批量注册路由规则,例如:Route::rule(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);Route::get(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);Route::post(['new/:id'=>'News/update','blog/:name'=>'Blog/detail']);4、路由表达式路由表达式统一使字符串定义,采用规则定义的方式。4.1、规则表达式规则表达式通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式:'/'=>'index',//首页访问路由'my'=>'Member/myinfo',//静态地址路由'blog/:id'=>'Blog/read',//静态地址和动态地址结合'new/:year/:month/:day'=>'News/read',//静态地址和动态地址结合':user/:blog_id'=>'Blog/read',//全动态地址每个参数中以“:”开头的参数都表示动态变量,并且会自动绑定到操作方法的对应参数。4.2、路由变量支持对路由参数的可选定义,例如:'blog/:year/[:month]'=>'Blog/archive',[:month]变量用[]包含起来后就表示该变量是路由匹配的可选变量。4.3、变量解析方式路由规则之外的变量解析方式一般是key1/value1/key2/value2解析为key1=value1,key2=value2,也就是说http://tp5.com/hello/thinkphp/city/shanghai除了会解析路由变量name之外,还会解析另外一个city变量,分别是:'name'=>'thinkphp','city'=>'shanghai'当然我们可以设置按顺序解析:'url_param_type'=>1这个时候如果访问http://tp5.com/hello/thinkphp/city/shanghai,得到的变量结果就完全不同了:'name'=>'thinkphp',0=>'city',1=>'shanghai',4.4、定制分隔符我们在定义路由规则的时候,都是统一使用/作为URL分隔符,但并不是表示URL访问的时候只能使用/作为分隔符,例如我们可以设置参数:'pathinfo_depr'=>'-',那么URL访问地址就会变成http://tp5.com/hello-thinkphphttp://tp5.com/hello-thinkphp-beijing如果你希望某个路由地址使用不同的URL分隔符,有两种方法:方法一:param_depr先介绍第一种比较简单的,定义路由规则的时候,添加param_depr参数(要求V5.0.2+),例如:Route::get('hello/:name/[:city]','index/index/hello',['param_depr'=>'-'],['name'=>'\w+','city'=>'[A-Za-z]+']);表示只有在该路由规则访问的时候,才使用-作为url分隔符。方法二:组合变量在一些复杂的路由规则定义中,我们可以使用组合变量定义方式,组合变量的优势是变量分隔符可以随意定义,例如://正确路径:http://www.mtp5.com/test/1;注:‘?《name?》’表示可选的,['index/index2/test',[]]里面的‘[]’是必须的'test/<id?>-?<name?>'=>['index/index2/test',[]]//正确路径:http://www.mtp5.com/test-1'test-<id>-?<name?>'=>['index/index2/test',[]]//正确路径:http://www.mtp5.com/test-1-'test-<id>-<name?>'=>['index/index2/test',[]]//正确路径:http://www.mtp5.com/test/1-'test/<id>-<name?>'=>['index/index2/test',[]]//正确路径:http://www.mtp5.com/test1'test?<id?>-?<name?>'=>['index/index2/test',[]]//正确路径:http://www.mtp5.com/test'test-?<id?>-?<name?>'=>['index/index2/test',[]]错误的写法://错误写法'test/?<id?>-?<name?>'=>['index/index2/test',[]]'test/[:id]-?<name?>'=>['index/index2/test',[]]注:<name?>表示可选变量,'?<name?>'表示前面的分隔符和这个变量都是可选的通过本篇内容的学习,你已经掌握了路由变量的使用,下面是路由变量的对比变量定义必须变量可选变量变量分隔符普通变量:name[:name]/组合变量<name><name?>实际URL分隔符4.5、完整匹配规则匹配检测的时候只是对URL从头开始匹配,只要URL地址包含了定义的路由规则就会匹配成功,如果希望完全匹配,可以在路由表达式最后使用$符号,例如://正确的写法'new/:cate$'=>'News/category',//路径:http://serverName/index.php/new/info'hello/[:name]$'=>'index/hello',//错误的写法'url/[:id]/[:name$]'=>'index/index2/url',

    • TP代码
    • 39阅读
    • 2023-08-01

  • ThinkPHP5框架模型(model)的使用
    ThinkPHP5框架模型(model)的使用

    在使用ThinkPHP5的过程中,我经常使用db进行数据库操作的,后来接触到了模型(model),刚使用时感觉跟db没啥区别,后来查官网知道模型基类中还提供了较多的其他的方法可以方便使用例如获取器、修改器、数据完成等等功能。因此模型的功能更为强大,tp5官网推荐使用model。就数据格式而言,在DB中是采用的数组格式使用。而在模型中统一使用对象。其中数据库交互后涉及到格式转换。因此在同等情况下db的数据略快与模型方式。因此对于ThinkPHP5使用DB与model的方式具体在编程中选择哪一个按照个人的观点并无强制要求。有时候为了项目中的封装采用模型方式可能更为合适一些1、模型定义在model定义一个Blog模型类:<?phpnamespaceapp\demo\model;usethink\Model;classBlogextendsModel{//默认主键为自动识别,如果需要指定,可以设置属性://protected$pk='uid';}模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,例如:模型名约定对应数据表(假设数据库的前缀定义是think_)Userthink_userUserTypethink_user_type假设我这个类名和表名不相干的,但我这个类想操作这个表,tp5还有另一种方法:<?phpnamespaceapp\demo\model;usethink\Model;classTestextendsModel{//设置数据表(不含前缀)protected$name='blog';//设置完整的数据表//protected$table='tp_codes';}2、模型调用模型类可以使用静态调用或者实例化调用两种方式,例如://静态调用$blog=Blog::get(1);//以id为1作为条件(自动根据主键来查)//实例化模型$blog=newBlog();//使用Loader类实例化(单例)$blog=Loader::model('Blog');//或者使用助手函数`model`$blog=model('Blog');3、使用模型增删查改(1)模型查询操作//查询$blog=Blog::get(2);//以id为1作为条件(自动根据主键来查)echo$blog->title;//输出:php实战$user=newUser();//查询单个数据$user->where('name','thinkphp')->find();//多条件查询,可以传入数组作为查询条件$bolg=Blog::get(['title'=>'模型1','content'=>'模型内容2']);$bolg=Blog::where(['title'=>'模型1','content'=>'模型内容2'])->find();echo$bolg->id;//查询全部$bolg=Blog::all();foreach($bolgas$key=>$v){echo$v->title."<br>";}    $user=newUser();    //查询数据集    $user->where('name','thinkphp')    ->limit(10)    ->order('id','desc')    ->select();动态查询:通过getByxxx()进行条件查询,后面的xxx是字段名称(按驼峰命名)//根据某个条件查询数据getByxxx()方法$bolg=Blog::getByTitle('模型1');echo$bolg->content;(2)模型添加操作$blog=newBlog()//添加单条$blog->title='模型';$blog->author='lhs';$blog->publish_time='11';$blog->content='模型内容';$blog->save();//批量新增$list=[['title'=>'模型1','author'=>'lhs','publish_time'=>'12','content'=>'模型内容2'],['title'=>'模型2','author'=>'lhs','publish_time'=>'13','content'=>'模型内容3']];if($blog->saveAll($list)){echo'用户添加成功!';}或者使用isUpdate进行添加操作//用这个方法添加数据$blog=Blog::get(1);$blog->title='get添加模型';$blog->author='lhs';$blog->publish_time='1568908800';$blog->content='模型内容';$blog->id=null;if($blog->isUpdate(false)->save()){echo"添加成功!";}注:要把id设置为空,不然报主键重复的错误(3)模型更新操作//更新$blog=newBlog();$blog->id=24;$blog->title='更新模型';$blog->author='lhs';$blog->publish_time='1572919302';$blog->content='模型内容';$blog->isUpdate()->save();//调用这个方法,isUpdate改true(即默认是更新操作)$blog=Blog::get(1);$blog->title='更新模型';$blog->author='lhs';$blog->publish_time='1553011200';$blog->content='模型内容';if($blog->save()){echo"更新成功!";}(4)模型删除操作$bolg=Blog::get(25);$bolg->delete();Blog::destroy(26);4、读取器和修改器读取器的作用是在获取数据的字段值后自动进行处理,修改器的作用是可以在数据赋值的时候自动进行转换处理,例如:<?phpnamespaceapp\demo\model;usethink\Model;classCodesextendsModel{//读取器publicfunctiongetPublishTimeAttr($value){returndate("Y-m-dH:i",$value);}//$data为获取整个对象publicfunctiongetNameAttr($value,$data){return'书名:'.$data['name'].',价格:'.$data['price'];}//修改器publicfunctionsetPublishTimeAttr($value){returnstrtotime($value);}}使用读取器和修改器publicfunctionread(){//读取器的方法命名规范:get+属性名(驼峰命名法)+Attr/*$code=Codes::get(1);echo$code->publish_time;//如果自定义了getXXXAttr就调用,没有自定义就原样输出echo$code->name;*///添加$code=newCodes();$code->name='支付宝基金';$code->category='经济';$code->price='161';$code->publish_time='2019-9-27';//调用setPublishTimeAttr方法,在添加是自动转为时间戳$code->save();}5、类型转换integer:设置为integer(整型)后,该字段写入和输出的时候都会自动转换为整型。float:该字段的值写入和输出的时候自动转换为浮点型。boolean:该字段的值写入和输出的时候自动转换为布尔型。array:如果设置为强制转换为array类型,系统会自动把数组编码为json格式字符串写入数据库,取出来的时候会自动解码。object:该字段的值在写入的时候会自动编码为json字符串,输出的时候会自动转换为stdclass对象。serialize:指定为序列化类型的话,数据会自动序列化写入,并且在读取的时候自动反序列化。json:指定为json类型的话,数据会自动json_encode写入,并且在读取的时候自动json_decode处理。timestamp:指定为时间戳字段类型的话,该字段的值在写入时候会自动使用strtotime生成对应的时间戳,输出的时候会自动转换为dateFormat属性定义的时间字符串格式,默认的格式为Y-m-dH:i:s例子://类型转换protected$type=['publish_time'=>'timestamp:Y-m-d','name'=>'serialize'//序列化];在修改数据时自动转换类型//自动转换,修改$code=newCodes();$code->name=['中国的经济','金融危机','美国的经济霸权'];$code->category='经济';$code->price='132161';$code->publish_time='2019-12-27';//调用setPublishTimeAttr方法,在添加是自动转为时间戳$code->save();6、自动完成数据自动完成指在不需要手动赋值的情况下对字段的值进行处理后写入数据库。系统支持auto、insert和update三个属性,可以分别在写入、新增和更新的时候进行字段的自动完成机制,auto属性自动完成包含新增和更新操作,例如://自动完成,更新protected$update=['category'=>'经济'];//自动完成,新增protected$insert=['category'=>'经济'];自动完成对category更新和添加//自动完成,更新$code=Codes::get(4);$code->name='支付宝的霸权';$code->save();//自动完成,新增$code=newCodes();$code->name='中国经济霸权';$code->price='270000';$code->publish_time='2019-12-27';$code->save();以上的自动完成都是对category固定赋值,如果想动态自动完成就结合修改器//自动完成protected$update=[//'category'=>'经济''category'];publicfunctionsetNameAttr($value,$data){return$data['category']=='经济'?'国家经济':'其他';}//自动完成配合修改器,更新$code=Codes::get(4);$code->name='美国';$code->publish_time='2019-12-2';$code->save();结果如下:7、查询范围可以对模型的查询和写入操作进行封装,例如://查询范围protectedfunctionscopeName($query,$a){$query->where("name",$a);}protectedfunctionscopeCategory($query,$a){$query->where('category',$a);}//全局查询范围,就算不调用也会自动加上protectedstaticfunctionbase($query){$query->where('id',2);}就可以进行下面的条件查询://查询范围$code=Codes::scope('name','php实战')->scope('category','PHP')->scope(function($query){$query->order('id','desc');})->all();运行结果:

    • TP代码
    • 46阅读
    • 2023-08-01

  • ThinkPHP5引入公共部分head和foot(多种方法)
    ThinkPHP5引入公共部分head和foot(多种方法)

    在项目中,header和footer重复使用的次数高,于是我们把header和footer作为公共部分,其他模板需要的话就引用。下面我教大家引用公共模板1、使用include 首先在view下面新建一个文件夹(common),用来存放公共模板,然后使用include在需要的地方引用该板块:{includefile="common/head"/}可以一次包含多个模版,例如:{includefile="public/header,public/menu"/}无论你使用什么方式包含外部模板,Include标签支持在包含文件的同时传入参数,例如,下面的例子我们在包含header模板的时候传入了title和keywords参数:{includefile="Public/header"title="$title"keywords="站三界导航"/}就可以在包含的header.html文件里面使用title和keywords变量,如下:<htmlxmlns="http://www.w3.org/1999/xhtml"><head><title>[title]</title><metaname="keywords"content="[keywords]"/></head>2、模板布局ThinkPHP的模板引擎内置了布局模板功能支持,可以方便的实现模板布局以及布局嵌套功能。有三种布局模板的支持方式。第一种方式:全局配置方式这种方式仅需在项目配置文件中添加相关的布局模板配置,就可以简单实现模板布局功能,比较适用于全站使用相同布局的情况,需要配置开启layout_on参数(默认不开启),并且设置布局入口文件名layout_name(默认为layout)。'template'=>['layout_on'=>true,'layout_name'=>'layout',]注:layout_on设置false则关闭公开模板,如果想测试它是否关闭了,需要把runtime里面的文件删除,这样缓存就清空就不会影响它的效果在不开启layout_on布局模板之前,会直接渲染application/index/view/jade/index.html(我的模板文件),开启之后,首先会渲染application/index/view/layout.html模板,布局模板的写法和其他模板的写法类似,本身也可以支持所有的模板标签以及包含文件,区别在于有一个特定的输出替换变量{__CONTENT__},例如,下面是一个典型的layout.html模板的写法:{includefile="common/head"/}{__CONTENT__}{includefile="common/foot"/}读取layout模板之后,会再解析user/add.html模板文件,并把解析后的内容替换到layout布局模板文件的{CONTENT}特定字符串。当然可以通过设置来改变这个特定的替换字符串,例如:'template'=>['layout_on'=>true,'layout_name'=>'layout','layout_item'=>'{__REPLACE__}']注:一个布局模板同时只能有一个特定替换字符串。如果jade.html不需要使用公共模板,在里面加上{__NOLAYOUT__}就不会引入公共模块第二种方式:模板标签方式这种布局模板不需要在配置文件中设置任何参数,也不需要开启layout_on,直接在模板文件中指定布局模板即可,相关的布局模板调整也在模板中进行。以前面的输出模板为例,这种方式的入口还是在user/add.html模板,但是我们可以修改下add模板文件的内容,在头部增加下面的布局标签(记得首先关闭前面的layout_on设置,否则可能出现布局循环):{layoutname="layout"/}表示当前模板文件需要使用layout.html布局模板文件,而布局模板文件的写法和上面第一种方式是一样的。当渲染user/add.html模板文件的时候,如果读取到layout标签,则会把当前模板的解析内容替换到layout布局模板的{CONTENT}特定字符串。一个模板文件中只能使用一个布局模板,如果模板文件中没有使用任何layout标签则表示当前模板不使用任何布局。如果需要使用其他的布局模板,可以改变layout的name属性,例如:{layoutname="newlayout"/}还可以在layout标签里面指定要替换的特定字符串:{layoutname="Layout/newlayout"replace="[__REPLACE__]"/}第三种方式:使用layout控制模板布局使用内置的layout方法可以更灵活的在程序中控制模板输出的布局功能,尤其适用于局部需要布局或者关闭布局的情况,这种方式也不需要在配置文件中开启layout_on。例如:<?phpnamespaceapp\index\controller;usethink\Controller;usethink\Request;usethink\Db;classJadeextendsController{publicfunctionindex(){$this->view->engine->layout(true);return$this->view->fetch();}}表示当前的模板输出启用了布局模板,并且采用默认的layout布局模板。如果当前输出需要使用不同的布局模板,可以动态的指定布局模板名称,例如:<?phpnamespaceapp\index\controller;usethink\Controller;usethink\Request;usethink\Db;classJadeextendsController{publicfunctionindex(){$this->view->engine->layout('Layout/newlayout');return$this->view->fetch();}}或者使用layout方法动态关闭当前模板的布局功能,这种用法可以配合第一种布局方式,例如全局配置已经开启了布局,可以在某个页面单独关闭:namespaceapp\index\controller;usethink\Controller;classUserextendsController{publicfunctionadd(){//临时关闭当前模板的布局功能$this->view->engine->layout(false);return$this->display('add');}}

    • TP代码
    • 47阅读
    • 2023-08-01

  • ThinkPHP5框架Session和Cookie的使用
    ThinkPHP5框架Session和Cookie的使用

    Session的使用下面使用静态方法调用Session;推荐使用$_SESSION(查看全部session),可以更好了解session的作用域//赋值Session::set('name','s1');//赋值think2作用域,set(‘名称’,‘值’,‘作用域’)Session::set('name','s2','think2');//判断当前作用域(think)是否赋值echoSession::has('name');//判断think2作用域是否赋值echoSession::has('name','think2');//取值,当前作用域(think)echoSession::get('name');//取值(think2作用域)echoSession::get('name','think2');//二维数组,赋值(当前作用域)Session::set('name2.item','thinkphp');//判断(当前作用域)是否赋值Session::has('name2.item');//取值(当前作用域)Session::get('name2.item');//删除(当前作用域)Session::delete('name');//删除(think2作用域)Session::delete('name','think2');//清除(当前作用域)Session::clear();//清除(当前作用域)Session::clear('think2');echo'<pre>';print_r($_SESSION);函数助手调用Session//赋值(当前作用域)session('name','thinkphp');echo$this->request->session('name');//赋值think作用域session('name','thinkphp','think');//判断(当前作用域)是否赋值echosession('?name');//取值(当前作用域)echosession('name');//取值think作用域echosession('name','','think');//删除(当前作用域)session('name',null);//清除session(当前作用域)session(null);//清除think作用域session(null,'think');echo"\n";print_r($_SESSION);设置有效时间://方法一:application/index/config.php(全局设置)'session'=>['id'=>'',//SESSION_ID的提交变量,解决flash上传跨域'var_session_id'=>'',//SESSION前缀'prefix'=>'index',//驱动方式支持redismemcachememcached'type'=>'',//是否自动开启SESSION'auto_start'=>true,//过期时间单位秒'path'=>TEMP_PATH,//表示session保存在自己网站根目录中的runtime目录中'expire'=>3600*24*30,//过期时间],//方法二:控制器session(array('user'=>$user,'expire'=>3600));//方法三:控制器Session::init(['expire'=>60*60*12]);Session::set("token",$access_token);注意:如果expire=>0,则默认session的过期时间Cookie的使用下面使用静态方法调用Cookie;推荐使用$_COOKIE(查看全部cookie)//设置Cookie有效期为3600秒Cookie::set('user_name','TPshop团队',3600);//设置cookie前缀为think_Cookie::set('user_name','TPshop老师',['prefix'=>'think_','expire'=>3600]);//支持数组Cookie::set('Teacher',['zhang','wang','chen','peng']);echoCookie::get('user_name');//也支持使用Cookie类直接读取echo"<br/>";//获取指定前缀的cookie值echoCookie::get('user_name','think_');echo"<br/>";//建议的读取Cookie数据的方法是通过Request请求对象的cookie方法echo$this->request->cookie('user_name');echo"<br/>";//判断echoCookie::has('user_name');echo"<br/>";//判断指定前缀的cookie值是否存在echoCookie::has('user_name','think_');echo"<br/>";//删除cookieCookie::delete('user_name');//删除指定前缀的cookieCookie::delete('user_name','think_');//清空//清空指定前缀的cookieCookie::clear('think_');使用函数助手调用Cookie//助手函数//初始化cookie(['prefix'=>'think_','expire'=>3600]);//设置cookie('name','value123',3600);//判断echocookie('?name');echo"<br/>";//获取echocookie('name');echo"<br/>";//删除cookie('name',null);//清除cookie(null,'think_');设置有效时间: //方法一:在控制器cookie初始化Cookie::init(['prefix'=>'think_','expire'=>3600,'path'=>'/']);//方法二:设置Cookie有效期为3600秒Cookie::set('name','value',3600);//方法三:config.php设置'cookie'=>[//cookie名称前缀'prefix'=>'',//cookie保存时间'expire'=>0,//cookie保存路径'path'=>'/',//cookie有效域名'domain'=>'',//cookie启用安全传输'secure'=>false,//httponly设置'httponly'=>'',//是否使用setcookie'setcookie'=>true,],注意:'expire'=>0,默认cookie的过期时间为关联浏览器session或cookie无效一般情况下session和cookie都有效的,但今天我遇到了session和cookie不能保存数据。这种情况一般是config.php的设置的问题,下面让大家看看我发现的问题:这里设置里有效域名x.com,但我当前的域名是ljt.com;知道问题就好解决,只要把有效域名改成ljt.com,或者domain=>""什么都不写总结session:存放在服务器cookie:存放在浏览器Cookies生存期限就到你关闭浏览器为止

    • TP代码
    • 36阅读
    • 2023-08-01

  • tp5查询当前数据的上一条和下一条的记录
    tp5查询当前数据的上一条和下一条的记录

    查询当前数据的上一条和下一条数据,在MySQL里通过”orderby“实现,例如:上一条:select*fromaft_articlewhereid<10orderbyiddesclimit1下一条:select*fromaft_articlewhereid>10orderbyidlimit1下面tp5实现查询当前数据的上一条和下一条数据,首先要获取当前id,其实原理跟上面一样://获取当前id$id=input('id');//上一条数据$prev=db('article')->where('id',"<",$id)->order("iddesc")->find();//下一条数据$next=db('article')->where('id',">",$id)->order("id")->find();通过你给的id用orderby排序然后用limit拿去第一条,下一页就是正序,上一页就是倒序

    • TP代码
    • 31阅读
    • 2023-08-01

  • tp5.0中引入第三方库几种方法
    tp5.0中引入第三方库几种方法

    tp5.0中引入第三方库有以下几种方法使用composer安装第三方库:使用composer可以方便地管理和安装第三方库。首先项目根目录下的composer.json文件中添加第三方库的依赖,然后运行composerinstall命令来安装第三方库。安装完成后,可以使用use关键字来引入第三方库的命名空间,然后就可以使用该库的功能了。直接将第三方库放置在项目中:将第三方库的源码文件直接复制到项目的某个目录下,然后使用require或include语句来引入该库的文件。在引入之前,需要将该库的文件路径添加到app\config.php文件中的extra_file_list配置项中,以确保文件能够被自动加载。使用vendor目录:将第三方库的源码文件放置在项目的vendor目录下,并在项目的composer.json文件中添加第三方库的依赖。然后运行composerinstall命令来安装第三方库。安装完成后,可以使用use关键字来引入第三方库的命名空间,然后就可以使用该库的功能了。需要注意的是,无论使用哪种方法引入第三方库,都需要在使用之前先进行一次自动加载,可以通过运行composerdump-autoload命令来实现。

    • TP代码
    • 39阅读
    • 2023-07-29

  • thinkphp tp5多表查询
    thinkphp tp5多表查询

    以下相关tp5代码://以blogs为主表$res=Db::name('blogs')->alias("a")//取一个别名//与category表进行关联,取名i,并且a表的categoryid字段等于category表的id字段->join('categoryi','a.categoryid=i.id')->join('useru','a.authorid=u.id')//想要的字段->field('a.id,a.title,a.content,u.username,a.createtime,i.category,a.look,a.like')//查询->select();

    • TP代码
    • 52阅读
    • 2023-07-23

站三界导航
本站声明:本站严格遵守国家相关法律规定,非正规网站一概不予收录。本站所有资料取之于互联网,任何公司或个人参考使用本资料请自辨真伪、后果自负,站三界导航不承担任何责任。在此特别感谢您对站三界导航的支持与厚爱!QQ群:1038256843