<?phpnamespaceapp\api\controller;useapp\common\controller\Api;useapp\common\model\User;usethink\Hook;usethink\Db;usethink\Cache;/****/classWechatextendsApi{protected$noNeedLogin='*';protected$noNeedRight='*';public$AppId='填你自己的';public$Secret='填你自己的';//获取用户手机号publicfunctionuser_phone(){//获取前端传过来的code,如果前端不知道code是啥,就刁他。$post=$this->request->param();if(!isset($post['code'])||empty($post['code'])){$return['status']=222;$return['msg']='非法请求';returnjson_encode($return);}//获取accesstoken$accessToken=$this->get_access_token();//请求地址$url='https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token='.$accessToken;//前端传递的code$code=$post['code'];//组成数组$data=['code'=>$code,];//这里要把传递的参数给转成json,不然小程序接口会报数据类型错误。$result=json_decode($this->curl_post_https($url,json_encode($data)),true);//开始判断获取是否成功if($result['errmsg']==0){//获取成功$phoen=$result['phone_info']['phoneNumber'];$return['smg']='获取手机号成功!';$return['code']=200;$return['phone']=$phoen;//把手机号返回给前端,或者自己进行存储。看需求//Db::name('user')->add();returnjson_encode($return);}else{$return['smg']='获取手机号失败!';$return['code']=201;returnjson_encode($return);}}//获取小程序二维码的tokenpublicfunctionget_access_token(){//先判断缓存里面的access_token过期了没有if(Cache::get('access_token')){//没过期直接拿出来用$a=Cache::get('access_token');return$a;}else{//过期了就重新获取$appid=$this->AppId;$secret=$this->Secret;$url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";//请求接口,获取accesstoken$user_obj=$this->curlHttp($url);//然后将accesstoken存入缓存里面,官方过期时间7200秒,缓存里面可以过期的早一点,自己把控Cache::set('access_token',$user_obj['access_token'],7100);returnCache::get('access_token');}}/***发送get请求*/publicfunctioncurlHttp($url){$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);curl_setopt($ch,CURLOPT_HEADER,false);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);$output=curl_exec($ch);//释放curl句柄curl_close($ch);returnjson_decode($output,true);}/***发送post请求*/publicfunctioncurl_post_https($url,$data,$header=[]){$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);curl_setopt($ch,CURLOPT_POST,true);curl_setopt($ch,CURLOPT_POSTFIELDS,$data);curl_setopt($ch,CURLOPT_HEADER,$header);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);$output=curl_exec($ch);curl_close($ch);return$output;}}请求成功之后返回的数据。 非常简单!
因为最近在用TP5开发小程序,所以就上网搜索了一下TP框架对应的微信小程序获取授权信息的依赖,但是结果不太理想,于是就借鉴了laravel的iwanli/wxxcx依赖,自己手动写了一个TP5的获取信息接口,下面分享一下具体的实现流程。1.梳理首先要知道的是,小程序开发中,微信小程序授权时后台会获取的参数:encryptedData:加密后的用户信息code:登录凭证码iv:偏移向量,在解密是要用到的这三个参数是通过小程序前端发送到后台的。之后需要去微信小程序官方文档里面下载解密sdk。下载完毕之后,解压并放入TP5项目的extend文件夹里面。2.实现流程首先在控制器中引用,以本人代码为例。...//引用解密组件usewxxcx\wxBizDataCrypt;...publicfunctiondemo(){//前台参数$encryptedData=input('get.encryptedData');$code=input('get.code');$iv=input('get.iv');//小程序appid和appsecret$appid='wx4f4bc4dec97d474b';$appsecret='#################';//step1//通过code用curl向腾讯服务器发送请求获取session_key$session_key=$this->sendCode($appid,$appsecret,$code);//step2//用过session_key用sdk获得用户信息$save=[];//相关参数为空判断if(empty($session_key)||empty($encryptedData)||empty($iv)){$msg="信息不全";return$this->ApiSuccess($save,$msg);}//进行解密$userinfo=$this->getUserInfo($encryptedData,$iv,$session_key,$appid);//解密成功判断if(isset($userinfo['code'])&&10001==$userinfo['code']){$msg="请重试";//用户不应看到程序细节return$this->ApiSuccess($save,$msg);}session('myinfo',$userinfo);$save['openid']=&$userinfo['openId'];$save['uname']=&$userinfo['nickName'];$save['unex']=&$userinfo['gender'];$save['address']=&$userinfo['city'];$save['avatarUrl']=&$userinfo['avatarUrl'];$save['time']=time();$map['openid']=&$userinfo['openId'];$msg="获取成功";//返回用户信息return$this->ApiSuccess($save,$msg);}//获取微信用户信息privatefunctionsendCode($appid,$appsecret,$code){//拼接请求地址$url='https://api.weixin.qq.com/sns/jscode2session?appid='.$appid.'&secret='.$appsecret.'&js_code='.$code.'&grant_type=authorization_code';$arr=$this->vegt($url);$arr=json_decode($arr,true);return$arr['session_key'];}//curl封装privatefunctionvegt($url){$info=curl_init();curl_setopt($info,CURLOPT_RETURNTRANSFER,true);curl_setopt($info,CURLOPT_HEADER,0);curl_setopt($info,CURLOPT_NOBODY,0);curl_setopt($info,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($info,CURLOPT_SSL_VERIFYHOST,false);curl_setopt($info,CURLOPT_URL,$url);$output=curl_exec($info);curl_close($info);return$output;}//信息解密privatefunctiongetUserInfo($encryptedData,$iv,$session_key,$APPID){//进行解密$pc=newWXBizDataCrypt($APPID,$session_key);$decodeData="";$errCode=$pc->decryptData($encryptedData,$iv,$decodeData);//判断解密是否成功if($errCode!=0){return['code'=>10001,'message'=>'encryptedData解密失败',];}//返回解密数据returnjson_decode($decodeData,true);}...以上就是TP5获取微信小程序授权用户信息的实现流程。可以将代码中vegt方法转到公共函数库中sendCode和getUserInfo可以进行抽象、再次改进,实现功能分离。以后如果有钉钉小程序,百度小程序等等用户信息获取,都可以用
不多说了直接上代码:页面html:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no"><linkrel="stylesheet"href="__PUBLIC__/css/show.css"><scripttype="text/javascript"src="https://code.jquery.com/jquery-1.8.3.min.js"></script><title>数据删除</title></head><body><divclass="sh_dv"><divclass="sh_dv_tay"><divclass="dv_select"><inputclass="input_sbinput_sel"type="text"placeholder="用户名或邮箱或时间"autofocus=""><buttonclass="input_sbinput_btn"onclick="selBtn();">查询</button></div><divclass="sh_dv_contact"><ulclass="sh_ul"><liclass="sh_lish_li_name">姓名</li><liclass="sh_lish_li_email">eamil</li><liclass="sh_lish_li_contact">问题</li><liclass="sh_lish_li_timesh_li_tibtnthe"><span>时间</span><spanclass="time_bordertime_left"></span><spanclass="time_bordertime_right"></span></li><liclass="sh_lish_li_del">操作<inputid="checkboxAll"type="checkbox"/><spanclass="delAll">删除</span></li></ul>{volistname='lis'id='v'length="30"}<ulclass="sh_ul"><liclass="sh_lish_li_id"style="display:none;">{$v.id}</li><liclass="sh_lish_li_name">{$v.name}</li><liclass="sh_lish_li_email">{$v.email}</li><liclass="sh_lish_li_contact">{$v.comment}</li><liclass="sh_lish_li_time">{$v.date|substr=###,0,10}</li><liclass="sh_lish_li_delcbAll"><inputvalue={$v.id}type="checkbox"/><spanclass="del">删除</span></li></ul>{/volist}</div></div></div><script>//点击时间按钮正序倒序varnum=true;$(".sh_li_tibtn").click(function(){if(num){$(this).addClass("is").val(1);$(this).removeClass("the");$.ajax({url:"/index/index/zx",async:true,type:"POST",dataType:"json",data:{"sv":$(".is").val()},success:function(data){console.log("正"+data);returntrue;},error:function(){returnfalse}})num=false;}elseif(num==false){$(this).addClass("the").val(2);$(this).removeClass("is");$.ajax({url:"/index/index/dx",async:true,type:"POST",dataType:"json",data:{"sv":$(".the").val()},success:function(data){console.log("反"+data);returntrue;},error:function(){returnfalse}})num=true;}})//删除单个$('.sh_ul.del').click(function(){vars=$(this).parent().siblings('.sh_li_id').html();if(confirm('确定删除?')){console.log("我打你啊!"+s);$.ajax({url:"/index/index/del",async:true,type:"POST",dataType:"json",data:{"id":s},success:function(data){window.location='/index/index/show';//返回本页returntrue;},error:function(){returnfalse;}})}})//批量选择$("#checkboxAll").click(function(){if(this.checked){$(".cbAll:checkbox").prop("checked",true);}else{$(".cbAll:checkbox").prop("checked",false);}})//批量删除$(".delAll").click(function(){if(confirm('确定将选择的删除?')){varids=newArray();$('.cbAll:checked').each(function(){vars=$(this).val();console.log("获取数:"+s);//ids.push($(this).val());//向数组中添加元素//同理});}})//查询按钮条件查询、空查询返回全部数据functionselBtn(){varint_val=$(".input_sel").val();location.href="/index/index/show/inp/sel/val/"+int_val;}//回车查询$(".input_sel").keydown(function(e){varevt=window.event||e;varint_val=$(".input_sel").val();if(evt.which==13){window.location.href="/index/index/show/inp/sel/val/"+int_val;}});</script></body></html>样式css:/*show页面样式*/.sh_dv{width:100%;height:100%;min-width:320px;text-align:center;background:#f9f9f9;}.sh_dv_tay{width:1300px;height:100%;margin:auto;border:10pxsolid#00CC99;}.dv_select{}.input_sb{margin:8px;border-radius:8px;}.input_sel{width:300px;height:18px;padding:5px10px;outline:none;border:1pxsolid#ababab;}.input_btn{width:50px;height:28px;color:#fff;background:#007aff;outline:none;border:none;}.input_btn:hover{opacity:0.8;cursor:pointer;}.sh_dv_contact{width:100%;height:100%;}.sh_ul{display:flex;}.sh_li{line-height:1.5;font-size:16px;margin:2px;border:1pxsolid#8D8D8D;}.sh_li_name{width:150px;}.sh_li_email{width:250px;}.sh_li_contact{width:650px;}.sh_li_time{width:150px;position:relative;}.sh_li_del{width:100px;}.del{color:red;cursor:pointer;}.del:hover{opacity:0.8;}.delAll{color:red;cursor:pointer;}.delAll:hover{opacity:0.8;}.sh_li_tibtn{cursor:pointer;}.time_border{width:10px;height:1px;background:#888;position:absolute;}/*反*/.the.time_left{transform:rotate(45deg);top:13px;right:30px;}.the.time_right{transform:rotate(-45deg);top:13px;right:23px;}/*正*/.is.time_left{transform:rotate(-45deg);top:10px;right:30px;}.is.time_right{transform:rotate(45deg);top:10px;right:23px;}后端方法://条件查询空值查询publicfunctionshow($inp=null,$val=null){if($inp=='sel'){$lis=Db::query("SELECT*FROMmsg_informationWHEREname='$val'ORemail='$val'ORdateLIKE'$val%'");//查询数据$this->assign('lis',$lis);}if($inp==null||$val==null){$lis=Db::query('select*frommsg_informationORDERBYdateDESC');//查询数据$this->assign('lis',$lis);}return$this->fetch();}//删除单个publicfunctiondel($id){$msg=json_encode(['msg'=>'success']);$msg2=json_encode(['msg'=>'false']);$list=Db::query('selectidfrommsg_information');//查询数据$locar=array();foreach($listas$k=>$v){array_push($locar,$v['id']);//本地id集合}if(!empty($id)&&in_array($id,$locar)){//判断传入id不为空传入id要在本地id集合中存在Db::table('msg_information')->delete($id);//查询数据return$msg;}else{return$msg2;}return$msg2;}//批量删除publicfunctiondelAll(){if(request()->isAjax()){$datas=$_POST['id'];if(!empty($datas)){Db::table('msg_information')->delete($datas);//批量删除数据returnjson_encode(['msg'=>'success']);}else{return'null';}}returnjson_encode(['msg'=>'false']);}
查询表达式版本新增功能5.0.9比较运算增加闭包子查询支持5.0.4支持对同一个字段多次调用查询方法查询表达式支持大部分的SQL查询语法,也是ThinkPHP查询语言的精髓,查询表达式的使用格式:where('字段名','表达式','查询条件');whereOr('字段名','表达式','查询条件');表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是:表达式含义EQ、=等于(=)NEQ、<>不等于(<>)GT、>大于(>)EGT、>=大于等于(>=)LT、<小于(<)ELT、<=小于等于(<=)LIKE模糊查询[NOT]BETWEEN(不在)区间查询[NOT]IN(不在)IN查询[NOT]NULL查询字段是否(不)是NULL[NOT]EXISTSEXISTS查询EXP表达式查询,支持SQL语法>time时间比较<time时间比较betweentime时间比较notbetweentime时间比较表达式查询的用法示例如下:EQ:等于(=)例如:where('id','eq',100);where('id','=',100);和下面的查询等效where('id',100);表示的查询条件就是 id=100NEQ:不等于(<>)例如:where('id','neq',100);where('id','<>',100);表示的查询条件就是 id<>100GT:大于(>)例如:where('id','gt',100);where('id','>',100);表示的查询条件就是 id>100EGT:大于等于(>=)例如:where('id','egt',100);where('id','>=',100);表示的查询条件就是 id>=100LT:小于(<)例如:where('id','lt',100);where('id','<',100);表示的查询条件就是 id<100ELT:小于等于(<=)例如:where('id','elt',100);where('id','<=',100);表示的查询条件就是 id<=100[NOT]LIKE:同sql的LIKE例如:where('name','like','thinkphp%');查询条件就变成 namelike'thinkphp%'V5.0.5+版本开始,like查询支持使用数组where('name','like',['%think','php%'],'OR');[NOT]BETWEEN:同sql的[not]between查询条件支持字符串或者数组,例如:where('id','between','1,8');和下面的等效:where('id','between',[1,8]);查询条件就变成 idBETWEEN1AND8[NOT]IN:同sql的[not]in查询条件支持字符串或者数组,例如:where('id','notin','1,5,8');和下面的等效:where('id','notin',[1,5,8]);查询条件就变成 idNOTIN(1,5,8)[NOT]IN查询支持使用闭包方式[NOT]NULL:查询字段是否(不)是Null,例如:where('name',null);where('title','null');where('name','notnull');如果你需要查询一个字段的值为字符串null或者notnull,应该使用:where('title','=','null');where('name','=','notnull');EXP:表达式支持更复杂的查询情况例如:where('id','in','1,3,8');可以改成:where('id','exp','IN(1,3,8)');exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。
$leaderList=Db::name('mem_leader')->alias('ml')->join('memm','m.id=ml.mid')->field("m.id,ml.truename,m.headimg,ml.lat,ml.lng,ml.address,ml.shop_name,(6378.138*2*asin(sqrt(pow(sin((lat*pi()/180-".$data['lat']."*pi()/180)/2),2)+cos(lat*pi()/180)*cos(".$data['lat']."*pi()/180)*pow(sin((lng*pi()/180-".$data['lng']."*pi()/180)/2),2)))*1000)asdistance")->where($where)->order('distance')->paginate(20)->toArray();
sql判断条件:TP6条件查询sql判断条件_php菜鸟技术天地-CSDN博客Db::name('user')->when($sex==1&&$type=1&&!empyt($score) ,function($query){Db::name('user')->when($sex==1&&$type=1&&!empyt($score),function($query){//满足条件后执行$query->where('score','>',80)->limit(10);})->field('id,type,score,sex')->select();TP6and条件再加多个or条件$whereOr[]=[['uid','=',$uid]];$whereOr[]=[['phone','=',$phone]];//用户第1个手机(可能有二个手机号码)$whereOr[]=[['tel','=',$phone]];//用户第2个手机(可能有二个手机号码)$rs=Db::connect($connection)->name($table_Name)->where('state',0)//状态0=正常1=删除->where(function($query)use($whereOr){$query->whereOr($whereOr);})->field($field)->order('id','desc')->select()->toArray();效果:SELECT`id`FROM`xxxx`WHERE`state`=0AND((`uid`=1644400846290248750)OR(`phone`='18897545555')OR(`tel`='18897545555'))ORDERBY`id`DESC有查询条件就查询,多个查询条件,只要有查询,就增加一个查询条件一、TP5.1版本模糊查询$where[]=['title','like',"%".$sotitle."%"];$map[]=['name','like','think'];$map[]=['status','=',1];//时间查询$wheret2[]=['time','between',[$datatime1,$datatime2]];注意:$where[]=['exp',Db::raw("FIND_IN_SET($id,category)")];//category值为数字,一但用到$where[]方式和where('type',1)不能同时存在一个语句中下面这语句的其它条件全部失效正确写:$where="FIND_IN_SET($category_id,category)";$crs=Db::name('product')->field('id,title')->where('type',1)->where('type_mold',1)->where('deleted',0)->whereLike('title',"%".$sotitle."%")->where($where)->select()in查询 $where1=[['role_id','in','1,2,3'],];TP5.1.21 版本之后数组查询支持:要达到这样子查询:1、首先引用:usethink\db\Where;2、定义数组:$where=newWhere;3、就可以用了:$where['title']=['like',"%".$sotitle."%"];->where('name','like',"%".$sotitle."%")$cid_al=array(1){[0]=>string(3)"879"[1]=>string(3)"878"}$where['class_id']=['in','$cid_all'];$where['id']=['in',$cid_al];//或这样子$where['id']=[0,7];in可以直接这样子,$cid_all是一维数组$wherer['class_id']=$cidarr;一样子效果:`class_id`IN(879,878)$where['title']=['like','%php%'];$where['u.name|u.tel|u.real_name|u.nickname']=['like',"%".$keyword."%"];$where['id']=['<>',$id];$where['id']=['notin',$all_user_id];//不等于$where['state']=['EXP',Db::raw('ISNULL')];$where['number']=['=',null];//等空值where('','exp',Db::raw("FIND_IN_SET($pid,pc.pidarr)"))->join('menum','find_in_set(m.id,b.category)!=0')$where2="FIND_IN_SET($category,c.category)";>where($where2)//值为数字$id=419;$where[]=['exp',Db::raw("FIND_IN_SET($id,category)")];//category值为数字,例子:419,415,414//值为字符串$id值等于dfd要注意'引号$where[]=['exp',Db::raw("FIND_IN_SET('$id',category)")];//category值为数字,例子:'349/417/419','349/413/415','349/413/416'$where[]与$where['xx']不能同时存在->where("tp.id='".$id."'andtp.deleted=0")Db::table('think_user')->where('id>0ANDnameLIKE"thinkphp%"')->select();更多教程:tp5.1where原生查询多条件where("tp.id='".$id."'andtp.deleted=0")_php菜鸟技术天地-CSDN博客另一种方式:if($sotitle){if($sotype=="id"){$where[$sotype]=$sotitle;}else{$where=[['title','like',"%".$sotitle."%"],];}}$where['level']=1;$rs1=Db::name('column')->where($where)->select();数组与时间一起查询$rst=Db::name('order')->where($datac)->where('time','<',$nowtimg)->setField('state',2);//查询有效期内的活动Db::name('event')->whereTime('start_time','<=',time())->whereTime('end_time','>=',time())->select();时间查询另一个例子:SELECT`id`,`starttime`,`endtime`FROM`edu_live_course`WHERE`pid`=231AND`level`=2AND(starttime>"2018-11-2218:24:11"or(starttime<"2018-11-2218:24:11"andendtime>"2018-11-2218:24:11"))ORDERBY`starttime`ASCLIMIT1$ndate=date("Y-m-dH:i:s");$rs_ccid=Db::name('live_course')->field('id,starttime,endtime')->where(['pid'=>$id,'level'=>2])->where('starttime>"'.$ndate.'"or(starttime<"'.$ndate.'"andendtime>"'.$ndate.'")')->order('starttime','asc')->find();$ccid=$rs_ccid['id'];//echoDb::name('live_course')->getLastSql();//dump($rs_ccid);FIND_IN_SET用法:if($role_id==3){//老师//$where['p.teachers_id']=$uid;$where.="p.teachers_id=".$uid;}else{//1教务/助教2班主任}if($category){//$where2[]=['exp',Db::raw("FIND_IN_SET('$category',p.category)")];$where.=($where?'and':'')."FIND_IN_SET('$category',p.category)";}Db::name('menu')->where('FIND_IN_SET(:id,pid_all)',['id'=>$id])->update([$field=>$title]);->join('menum','find_in_set(m.id,b.category)!=0')具体例子:if(count($allpid)>0){$where1='p.teachers_id='.$uid;//项目分类if($category){//dump($category);die;//$categoryarr=implode(",",$categoryarr);//dump($categoryarr);die;//$where2[]=['exp',Db::raw("FIND_IN_SET($category,c.category)")];$where2="FIND_IN_SET($category,c.category)";//dump($where);}foreach($allpidas$key=>$v){$pid=$v['id'];$rs=Db::name('register_module_pro_city')->alias('pc')->field('c.id,c.title')->join('register_modulem','pc.module_id=m.id')->join('register_exa_dateed','find_in_set(m.id,ed.module_id)!=0')->join('register_classc','find_in_set(ed.id,c.exa_date_id)!=0')->join('productp','find_in_set(p.id,pc.pidarr)!=0')->where('','exp',Db::raw("FIND_IN_SET($pid,pc.pidarr)"))//->where($where)->where($where1)->where($where2)->where('ed.deleted',0)->where('c.deleted',0)->where('m.deleted',0)->where('pc.deleted',0)->where('p.deleted',0)->select();//echoDb::name('register_module_pro_city')->getLastSql();if(count($rs)>0){foreach($rsas$k=>$v1){$allcid[$k]['cid']=$v1['id'];$allcid[$k]['title']=$v1['title'];}}$pid='';}5.1的数组查询方式有所调整,是为了尽量避免数组方式的条件查询注入。如果需要事先组装数组查询条件,可以使用:$map[]=['name','like','think'];$map[]=['status','=',1];官方文档:https://www.kancloud.cn/manual/thinkphp5_1/354006注意,V5.1.7+版本数组方式如果使用exp查询的话,一定要用raw方法。Db::table('think_user')->where([['name','like','thinkphp%'],['title','like','%thinkphp'],['id','exp',Db::raw('>score')],['status','=',1],])->select();数组查询方式,确保你的查询数组不能被用户提交数据控制,用户提交的表单数据应该是作为查询数组的一个元素传入,如下:Db::table('think_user')->where([['name','like',$name.'%'],['title','like','%'.$title],['id','>',$id],['status','=',$status],])->select();注意,相同的字段的多次查询条件可能会合并,如果希望某一个where方法里面的条件单独处理,可以使用下面的方式,避免被其它条件影响。$map=[['name','like','thinkphp%'],['title','like','%thinkphp'],['id','>',0],];Db::table('think_user')->where([$map])->where('status',1)->select();生成的SQL语句为:SELECT*FROM`think_user`WHERE(`name`LIKE'thinkphp%'AND`title`LIKE'%thinkphp'AND`id`>0)AND`status`='1'如果使用下面的多个条件组合$map1=[['name','like','thinkphp%'],['title','like','%thinkphp'],];$map2=[['name','like','kancloud%'],['title','like','%kancloud'],];Db::table('think_user')->whereOr([$map1,$map2])->select();生成的SQL语句为:SELECT*FROM`think_user`WHERE(`name`LIKE'thinkphp%'AND`title`LIKE'%thinkphp')OR(`name`LIKE'kancloud%'AND`title`LIKE'%kancloud')善用多维数组查询,可以很方便的拼装出各种复杂的SQL语句引用:https://www.kancloud.cn/manual/thinkphp5_1/354030二、TP5.0版本//类型if($sotype){$where['type']=$sotype;}//合作单位if($companyid){$where['hezuodanwei']=$companyid;}//关键词模糊查询$type是变量if($key){$where[$type]=['like',"%".$key."%"];}$rs=Db::name('student')->where($where)->order('iddesc')->limit($limit)->page($page)->select();$rs1=Db::name('student')->where($where)->select();查询一段时间的数据:$where['time']=array('between',array($starttime,$enttime));$where['type']=$sotype;$where['hezuodanwei']=$companyid;$where["username"]=['like',"%".$tag["kw"]."%"];//模糊查询$where[]=['exp','FIND_IN_SET(2,needID)'];例子:idin(1,5,8)$where['hezuodanwei']=array('in','10,12');组成查询数组$wherewhere($where) 引用:http://blog.csdn.net/u010447573/article/details/47420063Where条件表达式格式为:$map['字段名']=array('表达式','操作条件');其中$map是一个普通的数组变量,可以根据自己需求而命名。上述格式中的表达式实际是运算符的意义:ThinkPHP运算符与SQL运算符对照表TP运算符SQL运算符例子实际查询条件eq=$map['id']=array('eq',100);等效于:$map['id']=100;neq!=$map['id']=array('neq',100);id!=100gt>$map['id']=array('gt',100);id>100egt>=$map['id']=array('egt',100);id>=100lt<$map['id']=array('lt',100);id<100elt<=$map['id']=array('elt',100);id<=100likelike$map<'username'>=array('like','Admin%');usernamelike'Admin%'betweenbetweenand$map['id']=array('between','1,8');idBETWEEN1AND8notbetweennotbetweenand$map['id']=array('notbetween','1,8');idNOTBETWEEN1AND8inin$map['id']=array('in','1,5,8');idin(1,5,8)notinnotin$map['id']=array('notin','1,5,8');idnotin(1,5,8)and(默认)and$map['id']=array(array('gt',1),array('lt',10));(id>1)AND(id<10)oror$map['id']=array(array('gt',3),array('lt',10),'or');(id>3)OR(id<10)xor(异或)xor两个输入中只有一个是true时,结果为true,否则为false,例子略。1xor1=0exp综合表达式$map['id']=array('exp','in(1,3,8)');$map['id']=array('in','1,3,8');补充说明同SQL一样,ThinkPHP运算符不区分大小写,eq与EQ一样。between、 in条件支持字符串或者数组,即下面两种写法是等效的:$map['id']=array('notin','1,5,8');$map['id']=array('notin',array('1','5','8'));exp表达式上表中的exp不是一个运算符,而是一个综合表达式以支持更复杂的条件设置。exp的操作条件不会被当成字符串,可以使用任何SQL支持的语法,包括使用函数和字段名称。exp不仅用于where条件,也可以用于数据更新,如:$Dao=M("Article");//构建save的数据数组,文章点击数+1$data['id']=10;$data['counter']=array('exp','counter+1');//根据条件保存修改的数据$User->save($data);官方查询语法:https://www.kancloud.cn/manual/thinkphp5/135182查询表达式版本新增功能5.0.9比较运算增加闭包子查询支持5.0.4支持对同一个字段多次调用查询方法查询表达式支持大部分的SQL查询语法,也是ThinkPHP查询语言的精髓,查询表达式的使用格式:where('字段名','表达式','查询条件');whereOr('字段名','表达式','查询条件');表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是:表达式含义EQ、=等于(=)NEQ、<>不等于(<>)GT、>大于(>)EGT、>=大于等于(>=)LT、<小于(<)ELT、<=小于等于(<=)LIKE模糊查询[NOT]BETWEEN(不在)区间查询[NOT]IN(不在)IN查询[NOT]NULL查询字段是否(不)是NULL[NOT]EXISTSEXISTS查询EXP表达式查询,支持SQL语法>time时间比较<time时间比较betweentime时间比较notbetweentime时间比较表达式查询的用法示例如下:EQ:等于(=)例如:where('id','eq',100);where('id','=',100);和下面的查询等效where('id',100);表示的查询条件就是 id=100NEQ:不等于(<>)例如:where('id','neq',100);where('id','<>',100);表示的查询条件就是 id<>100GT:大于(>)例如:where('id','gt',100);where('id','>',100);表示的查询条件就是 id>100EGT:大于等于(>=)例如:where('id','egt',100);where('id','>=',100);表示的查询条件就是 id>=100LT:小于(<)例如:where('id','lt',100);where('id','<',100);表示的查询条件就是 id<100ELT:小于等于(<=)例如:where('id','elt',100);where('id','<=',100);表示的查询条件就是 id<=100[NOT]LIKE:同sql的LIKE例如:where('name','like','thinkphp%');查询条件就变成 namelike'thinkphp%'V5.0.5+版本开始,like查询支持使用数组where('name','like',['%think','php%'],'OR');[NOT]BETWEEN:同sql的[not]between查询条件支持字符串或者数组,例如:where('id','between','1,8');和下面的等效:where('id','between',[1,8]);查询条件就变成 idBETWEEN1AND8[NOT]IN:同sql的[not]in查询条件支持字符串或者数组,例如:where('id','notin','1,5,8');和下面的等效:where('id','notin',[1,5,8]);查询条件就变成 idNOTIN(1,5,8)[NOT]IN查询支持使用闭包方式[NOT]NULL:查询字段是否(不)是Null,例如:where('name',null);where('title','null');where('name','notnull');如果你需要查询一个字段的值为字符串null或者notnull,应该使用:where('title','=','null');where('name','=','notnull');EXP:表达式支持更复杂的查询情况例如:where('id','in','1,3,8');可以改成:where('id','exp','IN(1,3,8)');exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。
在TP5中,limit分页方法是通过limit方法结合page参数来实现的。以下是一个使用limit分页方法的示例:publicfunctionindex(){//获取当前页码,默认为1$page=input('param.page/d',1);//每页显示的记录数$pageSize=input('param.pageSize/d',10);//查询条件$where=[];//排序条件$order=['id'=>'desc'];//获取数据总数$totalCount=Db::name('user')->where($where)->count();//计算LIMIT偏移量$offset=($page-1)*$pageSize;//获取分页数据$users=Db::name('user')->where($where)->order($order)->limit($offset,$pageSize)->select();//返回分页数据returnjson(['code'=>0,'msg'=>'success','data'=>['list'=>$users,'total'=>$totalCount,'currentPage'=>$page,'lastPage'=>ceil($totalCount/$pageSize),'pageSize'=>$pageSize,]]);}在以上示例中,我们通过limit方法设置偏移量和每页显示的记录数,偏移量的计算公式为($page-1)*$pageSize,$page为当前页码,$pageSize为每页显示的记录数。同时,我们通过ceil方法计算总页数,通过URL传递page和pageSize参数来控制分页功能。需要注意的是,使用limit分页方法需要对查询的结果进行排序,否则可能会出现重复数据或者漏数据的情况。
TP5中的分页功能可以通过使用TP5内置的paginate方法来实现,以下是一个分页接口的示例:publicfunctionindex(){//获取当前页码,默认为1$page=input('param.page/d',1);//每页显示的记录数$pageSize=input('param.pageSize/d',10);//查询条件$where=[];//排序条件$order=['id'=>'desc'];//获取数据总数$totalCount=Db::name('user')->where($where)->count();//获取分页数据$users=Db::name('user')->where($where)->order($order)->paginate($pageSize,$totalCount,['page'=>$page]);//返回分页数据returnjson(['code'=>0,'msg'=>'success','data'=>['list'=>$users->items(),'total'=>$users->total(),'currentPage'=>$users->currentPage(),'lastPage'=>$users->lastPage(),'pageSize'=>$users->listRows(),]]);}在以上示例中,我们通过paginate方法获取分页数据,paginate方法的第一个参数是每页显示的记录数,第二个参数是数据总数,第三个参数是当前页码,paginate方法返回一个Paginator对象,我们可以通过Paginator对象的items方法获取当前页的数据,通过total方法获取数据总数,通过currentPage方法获取当前页码,通过lastPage方法获取最后一页的页码,通过listRows方法获取每页显示的记录数。在实际应用中,我们需要根据具体的业务需求灵活设置查询条件和排序条件,同时可以通过URL传递参数来控制分页功能。
//tp5连表查询//首先生成链表的sql//注意,两个表的字段的取出来顺序要一致,不能颠倒$sql=Db::table('zhj_account_log')->where(['user_id'=>$this->user_id,'wisdom_coin'=>0])->union(function($query){$query->field("idasbill_id,CASEstatusWHEN0THENCONCAT('-',money)WHEN2THENmoneyENDasmoney,create_timeasadd_time,CASEstatusWHEN0THEN'申请提现中'WHEN2THENCONCAT(CONCAT('申请提现被拒绝(',remark),')')ENDascontent")->where('statusin(0,2)anduser_id='.$this->user_id)->table('zhj_withdrawals');},true)->field("log_idasbill_id,user_moneyasmoney,change_timeasadd_time,content")->buildSql();//再从链表的sql查询特定字段和排序、limit$result=Db::table($sql.'asa')->field("bill_id,money,FROM_UNIXTIME(add_time,'%Y年%m月%d日%H:%i:%s')asaddtime,content")->order('a.add_timeDESC')->page($page,$page_count)->select();
$subQuery=Db::table('zhi_user_profita')->where('group',5)->order('create_timedesc')->limit(10000000000)//不加这一行代码就有可能出现不是最新的代码->buildSql();//构建查询语句$lists=Db::table($subQuery.'a')->join(config('prefix').'user_infob','a.user_id=b.id')->where("a.user_name_old|b.phone",'like',"%{$keyword}%")->field('a.*,b.phone')->order('create_time','desc')->group('user_id')->fetchSql(true)//->paginate(15,null,['query'=>$param]);->select();