方法一:如果需要对多表进行操作,可以这样使用:Db::field('user.name,role.title')->table('think_useruser,think_rolerole')->limit(10)->select();为了尽量避免和mysql的关键字冲突,可以建议使用数组方式定义,例如:Db::field('user.name,role.title')->table(['think_user'=>'user','think_role'=>'role'])->limit(10)->select();使用数组方式定义的优势是可以避免因为表名和关键字冲突而出错的情况。方法二:Db::table('think_artist')->alias('a')->join('think_workw','a.id=w.artist_id')->join('think_cardc','a.card_id=c.id')->select();Db::table('think_artist')->alias('a')->join('__WORK__w','a.id=w.artist_id')->join('__CARD__c','a.card_id=c.id')->select();$join=[['think_workw','a.id=w.artist_id'],['think_cardc','a.card_id=c.id'],];Db::table('think_user')->alias('a')->join($join)->select();以上三种写法的效果一样,__WORK__和 __CARD__在最终解析的时候会转换为 think_work和 think_card。注意:'_表名_'这种方式中间的表名需要用大写ps:可以这么添加限制条件->where('table_a.meeting_id=table_b.meeting_id')
//tp5field用法:publicfunctionsearch2(){//$result=Db::name('one')->field('id,usernameasname')->select();//$result=Db::name('one')->field('id,username')->select();//$result=Db::name('one')->field(['id','LEFT(email,5)'])->select();//$result=Db::name('one')->field(['id','LEFT(email,5)=>leftEmail'])->select();$result=Db::name('one')->field(true)->select();//使用true显式的显示所有字段而不是使用*//$result=Db::name('one')->field('username',true)->select();//排除username字段//$result=Db::name('one')->field('username','gender')->insert($data);//验证字段的合法性,field在这里的作用是指定这几个字段提交returnjson($result);}
[NOT]NULL:查询字段是否(不)是Null,例如:where('name',null);where('title','null');where('name','notnull');如果你需要查询一个字段的值为字符串null或者notnull,应该使用:where('title','=','null');where('name','=','notnull');$rs=Db::name('schoolstation')->where($where)->where('flid',null)->order('uiddesc,id')->limit($limit)->page($page)->select();$rs1=Db::name('schoolstation')->where($where)->where('flid',null)->select();PHPMYSQL1.不为空select*fromtablewhereid<>"";select*fromtablewhereid!="";2.为空select*fromtablewhereid="";select*fromtablewhereisNull(id);具体情况具体分析,如果字段是char或者varchar类型的,使用id=""可以的;如果字段是int类型的,使用isNull会好些。
官方调用方法:(同一个控制器下和公共文件中调用)$refresh_checkToken=$this->checkToken($refresh_token);一、同一个controller文件夹下的控制器互相调用例子:都是index控制器下 namespaceapp\index\controller;控制器Order.php<?phpnamespaceapp\index\controller;usethink\Controller;classOrderextendsCommon{//首页publicfunctionindex(){$pid=15;//调用其它控制器$a=action('car',['id'=>$pid]);dump($a);returnview();}//购物车publicfunctioncar($id=""){return$id;}}1、另一种调用方法:$this->car();$this->car($pid,$controller);二、跨控制器调用方法 (调用别的控制器的方法)不在同一个controller文件夹下的控制器互相调用1、在index文件夹下Index.php控制器下 路径:\application\index\controller\index.php<?phpnamespaceapp\index\controller;usethink\Controller;classOrderextendsCommon{//首页publicfunctionindex(){$pid=15;//调用其它控制器$a=action('pay/index/car',['id'=>$pid]);dump($a);returnview();}}2、在pay文件夹下Index.php控制器 路径:\application\pay\controller\index.php<?phpnamespaceapp\pay\controller;usethink\Controller;classIndexextendsCommon{//购物车publicfunctioncar($id=""){return$id."成功00";}}
定义:preg_match_all:从左边开始一直到尾部,找出所有匹配的字符串。匹配结果$matches为二维数组,$matches[0]是匹配到的完整结果,$matches[1]是匹配到完整结果的字组。preg_match:从左边开始,匹配到第一个符合字符串后停止匹配。匹配结果$matches为一维数组,$matches[0]是匹配到的完整结果,$matches[1]是匹配到完整结果的字组。示例1:$str="Name:<b>PHP</b><br>Title:<b>ProgrammingLanguage</b>";preg_match_all("/<b>(.*)<\/b>/",$str,$matches);print_r($matches);//返回preg_match_all:Array([0]=>Array([0]=><b>PHP</b><br>Title:<b>ProgrammingLanguage</b>)[1]=>Array([0]=>PHP</b><br>Title:<b>ProgrammingLanguage))preg_match:Array([0]=><b>PHP</b><br>Title:<b>ProgrammingLanguage</b>[1]=>PHP</b><br>Title:<b>ProgrammingLanguage)说明:{m,n}、{m,}、?、*、+这类数量修饰符默认会使用贪婪匹配尽可能多的匹配。可在后面增加?符号来使用惰性匹配,比如+?;另外也可用U修饰符达到相同结果,参照示例2。示例2:$str="Name:<b>PHP</b><br>Title:<b>ProgrammingLanguage</b>";preg_match_all("/<b>(.*)<\/b>/U",$str,$matches);print_r($matches);//返回preg_match_all:Array([0]=>Array([0]=><b>PHP</b>[1]=><b>ProgrammingLanguage</b>)[1]=>Array([0]=>PHP[1]=>ProgrammingLanguage))preg_match:Array([0]=><b>PHP</b>[1]=>PHP)说明:当贪婪匹配时,preg_match_all的$matches[0]与$matches[1]结果只有一个;惰性匹配时,可能存在多个。示例3:preg_match_all("/(\w)+/","abc",$matches);print_r($matches);//返回preg_match_all:Array([0]=>Array([0]=>abc)[1]=>Array([0]=>c))preg_match:Array([0]=>abc[1]=>c)说明:因为数量修饰符为+属于贪婪匹配,会尽可能多的匹配,所以完整匹配结果为abc;子组为(\w),只能为单个字符,所以子组的匹配结果为c。
将该方法放到公共方法文件中,需要过滤敏感词时,直接调用该方法/***敏感词*/publicfunctionsensitive_words_filter($str){//传入要检查的内容,此处直接定义好,用于测试,正式环境调用该方法传值即可$str='123456falun';if(!$str)return'';//敏感词文件位置,可根据自己需求调整$file=ROOT_PATH.'public/static/censorwords/CensorWords';$words=file($file);foreach($wordsas$word){$word=str_replace(array("\r\n","\r","\n","/","<",">","=",""),'',$word);if(!$word)continue;$ret=preg_match("/$word/",$str,$match);if($ret){return$match[0];}}return'';}网上找敏感词txt文件即可
插入数据简单颜色成功新增实例插入成功案列$t3=T::insert(['t'=>500]);$t8=Db::table('t')->insert(['t'=>700]);$t4=model('t');$t4->t=800;$t4=$t4->save();$t5=newT();$t5->t=900;$t5=$t5->insert();//此条插入失败返回值{"t3":1,"t4":true,"t5":0,"t8":1}2报错列表$t1=T::save(['t'=>300]);//报Non-staticmethodthink\Model::save()shouldnotbecalledstatically$t5=Db::table('t')->save(['t'=>300]);//报methodnotexist:think\db\Query->save$t2=T::insert('t=400');//类型错误:Argument1passedtothink\db\Query::insert()mustbeofthetypearray,stringgiven$t7=Db::table('t')->insert('t=600');//Argument1passedtothink\db\Query::insert()mustbeofthetypearray,stringgiven,calledin
Tp5.1接收参数的方法和说明对于一个PHP来说,ThinkPHP框架无处不有。TP3/TP5都有不同的接收参数方法和操作。下面给大家介绍一下ThinkPHP5.1在控制器中为何接收post、get等参数的方法我们要先认识的是请求对象Request类<?php//要用Request类第一步就要引入他,才能在当前控制器上使用//知识点:use与namespace前面不可有空格等其他操作。namespaceapp\admin\controller;usethink\Request;classIndex{ // 在index方法引入Request publicfunctionindex(Request$request){ //parma表示接收所有传过来的参数不管是post请求还是get请求parma都能接收到参数 $data=$request->param(); //post表示只接收post方式传出来的参数 $data1=$request->post(); //get表示只接收get方式传出来的参数 $data2=$request->get(); //假如你只想拿到一个name值,这时我们可以在括号里面加上name即可。 $data=$request->param('name'); }}?> 在TP5.1中又怎么判断请求类型呢? <?php//要用Request类第一步就要引入他,才能在当前控制器上使用//知识点:use与namespace前面不可有空格等其他操作。namespaceapp\admin\controller;usethink\Request;classIndex{ // 在index方法引入Request publicfunctionindex(Request$request){ //判断请求类型是否为post if($request->isPost()){ dump('当前请求类型为post'); } //判断请求类型是否为get if($request->isGet()){ dump('当前请求类型为get'); } //判断请求类型是否为Put if($request->isPut()){ dump('当前请求类型为put'); } //判断请求类型是否为ajax if($request->isAjax()){ dump('当前请求类型为ajax'); } //判断请求类型是否是手机访问 if($request->isMobile()){ dump('当前请求类型为手机类型'); } }}?>
第一种//请求地址"http://www.xxx.com/index/user/uid/100"publicfunctionuser(){print_r($_GET['uid']);//获取不uid,会丢出一个异常print_r(input('get.uid'))//结果为空print_r(input('id'))//ok,正常获取print_r(input('param.id'))//ok,正常获取print_r(Request::instance()->param('id'))//ok,正常获取print_r(Request::instance()->get('id'))//结果为空}第二种//请求地址为"http://www.xxx.com/index/user?uid=100"publicfunctionuser(){print_r($_GET['uid']);//ok,正常获取print_r(input('get.uid'))//ok,正常获取print_r(input('id'))//ok,正常获取print_r(input('param.id'))//ok,正常获取print_r(Request::instance()->param('id'))//ok,正常获取print_r(Request::instance()->get('id'))//ok,正常获取}第三种//请求地址为"http://www.xxx.com/index/user/uid/100?name=chenxing"publicfunctionuser(){print_r($_GET);//只能获取name值print_r(input('get.'))//只能获取name值print_r(input(''))//ok,正常获取所以值print_r(input('param.'))//ok,正常获取所以值print_r(Request::instance()->param(''))//ok,正常获取所以值print_r(Request::instance()->get(''))//只能获取name值}可以通过Request对象完成全局输入变量的检测、获取和安全过滤,支持包括$_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_ENV等系统变量,以及文件上传信息。检测变量是否设置可以使用has方法来检测一个变量参数是否设置,如下:Request::instance()->has('id','get');Request::instance()->has('name','post');或者使用助手函数input('?get.id');input('?post.name');变量检测可以支持所有支持的系统变量。变量获取变量获取使用\think\Request类的如下方法及参数:变量类型方法(‘变量名/变量修饰符’,‘默认值’,‘过滤方法’)变量类型方法包括:方法描述param获取当前请求的变量get获取$_GET变量post获取$_POST变量put获取PUT变量delete获取DELETE变量session获取$_SESSION变量cookie获取$_COOKIE变量request获取$_REQUEST变量server获取$_SERVER变量env获取$_ENV变量route获取路由(包括PATHINFO)变量file获取$_FILES变量获取PARAM变量PARAM变量是框架提供的用于自动识别GET、POST或者PUT请求的一种变量获取方式,是系统推荐的获取请求参数的方法,用法如下://获取当前请求的name变量Request::instance()->param('name');//获取当前请求的所有变量(经过过滤)Request::instance()->param();//获取当前请求的所有变量(原始数据)Request::instance()->param(false);//获取当前请求的所有变量(包含上传文件)Request::instance()->param(true);param方法会把当前请求类型的参数和PATH_INFO变量以及GET请求合并。使用助手函数实现:input('param.name');input('param.');或者input('name');input('');因为input函数默认就采用PARAM变量读取方式。获取GET变量Request::instance()->get('id');//获取某个get变量Request::instance()->get('name');//获取get变量Request::instance()->get();//获取所有的get变量(经过过滤的数组)Request::instance()->get(false);//获取所有的get变量(原始数组)或者使用内置的助手函数input方法实现相同的功能:input('get.id');input('get.name');input('get.');注:pathinfo地址参数不能通过get方法获取,查看“获取PARAM变量”获取POST变量Request::instance()->post('name');//获取某个post变量Request::instance()->post();//获取经过过滤的全部post变量Request::instance()->post(false);//获取全部的post原始变量使用助手函数实现:input('post.name');input('post.');获取PUT变量Request::instance()->put('name');//获取某个put变量Request::instance()->put();//获取全部的put变量(经过过滤)Request::instance()->put(false);//获取全部的put原始变量使用助手函数实现:input('put.name');input('put.');获取REQUEST变量Request::instance()->request('id');//获取某个request变量Request::instance()->request();//获取全部的request变量(经过过滤)Request::instance()->request(false);//获取全部的request原始变量数据使用助手函数实现:input('request.id');input('request.');获取SERVER变量Request::instance()->server('PHP_SELF');//获取某个server变量Request::instance()->server();//获取全部的server变量使用助手函数实现:input('server.PHP_SELF');input('server.');获取SESSION变量Request::instance()->session('user_id');//获取某个session变量Request::instance()->session();//获取全部的session变量使用助手函数实现:input('session.user_id');input('session.');获取Cookie变量Request::instance()->cookie('user_id');//获取某个cookie变量Request::instance()->cookie();//获取全部的cookie变量使用助手函数实现:input('cookie.user_id');input('cookie.');变量过滤框架默认没有设置任何过滤规则,你可以是配置文件中设置全局的过滤规则://默认全局过滤方法用逗号分隔多个'default_filter'=>'htmlspecialchars',也支持使用Request对象进行全局变量的获取过滤,过滤方式包括函数、方法过滤,以及PHP内置的Typesoffilters,我们可以设置全局变量过滤方法,例如:Request::instance()->filter('htmlspecialchars');支持设置多个过滤方法,例如:Request::instance()->filter(['strip_tags','htmlspecialchars']),也可以在获取变量的时候添加过滤方法,例如:Request::instance()->get('name','','htmlspecialchars');//获取get变量并用htmlspecialchars函数过滤Request::instance()->param('username','','strip_tags');//获取param变量并用strip_tags函数过滤Request::instance()->post('name','','org\Filter::safeHtml');//获取post变量并用org\Filter类的safeHtml方法过滤可以支持传入多个过滤规则,例如:Request::instance()->param('username','','strip_tags,strtolower');//获取param变量并依次调用strip_tags、strtolower函数过滤Request对象还支持PHP内置提供的FilterID过滤,例如:Request::instance()->post('email','',FILTER_VALIDATE_EMAIL);框架对FilterID做了转换支持,因此也可以使用字符串的方式,例如:Request::instance()->post('email','','email');采用字符串方式定义FilterID的时候,系统会自动进行一次filter_id调用转换成Filter常量。具体的字符串根据filter_list函数的返回值来定义。需要注意的是,采用FilterID进行过滤的话,如果不符合过滤要求的话会返回false,因此你需要配合默认值来确保最终的值符合你的规范。例如,Request::instance()->post('email','',FILTER_VALIDATE_EMAIL);就表示,如果不是规范的email地址的话返回空字符串。如果当前不需要进行任何过滤的话,可以使用(V5.0.3+版本)//获取get变量并且不进行任何过滤即使设置了全局过滤Request::instance()->get('name','',false);获取部分变量如果你只需要获取当前请求的部分参数,可以使用://只获取当前请求的id和name变量Request::instance()->only('id,name');或者使用数组方式//只获取当前请求的id和name变量Request::instance()->only(['id','name']);默认获取的是当前请求参数,如果需要获取其它类型的参数,可以使用第二个参数,例如://只获取GET请求的id和name变量Request::instance()->only(['id','name'],'get');//只获取POST请求的id和name变量Request::instance()->only(['id','name'],'post');排除部分变量也支持排除某些变量获取,例如//排除id和name变量Request::instance()->except('id,name');或者使用数组方式//排除id和name变量Request::instance()->except(['id','name']);同样支持指定变量类型获取://排除GET请求的id和name变量Request::instance()->except(['id','name'],'get');//排除POST请求的id和name变量Request::instance()->except(['id','name'],'post');变量修饰符input函数支持对变量使用修饰符功能,可以更好的过滤变量。用法如下:input(‘变量类型.变量名/修饰符’);或者Request::instance()->变量类型(‘变量名/修饰符’);例如:input('get.id/d');input('post.name/s');input('post.ids/a');Request::instance()->get('id/d');ThinkPHP5.0版本默认的变量修饰符是/s,如果需要传入字符串之外的变量可以使用下面的修饰符,包括:修饰符作用s强制转换为字符串类型d强制转换为整型类型b强制转换为布尔类型a强制转换为数组类型f强制转换为浮点类型如果你要获取的数据为数组,请一定注意要加上/a修饰符才能正确获取到。
//站三界导航functionrequestAccess($time=60,$limit=10){$obj=RedisPackage::getInstance();$redis=$obj->getRedisObj();//获取访问用户的IP$ip=md5(request()->ip());//获取访问的接口路径$path=request()->path();//将IP和访问的接口路径md5加密成一个字符串,这样子就代表同一个客户访问的接口。$UV=md5($ip.$path);//每个IP和接口每分钟不能超过的次数$cacheIp=$redis->Get($UV)?:0;error_log(var_export($cacheIp,true),3,__FILE__.'.878824547441414');if($cacheIp){if($cacheIp>$limit){returnfalse;}else{$redis->incr($UV);}}else{$redis->set($UV,1,$time);}returntrue;}if(!$this->requestAccess()){returnSend::errorMsg(200,'接口调用过于频繁!');}