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 get_table_fields($tableName) { include(CONFIG_PATH . 'db.config.php'); $mysqli = new mysqli($db_config['dbhost'], $db_config['dbuser'], $db_config['dbpass'], $db_config['dbname']); $query = $mysqli->query("SHOW COLUMNS FROM $tableName"); $tableFields = array(); while ($row = $query->fetch_assoc()) { $tableFields[] = $row['Field']; } return $tableFields; } function insert_into($table, $data = array()) { $value = array(); $this->db->connect(); include(PLUS_PATH . 'dbstruct.cache.php'); $TableFullName = $this->def . $table; $fields = $this->get_table_fields($TableFullName); if (!$fields) { return FALSE; } if (!is_array($data)) { return FALSE; } foreach ($data as $key => $v) { if (in_array($key, $fields)) { $v = $this->FilterStr($v); $value[] = "`" . $key . "`='" . $this->db->escape_string($v) . "'"; } } $value = @implode(",", $value); if (!$value) { return FALSE; } 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; $fields = $this->get_table_fields($TableFullName); if (!is_array($data) || !is_array($where)) { return FALSE; } if (!$fields) { return FALSE; } // var_dump($$TableFullName);exit(); // if (is_array($where)) { // $fields = array_keys($where); // } else { // return FALSE; // } // var_dump($fields);exit(); foreach ($data as $key => $v) { if (!in_array($key, $fields)) { continue; } 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 (!isset($$TableFullName)) { $this->error = '表结构缓存文件不存在'; return FALSE; } 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; } } ?>