db = $db; $this->tp = '';//未查到在哪用到 $this->def = $def; $this->md = $coding; $this->config = $config; if (!empty($logininfo)){ $this->uid = $logininfo['uid']; $this->username = $logininfo['username']; $this->usertype = $logininfo['usertype']; } $this->admindir = $adminDir; $this->siteadmindir = $siteAdminDir; $this->tpl = $tpl; if(!($this->config['sy_wapdomain'])){ $this->config['sy_wapdomain'] = $this->config['sy_weburl'].'/'.$this->config['sy_wapdir']; }else{ if($config['sy_wapssl']=='1'){ $protocol = 'https://'; }else{ $protocol = 'http://'; } if(strpos($this->config['sy_wapdomain'],'http://')===false && strpos($this->config['sy_wapdomain'],'https://')===false) { $this->config['sy_wapdomain'] = $protocol.$this->config['sy_wapdomain']; } } if($adminDir||!$siteAdminDir){ //$this->sitetadd = array(); $this->sitetable = array(); } // oss关闭时,oss地址为服务器地址 if (!isset($this->config['sy_oss']) || (isset($this->config['sy_oss']) && $this->config['sy_oss'] == 2)){ $this->config['sy_ossurl'] = $this->config['sy_weburl']; } } /** * 设置数据对象的值 * @access public * @param string $name 名称 * @param mixed $value 值 * @return void */ public function __set($name,$value) { // 设置数据对象属性 $this->data[$name] = $value; } /** * 获取数据对象的值 * @access public * @param string $name 名称 * @return mixed */ public function __get($name) { return isset($this->data[$name])?$this->data[$name]:null; } /** * 检测数据对象的值 * @access public * @param string $name 名称 * @return boolean */ public function __isset($name) { return isset($this->data[$name]); } /** * 销毁数据对象的值 * @access public * @param string $name 名称 * @return void */ public function __unset($name) { unset($this->data[$name]); } // 回调方法 初始化模型 protected function _initialize() {} function insert_into($table,$data=array()){ $value=array(); $this->db->connect(); include(PLUS_PATH.'dbstruct.cache.php'); $TableFullName=$this->def.$table; if(is_array($$TableFullName)){ $fields=array_keys($$TableFullName); }else{ return false; } if(is_array($fields)){ if(is_array($data)){ foreach($data as $key=>$v){ if(in_array($key,$fields)){ $v = $this->FilterStr($v); $value[]="`".$key."`='".$this->db->escape_string($v)."'"; } } } } $value=@implode(",",$value); return $this->DB_insert_once($table,$value); } function update_once($table,$data=array(),$where=array()){ $this->db->connect(); $value=array(); include(PLUS_PATH.'dbstruct.cache.php'); $TableFullName=$this->def.$table; if(is_array($$TableFullName)){ $fields=array_keys($$TableFullName); }else{ return false; } if(is_array($fields)){ if(is_array($data)){ foreach($data as $key=>$v){ if(in_array($key,$fields)){ if(is_array($v)){ if($v[0] == '+'){ $value[] = '`'.$key.'` = `'.$key.'` + '.$this->db->escape_string($v[1]); }elseif ($v[0] == '-'){ $value[] = '`'.$key.'` = `'.$key.'` - '.$this->db->escape_string($v[1]); }else if($v[0] == '='){ $value[] = '`'.$key.'` = '.$this->db->escape_string($v[1]); }elseif ($v[0] == 'CASE'){ $casesql = '`'.$key.'` = CASE `'.$this->db->escape_string($v[1]).'`'; foreach ($v[2] as $ck=>$cv){ $casesql .= " WHEN '".$ck."' THEN '".$this->db->escape_string($cv)."' "; } $casesql .= 'END'; $value[] = $casesql; }elseif ($v[0] == 'DATE_ADD'){ $value[] = '`'.$key.'` = DATE_ADD(`'.$key.'` , INTERVAL '.$this->db->escape_string($v[1]).' DAY )'; }elseif ($v[0] == 'concat'){ $value[] = '`'.$key.'` = concat(`'.$key.'` , ",'.$this->db->escape_string($v[1]).' ")'; }else{ $this->db->show_error(); } }else{ $v = $this->FilterStr($v); $value[] = "`".$key."`='".$this->db->escape_string($v)."'"; } } } } $whereNew = $this->checkWhere($where); $value = @implode(',',$value); if($value !='' && $whereNew !=''){ return $this->DB_update_all($table,$value,$whereNew); }else{ return false; } } } function FilterStr($str){ $str = stripslashes($str); return $str; } function Memcache_set($name,$value="") { global $config; if(isset($config['ismemcache']) && $config['ismemcache']==2){ return false; } if (!empty($config['memcachehost']) && !empty($config['memcacheport']) && !empty($config['memcachetime'])){ $memcachehost = $config['memcachehost'];//所在服务器 $memcacheport = $config['memcacheport'];//所在服务器端口 $memcachezip = 0;//是否支持解压缩 $memcachetime = $config['memcachetime'];//缓存时间 $name=md5(str_replace(array(" ","`","'",".","=","!"),"",$name)); if(!extension_loaded('memcache'))return; $memcache =new memcache(); if(!@class_exists($memcache)){return;} $memcache->connect($memcachehost,$memcacheport) or die ("Memcache连接失败或您的服务器不支持Memcache,请在后台关闭!"); $val = $memcache->get($name); if(!is_array($val)){ $val = $value; $memcache->set($name,$value,$memcachezip,$memcachetime); } $memcache->close(); return $val; }else{ return false; } } /** * 通用数量查询$tablename,$where = 1, $select="*" */ function DB_select_num($tablename, $where = '', $select = "*",$tablename2='',$special=''){ if(!$this->checkTableName($tablename)){ return false; } $cachename=$tablename.$where; if(!$return=$this->Memcache_set($cachename)){//获取是否存在memcache if($tablename2){ if($this->siteadmindir && $special==''){ if(in_array($tablename,$this->sitetable) && is_numeric($this->config['did'])){ $Where='a.`did`='.$this->config['did']."' and ".$Where; } if(in_array($tablename2,$this->sitetable) && is_numeric($this->config['did'])){ $Where='b.`did`='.$this->config['did']."' and ".$Where; } } $SQL = "SELECT count($select) as num FROM " . $this->def . $tablename . " as a," . $this->def . $tablename2 . " as b WHERE $where"; }else{ if($this->siteadmindir && $special==''){ $where = $this->site_fetchsql($where,$tablename); } $SQL = "SELECT count($select) as num FROM " . $this->def . $tablename; if($where) { $SQL .= " WHERE ".$where; } } $query = $this->db->query($SQL); while($row=$this->db->fetch_array($query)){$return=$row['num'];} $this->Memcache_set($cachename,$return);//设置memcache } if($return<1){$return='0';} return $return; } function select_num($tablename, $where = array(), $select = "*"){ if(!$this->checkTableName($tablename)){ return false; } if($this->siteadmindir){ if(in_array($tablename,$this->sitetable)){ if(is_numeric($this->config['did'])){ $where['did']=$this->config['did']; } } } $whereNew = $this->checkWhere($where); $cachename = $tablename.$whereNew; if(!$return=$this->Memcache_set($cachename)){//获取是否存在memcache $SQL = "SELECT count($select) as num FROM " . $this->def . $tablename . $whereNew; $query = $this->db->query($SQL); while($row=$this->db->fetch_array($query)){$return=$row['num'];} $this->Memcache_set($cachename,$return);//设置memcache } if($return<1){$return='0';} return $return; } /** * 通用query查询 $tablename,$where = 1, $select="*" *$special:标记某些特殊查询,不使用did参数。 *2016-1-14 LGL */ function DB_select_query($tablename, $where = 1, $select = "*",$special='') { if(!$this->checkTableName($tablename)){ return false; } if($this->siteadmindir){ $where = $this->site_fetchsql($where,$tablename); } $SQL = "SELECT $select FROM " . $this->def . $tablename . " WHERE $where"; $query=$this->db->query($SQL); return $query; } /** * 通用all查询 $tablename,$where = 1, $select="*" *$special:标记某些特殊查询,不使用did参数。 */ function DB_select_all($tablename, $where = 1, $select = "*",$special='') { if(!$this->checkTableName($tablename)){ return false; } $cachename=$tablename.$where; if(!$row_return=$this->Memcache_set($cachename)){//获取是否存在memcache $row_return=array(); if($this->siteadmindir&&$special==''){ $where = $this->site_fetchsql($where,$tablename); } $SQL = "SELECT $select FROM `" . $this->def . $tablename . "`"; if( $where ){ $SQL .= " WHERE ".$where; } $query=$this->db->query($SQL); while($row=$this->db->fetch_array($query)){$row_return[]=$row;} $this->Memcache_set($cachename,$row_return);//设置memcache } return $row_return; } //新多条查询 function select_all($tablename, $where = array(), $select = "*",$special='') { if(!$this->checkTableName($tablename)){ return false; } if($this->siteadmindir && $special==''){ if(in_array($tablename,$this->sitetable)){ if(is_numeric($this->config['did'])){ $where['did']=$this->config['did']; } } } $whereNew = $this->checkWhere($where); $cachename = $tablename.$whereNew; if(!$row_return=$this->Memcache_set($cachename)){//获取是否存在memcache $row_return=array(); /*if($this->siteadmindir&&$special==''){ $whereNew = $this->site_fetchsql($whereNew,$tablename); } */ $SQL = "SELECT $select FROM `" . $this->def . $tablename . "`" . $whereNew; $query = $this->db->query($SQL); while($row=$this->db->fetch_array($query)){ $row_return[] = $row; } $this->Memcache_set($cachename,$row_return);//设置memcache } return $row_return; } /** * 通用all查询双表 $tablename1,$tablename2, $where = 1, $select = "*" */ function DB_select_alls($tablename1,$tablename2, $where = 1, $select = "*") { if(!$this->checkTableName($tablename1)){ return false; } if(!$this->checkTableName($tablename2)){ return false; } $cachename=$tablename1.$tablename2.$where; if(!$row_return=$this->Memcache_set($cachename)){//获取是否存在memcache if($this->siteadmindir){ if(in_array($tablename1,$this->sitetable) && is_numeric($this->config['did'])){ $where='a.`did`='.$this->config['did']." and ".$where; } if(in_array($tablename2,$this->sitetable) && is_numeric($this->config['did'])){ $where='b.`did`='.$this->config['did']." and ".$where; } } $SQL = "SELECT $select FROM " . $this->def . $tablename1. " as a," . $this->def . $tablename2 . " as b WHERE $where"; $query=$this->db->query($SQL); while($row=$this->db->fetch_array($query)){$row_return[]=$row;} $this->Memcache_set($cachename,$row_return);//设置memcache } return $row_return; } /** * 单表单条插入 $tablename, $value */ function DB_insert_once($tablename, $value){ if(!$this->checkTableName($tablename)){ return false; } if(in_array($tablename,$this->sitetable) && strpos($value,'`did`')===false){ $value.=",`did`='".$this->config['did']."'"; } $SQL = "INSERT INTO `" . $this->def . $tablename . "` SET ".$value; $this->db->query("set sql_mode=''"); $this->db->query($SQL); $nid= $this->db->insert_id(); return $nid; } //一次插入多条数据,方便本地测试数据库构造数据进行测试 function DB_insert_multi($tablename, $valueArr){ // INSERT INTO `roles` (`uid`,`rid`) VALUES // (534,14),(535,14),(536,14),(537,14),(539,14) if(!$this->checkTableName($tablename)){ return false; } include(PLUS_PATH.'dbstruct.cache.php'); $TableFullName=$this->def.$tablename; if(is_array($$TableFullName)){ $fieldsArr = array_keys($$TableFullName); } if($fieldsArr){ $fields = array(); foreach($valueArr[0] as $f => $v){ if(in_array($f, $fieldsArr)){ $fields [] = "`$f`"; } } $fields = implode(',', $fields); $values = array(); foreach($valueArr as $r){ $arr = array(); foreach($r as $k => $v){ if(in_array($k, $fieldsArr)){ $arr [] = "'" . $this->db->escape_string($v) . "'"; } } $values [] = '(' . implode(',', $arr) . ')'; } $values = implode(',', $values); $SQL = "INSERT INTO `{$this->def}{$tablename}` ($fields) VALUES $values"; $this->db->query("set sql_mode=''"); $return=$this->db->query($SQL); return $return; } } /** * 更新 $tablename, $value, $where = 1 */ function DB_update_all($tablename, $value, $where ,$pecial=''){ if(!$this->checkTableName($tablename)){ return false; } if(empty($where) || empty($value)){ return false; } $SQL = "UPDATE `" . $this->def . $tablename . "` SET $value ".$where; $this->db->query("set sql_mode=''"); $return=$this->db->query($SQL); return $return; } /** * 删除 $tablename, $value, $where = 1 */ function DB_delete_all($tablename, $where, $limit = 'limit 1',$pecial='', $norecycle = ''){ if(!$this->checkTableName($tablename)){ return false; } if(empty($where)){ return false; } if($pecial!=$tablename){ //快速创建简历保存数据不进入回收站 if(!in_array($tablename,array('temporary_resume')) && $norecycle != '1'){ $this->insert_recycle($tablename,$this->site_fetchsql($where,$tablename));//先执行回收站 } $SQL = "DELETE FROM `" . $this->def . $tablename . "` WHERE ".$this->site_fetchsql($where,$tablename)." $limit"; }else{ //快速创建简历保存数据不进入回收站 if(!in_array($tablename,array('temporary_resume')) && $norecycle != '1'){ $this->insert_recycle($tablename,$where);//先执行回收站 } $SQL = "DELETE FROM `" . $this->def . $tablename . "` WHERE ".$where." $limit"; } $this->db->query("set `sql_mode`=''"); return $this->db->query($SQL); } /** * @desc 删除数据库 * @param $tablename 数据表名; $where 删除数据表数据查询条件; $limit 删除记录数 $pecial 暂未发现使用 $norecycle 1:不做回收站插入操作 */ function delete_all($tablename, $where = array(), $limit = 'limit 1', $special='', $norecycle = '') { if(!$this->checkTableName($tablename)){ return false; } include(PLUS_PATH.'dbstruct.cache.php'); if($this->siteadmindir && $special==''){ if(in_array($tablename,$this->sitetable)){ if(is_numeric($this->config['did'])){ $where['did']=$this->config['did']; } } } $whereNew = $this->checkWhere($where); if(!empty($whereNew)){ //快速创建简历保存数据不进入回收站 if(!in_array($tablename,array('temporary_resume')) && $norecycle!='1'){ $this->insert_recycle($tablename,$whereNew);//先执行回收站 } $SQL = "DELETE FROM `" . $this->def . $tablename . "` ".$whereNew." ".$limit; }else{ return false; } $this->db->query("set `sql_mode`=''"); return $this->db->query($SQL); } /** * 删除进入回收站 * * @param $tablename * @param $where * @return bool */ function insert_recycle($tablename, $where) { if (!$this->checkTableName($tablename)) { return false; } //回收站同一次操作生成数据MD5用作识别同一次操作的标识符 if (!$this->__isset('recyclemd5')) { $recyclemd5 = md5($tablename.$where); $this->__set('recyclemd5', $recyclemd5); } else { //获取当前操作模块的统一标识符 $recyclemd5 = $this->__get('recyclemd5'); } if (!isset($_GET['isdel']) || $_GET['isdel'] != "all") { $value = "tablename = '" . $tablename . "', "; $value .= "ctime = '" . time() . "', "; if (isset($_SESSION['auid']) && isset($_SESSION['ausername']) && $_SESSION['auid'] && $_SESSION['ausername']) { $username = $_SESSION['ausername']; $uid = $_SESSION['auid']; } else { $username = isset($this->username) ? $this->username : ''; $uid = isset($this->uid) ? $this->uid : ''; } $value .= "uid = '" . $uid . "', "; $value .= "username = '" . $username . "', "; $value .= "uri = '" . $_SERVER['REQUEST_URI'] . "', "; $query = $this->db->query("SELECT * FROM " . $this->def . $tablename . " $where"); $row_del= array(); while ($row = $this->db->fetch_assoc($query)) { $row_del[] = $row; } if (!empty($row_del)) { foreach ($row_del as $delvalue) { $this->DB_insert_once('recycle', $value . "`body`='" . serialize($delvalue) . "',`ident`='" . $recyclemd5 . "'"); } } } } /** * 自定义SQL执行 便于多表联合、left join等组合查询语句 */ function DB_query_all($sql, $type = 'one') { $this->db->query("set sql_mode=''"); $query = $this->db->query($sql); if ($type == 'all') { while ($row = $this->db->fetch_array($query)) { $return[] = $row; } } else { $return = $this->db->fetch_array($query); } return $return; } /** * 通用单条查询$tablename,$where = 1, $select="*" */ function DB_select_once($tablename, $where = 1, $select = "*",$special='') { if(!$this->checkTableName($tablename)){ return false; } $cachename=$tablename.$where; if(!$return=$this->Memcache_set($cachename)){//获取是否存在memcache if($this->siteadmindir && $special==''){ $where = $this->site_fetchsql($where,$tablename); } $SQL = 'SELECT '.$select.' FROM ' . $this->def . $tablename; if($where) { $SQL .= ' WHERE '.$where; } $SQL .= ' LIMIT 1'; $query = $this->db->query($SQL); $return=$this->db->fetch_array($query); $this->Memcache_set($cachename,$return);//设置memcache } return $return; } //新单条查询 function select_once($tablename, $where = array(), $select = "*",$special='') { if(!$this->checkTableName($tablename)){ return false; } if($this->siteadmindir && $special==''){ if(in_array($tablename,$this->sitetable)){ if(is_numeric($this->config['did'])){ $where['did']=$this->config['did']; } } } $whereNew = $this->checkWhere($where); $cachename=$tablename.$whereNew; if(!$return=$this->Memcache_set($cachename)){//获取是否存在memcache /*if($this->siteadmindir && $special==''){ $whereNew = $this->site_fetchsql($whereNew,$tablename); }*/ $SQL = 'SELECT '.$select.' FROM ' . $this->def . $tablename . $whereNew; $SQL .= ' LIMIT 1'; $query = $this->db->query($SQL); $return=$this->db->fetch_array($query); $this->Memcache_set($cachename,$return);//设置memcache } return $return; } function member_log($content,$opera='',$type='',$uid=null,$usertype=null){//会员日志 if(!$uid && !$usertype){ $uid = intval($_COOKIE['uid']); $usertype = intval($_COOKIE['usertype']); } if($uid && $usertype){ $value="`uid`='".$uid."',"; $value.="`usertype`='".$usertype."',"; $value.="`content`='".$content."',"; $value.="`opera`='".$opera."',"; $value.="`type`='".$type."',"; $value.="`ip`='".fun_ip_get()."',"; $value.="`ctime`='".time()."'"; $this->DB_insert_once("member_log",$value); } } function FormatOptions($Options){ if(!is_array($Options)){return array('field'=>'*','where'=>'');} $WhereStr=''; if($Options['field']){ $Field=$Options['field']; unset($Options['field']); }else{ $Field='*'; } if($Options['special']){ $special=$Options['special']; unset($Options['special']); } if($Options['groupby']){ $WhereStr.=' group by '.$Options['groupby']; } if($Options['orderby']){ $WhereStr.=' order by '.$Options['orderby']; } if($Options['desc']){ $WhereStr.=" ".$Options['desc']; } if($Options['limit']){ $WhereStr.=' limit '.$Options['limit']; } return array('field'=>$Field,'order'=>$WhereStr,"special"=>$special); } function FormatWhere($Where){ $WhereStr='1'; foreach($Where as $k=>$v){ //两种方式:1,'uid'=>1 ; 2,'`uid` in (1,2,3)' //TODO:检查字段是否存在 if(is_numeric($k)){ if((substr(trim($v),0,3)=='and')||(substr(trim($v),0,2)=='or')){ $WhereStr.=' '.$v; }elseif($v){ $WhereStr.=' and '.$v; } }else{ /* where允许的格式: $where = array('uid' => $this->uid, 'name <> ' => '', 'age > ' => '18', 'height <' => '65' ); */ if(strpos($k,'<>') > 0){ $position = strpos($k,'<>'); $fieldName = trim(substr($k,0,$position)); $WhereStr .=' and `'.$fieldName.'` <> \''.$v.'\''; } elseif(strpos($k,'<') > 0){ $position = strpos($k,'<'); $fieldName = trim(substr($k,0,$position)); $WhereStr .=' and `'.$fieldName.'` < \''.$v.'\''; } elseif(strpos($k,'>') > 0){ $position = strpos($k,'>'); $fieldName = trim(substr($k,0,$position)); $WhereStr .=' and `'.$fieldName.'` > \''.$v.'\''; } else{ $WhereStr .=' and `'.$k.'`=\''.$v.'\''; } } } return $WhereStr; } function FormatValues($Values){ $ValuesStr=''; foreach($Values as $k=>$v){ //两种方式:1,'uid'=>1 ; 2,'`uid` in (1,2,3)' //TODO:检查字段是否存在 if(preg_match("/^[a-zA-Z0-9_]+$/",$k)){ if(preg_match('/^[0-9]+$/', $k)){ $FiledList = @explode(',',$v); if(is_array($FiledList)){ foreach($FiledList as $Fv){ $FvList = @explode('=',$Fv); if($FvList[1]){ if(strpos($FvList[1],'+') > 0){ $FiledV = @explode('+',$FvList[1]); $ValuesStr.=',`'.str_replace("`",'',$FvList[0]).'`=`'.str_replace("`",'',$FiledV[0]).'`+\''.intval(str_replace("'",'',$FiledV[1])).'\''; } if(strpos($FvList[1],'-') > 0){ $FiledV = @explode('-',$FvList[1]); $ValuesStr.=',`'.str_replace("`",'',$FvList[0]).'`=`'.str_replace("`",'',$FiledV[0]).'`-\''.intval(str_replace("'",'',$FiledV[1])).'\''; } } } } }else{ $ValuesStr.=',`'.$k.'`=\''.$v.'\''; } } } return substr($ValuesStr,1); } //提醒处理 function RemindDeal($TableName,$Values=array(),$Where=array()){ if(!$this->checkTableName($TableName)){ return false; } $ValuesStr = $this->FormatValues($Values); $WhereStr = $this->FormatWhere($Where); $this->DB_update_all($TableName,$ValuesStr,$WhereStr); } function site_fetchsql($Where,$TableName,$SplitChar=' and '){ if(!$this->checkTableName($TableName)){ return false; } if(in_array($TableName,$this->sitetable)){ if(is_array($Where)&&is_numeric($this->config['did'])){ $Where['did']=$this->config['did']; }else if(is_numeric($this->config['did'])){ $Where='`did`='.$this->config['did'].$SplitChar.$Where; } } return $Where; } //调用分页,$table表名,$where条件,$pageurl分页链接,$limit条数,$rowsname模板接收变量,$pagenavname分页模板接收变量 function get_page($table,$where='',$pageurl='',$limit=20,$field='*',$rowsname='rows'){ if(!$this->checkTableName($table)){ return false; } $rows=array(); $page=$_GET['page']<1?1:$_GET['page']; $ststrsql=($page-1)*$limit; $num=$this->DB_select_num($table,$where); if($num>$limit){ $pages=ceil($num/$limit); $pagenav=Page($page,$num,$limit,$pageurl,$notpl=false,null); } $rows=$this->DB_select_all($table,$where.' limit '.$ststrsql.','.$limit,$field); return array('total'=>$num,'pagenav'=>$pagenav,$rowsname=>$rows); } function fetch_assoc(){ return $this->db->fetch_assoc(); } function checkTableName($table){ if (preg_match('/^[_a-z]{2,30}$/i',$table)){ return true; }else { return false; } } /* * $data : where条件, 字符串value 默认==:$where[id] = '1'; * 数组 value:$where['id'] = array('>','1','or/and');根据传入的or and 异或查询 默认AND * $key : PHPYUNBTW PHPYUNBTWEND 使用()组合优先级组合条件 如 (id>0 AND id<1) * $whereNew : 拼接后的SQL条件,默认以AND 连接 */ function checkWhere($where){ $whereNew = ''; if(!empty($where) && is_array($where)){ $limit = ''; if(!empty($where['limit'])){ if(is_array($where['limit'])) { $limit = ' LIMIT '.(int)$where['limit'][0].','.(int)$where['limit'][1]; }else{ $limit = ' LIMIT '.(int)$where['limit']; } unset($where['limit']); } $orderby = ''; if(!empty($where['orderby'])){ if(is_array($where['orderby'])) { $orderby = ' ORDER BY '; foreach($where['orderby'] as $key=>$value){ if($key>0) { $orderby .= ','; } $orders = @explode(',',$value); $orderby .= $orders[0].' '; $orderby .= strtoupper(trim($orders[1])) == 'ASC' ? 'ASC':'DESC'; $whereFiled[] = $orders[0]; } } elseif (stripos($where['orderby'], 'CASE WHEN') !== false) { //CASE THEN END 条件排序 $orderby = ' ORDER BY '.$where['orderby']; $whereFiled[] = 'CASE'; }else{ $orders = @explode(',',$where['orderby']); $orderby = ' ORDER BY '.$orders[0].' '; $orderby .= strtoupper(trim($orders[1])) == 'ASC' ? 'ASC':'DESC'; $whereFiled[] = $orders[0]; } unset($where['orderby']); } if(!empty($where['orderbyfield'])){ if(is_array($where['orderbyfield']) && count($where['orderbyfield']) == 2){ $orderby = ' ORDER BY field('.$where['orderbyfield'][0].','.$where['orderbyfield'][1].')'; $whereFiled[] = $where['orderbyfield'][0]; } unset($where['orderbyfield']); } $groupby = $having = ''; if(!empty($where['groupby'])){ // GROUP BY 和 HAVING 联合查询 // $key : having ; $value : array(); // 例如 : array('having' => array('distance' => array('<', 20, ''), 'x' => array('<>', 0, 'AND'))) if (!empty($where['having'])) { $groupby = ' GROUP BY '.$where['groupby']; $whereFiled[] = $where['groupby']; foreach ($where['having'] as $key => $value){ if (is_array($value)) { // HAVING 多条件查询; $value[2] : 异或查询 if($value[2] == 'OR' || $value[2] == 'or'){ $btnAndOR = ' OR '; }else if($value[2] == 'AND' || $value[2] == 'and'){ $btnAndOR = ' AND '; }else{ $btnAndOR = ''; } $having = $btnAndOR; $having .= $this->spilceWhere($key, $value); $whereFiled[] = $key; } } $groupby .= ' HAVING '.$having; unset($where['having']); }else{ $groupby = ' GROUP BY '.$where['groupby']; $whereFiled[] = $where['groupby']; } unset($where['groupby']); } foreach($where as $key=>$value){ //PHPYUNBTWSTART_A PHPYUNBTWEND_A PHPYUNBTWSTART_B PHPYUNBTWEND_B 这种可以组成多个() // PHPYUNBTWSTART_A_DOUBLE、PHPYUNBTWEND_B_DOUBLE 考虑有需要多重括号的方式,增加此种写法 //考虑到部分需要使用()执行优先级条件查询判断的情况 if(strpos($key, 'PHPYUNBTWSTART') !== false){ if($whereNew!='') { $btwAndOr = ($value=='OR' || $value == 'or') ?' OR ':' AND '; }else{ $btwAndOr = ''; } $whereNew .= $btwAndOr.'('; // 带_DOUBLE为需要一个多的开始括号情况 if(strpos($key, '_DOUBLE') !== false){ $whereNew .= '('; } //标识符 用于判断是否是()内首项条件 非首项条件 必须使用 AND/OR 连接 $btwStr = 1; }elseif(strpos($key, 'PHPYUNBTWEND') !== false){ $whereNew .= ')'; // 带_DOUBLE为需要一个多的结束括号情况 if(strpos($key, '_DOUBLE') !== false){ $whereNew .= ')'; } //取消标识符 $btwStr = 0; }else{ //where格式不为纯字符串,则按照操作符函数进行处理 if(!empty($value) && is_array($value)) { //同一个字段 多项条件组合 if(is_array($value[0])){ foreach($value as $sonv){ if($whereNew!='' && $btwStr != 1) { $whereNew .= ($sonv[2] == 'OR' || $sonv[2] == 'or') ? ' OR ' : ' AND '; } //根据value[0] 判断SQL操作符 并进行组合SQL语句 $whereNew .= $this->spilceWhere($key,$sonv); $whereFiled[] = $key; $btwStr = 0; } }else{ if($whereNew!='' && $btwStr != 1) { $whereNew .= (isset($value[2]) && ($value[2] == 'OR' || $value[2] == 'or')) ? ' OR ' : ' AND '; } //根据value[0] 判断SQL操作符 并进行组合SQL语句 $whereNew .= $this->spilceWhere($key,$value); $whereFiled[] = $key; } }else{ //首项条件 排除AND连接符 if($whereNew!='' && $btwStr != 1) { $whereNew .=' AND '; } //纯字符串格式默认为 = 操作符 $whereNew .= "`".$key."`='".$this->db->escape_string($value)."'"; $whereFiled[] = $key; } $btwStr = 0; } } } // 验证字段 if(!empty($whereFiled)){ foreach($whereFiled as $value){ if(!preg_match("/^[a-zA-Z0-9_`()]{1,30}$/",$value)){ $noFields = 1; break; } } } if(!isset($noFields)){ if($whereNew) { $whereNew = ' WHERE '.$whereNew; } $whereNew .= $groupby.$orderby.$limit; return $whereNew; }else{ $this->db->show_error(); } } function spilceWhere($daraKey,$dataV){ $Operator = array('=','>','>=','<','<=','<>','in','notin','isnull','notnull','like','findin','between','unixtime','like%','dateformat','in_s','regexp'); if(in_array($dataV[0],$Operator)){ switch($dataV[0]){ case 'notin' : $sqlString = "`$daraKey` not in (".$this->db->escape_string($dataV[1]).")"; break; case 'in' : $sqlString = "`$daraKey` in (".$dataV[1].")"; break; case 'isnull' : $sqlString = "`$daraKey` is null"; break; case 'notnull' : $sqlString = "`$daraKey` is not null"; break; case 'like' : $sqlString = "`$daraKey` LIKE ('%".$this->db->escape_string($dataV[1])."%')"; break; case 'findin' : $sqlString = "FIND_IN_SET('".$this->db->escape_string($dataV[1])."',`$daraKey`)"; break; case 'between' : $betweens = explode(',', $dataV[1]);$sqlString = "$daraKey between $betweens[0] AND $betweens[1]"; break; case 'unixtime' : $sqlString = "UNIX_TIMESTAMP(`$daraKey`) ".$this->db->escape_string($dataV[1])." '$dataV[2]'"; break; case 'like%' : $sqlString = "`$daraKey` LIKE ('".$this->db->escape_string($dataV[1])."%')"; break; case 'dateformat': $sqlString = "date_format(`$daraKey`,'".$dataV[1]."')=date_format(now(),'".$this->db->escape_string($dataV[1])."')"; break; // 字符串型的in case 'in_s' : $sqlString = "`$daraKey` in ('".$dataV[1]."')"; break; // 处理值匹配 case 'regexp' : $sqlString = "(`$daraKey` REGEXP '".$dataV[1]."')=0"; break; default : // 传入字段中包含sql函数的,两边不需要加` $keystr = !preg_match("/[)]/",$daraKey) ? "`$daraKey` " : "$daraKey "; $sqlString = $keystr.$this->db->escape_string($dataV[0])." '$dataV[1]'"; } }else{ $this->db->show_error(); } return $sqlString; } function uc_open(){ include APP_PATH.'data/api/uc/config.inc.php'; include APP_PATH.'/api/uc/include/db_mysql.class.php'; include APP_PATH.'/api/uc/uc_client/client.php'; return $ucinfo; } } ?>