<?php
|
|
/*
|
* $Author :PHPYUN开发团队
|
*
|
* 官网: http://www.phpyun.com
|
*
|
* 版权所有 2009-2021 宿迁鑫潮信息技术有限公司,并保留所有权利。
|
*
|
* 软件声明:未经授权前提下,不得用于商业运营、二次开发以及任何形式的再次发布。
|
*/
|
|
class model {
|
// 操作状态
|
const MODEL_INSERT = 1; // 插入模型数据
|
const MODEL_UPDATE = 2; // 更新模型数据
|
const MODEL_BOTH = 3; // 包含上面两种方式
|
const MUST_VALIDATE = 1; // 必须验证
|
const EXISTS_VALIDATE = 0; // 表单存在字段则验证
|
const VALUE_VALIDATE = 2; // 表单值不为空则验证
|
|
//网站配置信息
|
protected $config = NULL;
|
// 当前数据库操作对象
|
protected $db = NULL;
|
// 主键名称
|
protected $pk = 'id';
|
// 主键是否自动增长
|
protected $autoinc = FALSE;
|
// 数据表前缀
|
protected $def = NULL;
|
// 模型名称
|
protected $name = '';
|
// 数据库编码
|
protected $coding = '';
|
// 数据库名称
|
// 数据库名称
|
protected $dbName = '';
|
//数据库配置
|
protected $connection = '';
|
// 数据表名(不包含表前缀)
|
protected $tableName = '';
|
// 实际数据表名(包含表前缀)
|
protected $trueTableName = '';
|
// 最近错误信息
|
protected $error = '';
|
// 字段信息
|
protected $fields = array();
|
// 数据信息
|
protected $data = array();
|
// 查询表达式参数
|
protected $options = array();
|
protected $_validate = array(); // 自动验证定义
|
protected $_auto = array(); // 自动完成定义
|
protected $_map = array(); // 字段映射定义
|
protected $_scope = array(); // 命名范围定义
|
// 是否自动检测数据表字段信息
|
protected $autoCheckFields = TRUE;
|
// 是否批处理验证
|
protected $patchValidate = FALSE;
|
// 链操作方法列表
|
protected $methods = array('order', 'alias', 'having', 'group', 'lock', 'distinct', 'auto', 'filter', 'validate', 'result', 'token');
|
//开启分站功能的数据表
|
protected $sitetable = array('ad_order', 'admin_announcement', 'zhaopinhui', 'zhaopinhui_com', 'zhaopinhui_pic', 'news_base', 'news_content', 'resume_expect', 'member', 'company_job', 'resume', 'user_entrust', 'user_entrust_record', 'down_resume', 'look_resume', 'company', 'company_cert', 'company_msg', 'company_news', 'company_order', 'company_pay', 'company_product', 'once_job', 'resume_tiny', 'userid_msg', 'userid_job', 'look_job', 'admin_link', 'px_subject', 'px_train_news', 'px_teacher', 'lt_info', 'lt_job', 'report', 'invoice_record', 'company_statis', 'px_train', 'partjob', 'hotjob', 'px_baoming', 'px_zixun', 'company_show', 'resume_show', 'banner', 'px_banner', 'px_train_show', 'rebates', 'lt_talent', 'member_log', 'login_log', 'user_change', 'company_account');
|
|
//此数组针对insert_into方法。目的是添加附表数据的时候,不加入当前站的did,而是存member表中的did。
|
// protected $sitetadd=array('ad','admin_announcement','zhaopinhui','news_content','member','resume','company','once_job','px_train','resume_tiny','admin_link','lt_info','partjob','hotjob');
|
|
protected $admindir;
|
protected $siteadmindir;
|
|
protected $logininfo;
|
|
public function __construct($db, $def, $logininfo = array(), $tpl = '') {
|
global $coding, $config, $adminDir, $siteAdminDir;
|
|
$this->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;
|
// var_dump($$TableFullName);exit();
|
// if (is_array($where)) {
|
// $fields = array_keys($where);
|
// } else {
|
// return FALSE;
|
// }
|
// var_dump($fields);exit();
|
|
|
if (is_array($data)) {
|
|
foreach ($data as $key => $v) {
|
|
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;
|
}
|
}
|
|
?>
|