// +---------------------------------------------------------------------- namespace think\db; use PDO; use think\Container; use think\Db; use think\db\Connection as BaseConnection; use think\db\exception\BindParamException; use think\db\exception\DataNotFoundException; use think\db\exception\ModelNotFoundException; use think\db\Query; use think\exception\DbException; use think\exception\PDOException; use think\Model; /** * Oracle数据库驱动 */ class W7Connection extends BaseConnection { protected $builderClassName = '\\think\\db\\Builder'; /** * 解析pdo连接的dsn信息 * @access protected * @param array $config 连接信息 * @return string */ protected function parseDsn($config) { $dsn = 'oci:dbname='; if (!empty($config['hostname'])) { // Oracle Instant Client $dsn .= '//' . $config['hostname'] . ($config['hostport'] ? ':' . $config['hostport'] : '') . '/'; } $dsn .= $config['database']; if (!empty($config['charset'])) { $dsn .= ';charset=' . $config['charset']; } return $dsn; } /** * 取得数据表的字段信息 * @access public * @param string $tableName * @return array */ public function getFields($tableName) { $this->initConnect(true); list($tableName) = explode(' ', $tableName); $sql = "select a.column_name,data_type,DECODE (nullable, 'Y', 0, 1) notnull,data_default, DECODE (A .column_name,b.column_name,1,0) pk from all_tab_columns a,(select column_name from all_constraints c, all_cons_columns col where c.constraint_name = col.constraint_name and c.constraint_type = 'P' and c.table_name = '" . strtoupper($tableName) . "' ) b where table_name = '" . strtoupper($tableName) . "' and a.column_name = b.column_name (+)"; $pdo = $this->linkID->query($sql); $result = $pdo->fetchAll(PDO::FETCH_ASSOC); $info = []; if ($result) { foreach ($result as $key => $val) { $val = array_change_key_case($val); $info[$val['column_name']] = [ 'name' => $val['column_name'], 'type' => $val['data_type'], 'notnull' => $val['notnull'], 'default' => $val['data_default'], 'primary' => $val['pk'], 'autoinc' => $val['pk'], ]; } } return $this->fieldCase($info); } /** * 取得数据库的表信息(暂时实现取得用户表信息) * @access public * @param string $dbName * @return array */ public function getTables($dbName = '') { $pdo = $this->linkID->query("select table_name from all_tables"); $result = $pdo->fetchAll(PDO::FETCH_ASSOC); $info = []; foreach ($result as $key => $val) { $info[$key] = current($val); } return $info; } /** * 获取最近插入的ID * @access public * @param string $sequence 自增序列名 * @return string */ public function getLastInsID($sequence = null) { return ''; if(!$sequence){ return ''; } $pdo = $this->linkID->query("select {$sequence}.currval as id from dual"); $result = $pdo->fetchColumn(); return $result; } /** * SQL性能分析 * @access protected * @param string $sql * @return array */ protected function getExplain($sql) { return []; } protected function supportSavepoint() { return true; } /** * 插入记录 * @access public * @param Query $query 查询对象 * @param boolean $replace 是否replace * @param boolean $getLastInsID 返回自增主键 * @param string $sequence 自增序列名 * @return integer|string */ public function insert(Query $query, $replace = false, $getLastInsID = false, $sequence = null) { // 分析查询表达式 $options = $query->getOptions(); // 生成SQL语句 $sql = $this->builder->insert($query, $replace); $bind = $query->getBind(); if (!empty($options['fetch_sql'])) { // 获取实际执行的SQL语句 return $this->getRealSql($sql, $bind); } // 执行操作 $result = '' == $sql ? 0 : $this->execute($sql, $bind, $query); if ($result) { $sequence = $sequence ?: (isset($options['sequence']) ? $options['sequence'] : 'SEQ_'.$options['table']); $lastInsId = $this->getLastInsID($sequence); $data = $options['data']; if ($lastInsId) { $pk = $query->getPk($options); if (is_string($pk)) { $data[$pk] = $lastInsId; } } $query->setOption('data', $data); $query->trigger('after_insert'); if ($getLastInsID) { return $lastInsId; } } return $result; } /** * 得到某个列的数组 * @access public * @param Query $query 查询对象 * @param string $field 字段名 多个字段用逗号分隔 * @param string $key 索引 * @return array */ public function column(Query $query, $field, $key = '') { $options = $query->getOptions(); if (isset($options['field'])) { $query->removeOption('field'); } if (is_null($field)) { $field = ['*']; } elseif (is_string($field)) { $field = array_map('trim', explode(',', $field)); } if ($key && ['*'] != $field) { array_unshift($field, $key); $field = array_unique($field); } $query->setOption('field', $field); if (empty($options['fetch_sql']) && !empty($options['cache'])) { // 判断查询缓存 $cache = $options['cache']; $result = $this->getCacheData($query, $cache, null, $guid); if (false !== $result) { return $result; } } // 生成查询SQL $sql = $this->builder->select($query); // 还原field参数 if (isset($options['field'])) { $query->setOption('field', $options['field']); } else { $query->removeOption('field'); } $bind = $query->getBind(); if (!empty($options['fetch_sql'])) { // 获取实际执行的SQL语句 return $this->getRealSql($sql, $bind); } // 执行查询操作 $pdo = $this->query($sql, $bind, $options['master'], true); if (1 == $pdo->columnCount()) { $result = $pdo->fetchAll(PDO::FETCH_COLUMN); } else { $resultSet = $pdo->fetchAll(PDO::FETCH_ASSOC); if (['*'] == $field && $key) { $result = array_column($resultSet, null, $key); } elseif ($resultSet) { $fields = array_keys($resultSet[0]); $count = count($fields); $key1 = array_shift($fields); $key2 = $fields ? array_shift($fields) : ''; $key = $key ?: $key1; if (strpos($key, '.')) { list($alias, $key) = explode('.', $key); } if (2 == $count) { $column = $key2; } elseif (1 == $count) { $column = $key1; } else { $column = null; } $result = array_column($resultSet, $column, $key); } else { $result = []; } } $result = $this->formatColumnFieldType($field, $result); $result = $this->formatColumnField($field, $result); $result = $this->formatFieldUpper($result, $field); if (isset($cache) && isset($guid)) { // 缓存数据 $this->cacheData($guid, $result, $cache); } return $result; } /** * 查找记录 * @access public * @param Query $query 查询对象 * @return array|\PDOStatement|string * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException */ public function select(Query $query) { // 分析查询表达式 $options = $query->getOptions(); if (empty($options['fetch_sql']) && !empty($options['cache'])) { $resultSet = $this->getCacheData($query, $options['cache'], null, $key); if (false !== $resultSet) { return $resultSet; } } // 生成查询SQL $sql = $this->builder->select($query); $query->removeOption('limit'); $bind = $query->getBind(); if (!empty($options['fetch_sql'])) { // 获取实际执行的SQL语句 return $this->getRealSql($sql, $bind); } $resultSet = $query->trigger('before_select'); if (!$resultSet) { // 执行查询操作 $resultSet = $this->query($sql, $bind, $options['master'], $options['fetch_pdo']); if ($resultSet instanceof \PDOStatement) { // 返回PDOStatement对象 return $resultSet; } } $resultSet = $this->formatFieldUpper($resultSet, $options['field']); $resultSet = $this->formatColumnFieldType($options['field'], $resultSet); if (!empty($options['cache']) && false !== $resultSet) { // 缓存数据集 $this->cacheData($key, $resultSet, $options['cache']); } return $resultSet; } /** * 执行查询 返回数据集 * @access public * @param string $sql sql指令 * @param array $bind 参数绑定 * @param bool $master 是否在主服务器读操作 * @param bool $pdo 是否返回PDO对象 * @return array * @throws BindParamException * @throws \PDOException * @throws \Exception * @throws \Throwable */ public function query($sql, $bind = [], $master = false, $pdo = false) { $this->initConnect($master); if (!$this->linkID) { return false; } // 记录SQL语句 $this->queryStr = $sql; $this->bind = $bind; Db::$queryTimes++; try { // 调试开始 $this->debug(true); // 预处理 $this->PDOStatement = $this->linkID->prepare($sql); // 是否为存储过程调用 $procedure = in_array(strtolower(substr(trim($sql), 0, 4)), ['call', 'exec']); // 参数绑定 if ($procedure) { $this->bindParam($bind); } else { $this->bindValue($bind); } // 执行查询 $this->PDOStatement->execute(); // 调试结束 $this->debug(false, '', $master); // 返回结果集 return $this->getResult($pdo, $procedure); } catch (\PDOException $e) { if ($this->isBreak($e)) { return $this->close()->query($sql, $bind, $master, $pdo); } throw new PDOException($e, $this->config, $this->getLastsql()); } catch (\Throwable $e) { if ($this->isBreak($e)) { return $this->close()->query($sql, $bind, $master, $pdo); } throw $e; } catch (\Exception $e) { if ($this->isBreak($e)) { return $this->close()->query($sql, $bind, $master, $pdo); } throw $e; } } /** * 查找单条记录 * @access public * @param Query $query 查询对象 * @return array|null|\PDOStatement|string * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException */ public function find(Query $query) { // 分析查询表达式 $options = $query->getOptions(); $pk = $query->getPk($options); $data = $options['data']; $query->setOption('limit', 1); if (empty($options['fetch_sql']) && !empty($options['cache'])) { // 判断查询缓存 $cache = $options['cache']; if (is_string($cache['key'])) { $key = $cache['key']; } else { $key = $this->getCacheKey($query, $data); } $result = Container::get('cache')->get($key); if (false !== $result) { return $result; } } if (is_string($pk) && !is_array($data)) { if (isset($key) && strpos($key, '|')) { list($a, $val) = explode('|', $key); $item[$pk] = $val; } else { $item[$pk] = $data; } $data = $item; } $query->setOption('data', $data); // 生成查询SQL $sql = $this->builder->select($query); $query->removeOption('limit'); $bind = $query->getBind(); if (!empty($options['fetch_sql'])) { // 获取实际执行的SQL语句 return $this->getRealSql($sql, $bind); } // 事件回调 $result = $query->trigger('before_find'); if (!$result) { // 执行查询 $resultSet = $this->query($sql, $bind, $options['master'], $options['fetch_pdo']); if ($resultSet instanceof \PDOStatement) { // 返回PDOStatement对象 return $resultSet; } $result = isset($resultSet[0]) ? $resultSet[0] : null; } if (isset($cache) && $result) { // 缓存数据 $this->cacheData($key, $result, $cache); } return $this->formatFieldUpper($result, $options['field']); // return $result; } /** * 数据number类型转换 * @param $column_field * @param $column * @return array|mixed */ protected function formatColumnFieldType($column_field, $column) { // number类型字段配置 $fields = [ 'CSDD_DDZT' => 'integer', 'CSDDCS_DCSL' => 'integer', 'DDDM_PDM' => 'integer', 'DDDM_DM' => 'integer', 'DDDM_LX' => 'integer', 'LJTDD_DDZT' => 'integer', 'SYZYDD_DDZT' => 'integer', 'XDDD_DDZT' => 'integer', 'XDMS_DM' => 'integer', 'XDZL_DM' => 'integer', 'YDJL_LX' => 'integer', 'YDXX_YDLX' => 'integer', 'YDXX_YDZT' => 'integer', 'YJDDD_DDZT' => 'integer', 'YPYSDD_DDZT' => 'integer', 'MZXX_HY' => 'integer', 'QYXX_YXBS' => 'integer', 'SYXX_ZT' => 'integer', 'SYXX_RYLX' => 'integer', 'SYXX_YXBS' => 'integer', 'CSLB_CSSJSJ' => 'integer', 'CSLB_CSSJZT' => 'integer', 'CSLB_LXJGSJ' => 'integer', 'CSLB_CJ' => 'integer', 'CSLB_PX' => 'integer', 'CSSJCS_SJXX' => 'integer', 'CSSJCS_SJSX' => 'integer', 'CSSJCS_SFXS' => 'integer', 'CSSJCS_PX' => 'integer', 'HKSJ_CSSJ' => 'integer', 'HKSJ_SJZT' => 'integer', 'HSJJD_HSRS' => 'integer', 'HSJJD_ZT' => 'integer', 'HSJJD_YXBS' => 'integer', 'JCBG_ZT' => 'integer', 'JCBG_YYX' => 'integer', 'JCBG_YXBS' => 'integer', 'JCBW_SXH' => 'integer', 'JCBW_ZT' => 'integer', 'JCBW_YXBS' => 'integer', 'JCMB_YXBS' => 'integer', 'JCMB_SXH' => 'integer', 'JCMB_MBLX' => 'integer', 'JCMBBW_SXH' => 'integer', 'JCXM_YXBS' => 'integer', 'JCXX_SFJJ' => 'integer', 'JCXX_ZT' => 'integer', 'JCXX_YXBS' => 'integer', 'JCXXXQ_YXBS' => 'integer', 'SRXX_SFJJ' => 'integer', 'SRXX_ZT' => 'integer', 'JYXM_ZBLX' => 'integer', 'JYXM_LX' => 'integer', 'JYXMMX_ZBLX' => 'integer', 'JYXX_YXBS' => 'integer', 'JYXXMX_TCLX' => 'integer', 'JYXXMX_JJ' => 'integer', 'JYXXMX_CQ' => 'integer', 'JYXXMX_ZT' => 'integer', 'JYXXMX_YXBS' => 'integer', 'JYYQ_ZT' => 'integer', 'JYYQ_LX' => 'integer', 'JYZB_PX' => 'integer', 'JYZB_LX' => 'integer', 'TBJL_LX' => 'integer', 'TC_LX' => 'integer', 'TC_ZT' => 'integer', 'TC_PX' => 'integer', 'TXM_ZT' => 'integer', 'MZJBXX_HY' => 'integer', 'MZJBXX_ZT' => 'integer', 'MZJBXX_YSBS' => 'integer', 'SPXX_DRLY' => 'integer', 'SPXX_RYLB' => 'integer', 'SPXX_DQJGLX' => 'integer', 'MZQYY_YXBS' => 'integer', 'MZSJL_YXBS' => 'integer', 'SHZD_YXBS' => 'integer', 'SQZD_YXBS' => 'integer', 'SSMC_SXH' => 'integer', 'SSMC_YXBS' => 'integer', 'SSMCYY_SSYY' => 'integer', 'SSMCYY_YXBS' => 'integer', 'SSQX_ZT' => 'integer', 'SSS_KKZSS' => 'integer', 'SSS_YKZSS' => 'integer', 'SSS_YXBS' => 'integer', 'SSXQ_YXBS' => 'integer', 'SSXQ_XXZT' => 'integer', 'id' => 'integer', 'TWMB_SBHTS' => 'integer', 'XXTZ_JGID' => 'integer', 'XXTZ_ZT' => 'integer', 'XXTZ_JJCD' => 'integer', 'KFXX_ZSKF' => 'integer', 'KFXX_ZT' => 'integer', 'WZCK_YXBS' => 'integer', 'WZCKMX_BZWZ' => 'integer', 'WZCKMX_WZCKSL' => 'integer', 'WZCKMX_YXBS' => 'integer', 'WZKC_BZWZ' => 'integer', 'WZKC_KCSL' => 'integer', 'WZKC_YXBS' => 'integer', 'WZPD_YXBS' => 'integer', 'WZPDMX_PDQSL' => 'integer', 'WZPDMX_PDHSL' => 'integer', 'WZPDMX_YXBS' => 'integer', 'WZRK_YXBS' => 'integer', 'WZRKMX_BZWZ' => 'integer', 'WZRKMX_WZRKSL' => 'integer', 'WZRKMX_YXBS' => 'integer', 'WZZD_BZWZ' => 'integer', 'WZZD_YXBS' => 'integer', 'BCXX_SXH' => 'integer', 'BCXX_ZT' => 'integer', 'BCXX_YXBS' => 'integer', 'BFXX_SXH' => 'integer', 'BFXX_YXBS' => 'integer', 'BISBJL_SBJGID' => 'integer', 'CSXX_SL' => 'integer', 'CSXX_ZT' => 'integer', 'CYXX_ZT' => 'integer', 'CYXX_YXBS' => 'integer', 'GDXX_ZT' => 'integer', 'GDXX_YXBS' => 'integer', 'HSXX_QZHS' => 'integer', 'HSXX_ZT' => 'integer', 'HSXX_YXBS' => 'integer', 'JGSJDW_ZT' => 'integer', 'JGXX_PZ_ZLK' => 'integer', 'JGXX_PZ_SYLBSXSJ' => 'integer', 'JGXX_ZT' => 'integer', 'JGXX_SFCSH' => 'integer', 'JGXX_JGMS' => 'integer', 'LSBL_YXBS' => 'integer', 'RWLX_SXH' => 'integer', 'SBQCZ_YXBS' => 'integer', 'SBQZD_LX' => 'integer', 'SBQZD_YXBS' => 'integer', 'SHXX_LX' => 'integer', 'SHXX_ZT' => 'integer', 'SHXX_YXBS' => 'integer', 'SJSBDZ_ZT' => 'integer', 'SJSBJL_LX' => 'integer', 'SPXX_YXBS' => 'integer', 'SSXX_ZT' => 'integer', 'SSXX_YXBS' => 'integer', 'SSXXXQ_YXBS' => 'integer', 'SSYYXQ_SSYL' => 'integer', 'SWXX_ZT' => 'integer', 'SWXX_YXBS' => 'integer', 'SYJBXX_DRLY' => 'integer', 'SYZLXX_RYLB' => 'integer', 'SYZLXX_DQJGLX' => 'integer', 'SYZLXX_YXBS' => 'integer', 'WQFDRWMB_XXL' => 'integer', 'WQFDRWMB_CBL' => 'integer', 'WQFDXX_YXBS' => 'integer', 'WQJSFA_XXL' => 'integer', 'WQJSFA_CBL' => 'integer', 'WQJSFA_SXH' => 'integer', 'WQJSXX_YXJ' => 'integer', 'WQJSXX_SXH' => 'integer', 'WQJSXX_YXBS' => 'integer', 'WQJSYPMB_BZYL' => 'integer', 'WQRWXX_LX' => 'integer', 'WQRWXX_LB' => 'integer', 'WQYPFA_BZYL' => 'integer', 'WQYPFA_SXH' => 'integer', 'YFXX_ZSYF' => 'integer', 'YFXX_ZT' => 'integer', 'YGXX_ID' => 'integer', 'YGXX_LX' => 'integer', 'YGXX_JSXH' => 'integer', 'YGXX_YXBS' => 'integer', 'YGXX_JCYG' => 'integer', 'YJDXX_SL' => 'integer', 'YJDXX_ZT' => 'integer', 'ZSXX_LX' => 'integer', 'ZSXX_ZT' => 'integer', 'ZSXX_CZ' => 'integer', 'ZSXX_PZ' => 'integer', 'ZSXX_PX' => 'integer', 'JSKCBZ_ZT' => 'integer', 'JSRKXQ_XXL' => 'integer', 'JSRKXQ_CBL' => 'integer', 'JSRKYPXQ_RKSL' => 'integer', 'JSSQXQ_XXL' => 'integer', 'JSSQXQ_CBL' => 'integer', 'JSSQYPXQ_RKSL' => 'integer', 'RKJL_HSXS' => 'integer', 'RKJL_RKSL' => 'integer', 'YPCK_ZT' => 'integer', 'YPCK_YXBS' => 'integer', 'YPCKMX_YPHSXS' => 'integer', 'YPCKMX_YPCKDWLX' => 'integer', 'YPCKMX_YPDCKSL' => 'integer', 'YPCKMX_YPCKSL' => 'integer', 'YPCKMX_YXBS' => 'integer', 'YPFF_YXBS' => 'integer', 'YPFFMX_YPHSXS' => 'integer', 'YPFFMX_YPFFDWLX' => 'integer', 'YPFFMX_YPFFSL' => 'integer', 'YPFFMX_YXBS' => 'integer', 'YPJSCK_YXBS' => 'integer', 'YPJSCKMX_JSCKSL' => 'integer', 'YPJSCKMX_YXBS' => 'integer', 'YPJSPD_YXBS' => 'integer', 'YPJSPDMX_PDQSL' => 'integer', 'YPJSPDMX_PDHSL' => 'integer', 'YPJSPDMX_YXBS' => 'integer', 'YPKC_DMYP' => 'integer', 'YPKC_HSXS' => 'integer', 'YPKC_KCSL' => 'integer', 'YPKC_YJZSX' => 'integer', 'YPKC_YJZXX' => 'integer', 'YPKC_KCLX' => 'integer', 'YPKC_YXBS' => 'integer', 'YPPD_YXBS' => 'integer', 'YPPDMX_PDQSL' => 'integer', 'YPPDMX_PDHSL' => 'integer', 'YPPDMX_YXBS' => 'integer', 'YPQL_ZT' => 'integer', 'YPQL_YXBS' => 'integer', 'YPQL_DDZT' => 'integer', 'YPQLMX_YPHSXS' => 'integer', 'YPQLMX_YPQLDWLX' => 'integer', 'YPQLMX_YPQLSL' => 'integer', 'YPQLMX_YPCKSL' => 'integer', 'YPQLMX_YPHYSL' => 'integer', 'YPQLMX_YXBS' => 'integer', 'YPRK_YXBS' => 'integer', 'YPRKMX_YPHSXS' => 'integer', 'YPRKMX_YPRKDWLX' => 'integer', 'YPRKMX_YPRKSL' => 'integer', 'YPRKMX_YXBS' => 'integer', 'YPSJSQ_LX' => 'integer', 'YPSJSQ_YXBS' => 'integer', 'YPSJSQMX_YPHSXS' => 'integer', 'YPSJSQMX_YPSJSQDWLX' => 'integer', 'YPSJSQMX_YPSJSQSL' => 'integer', 'YPSJSQMX_YXBS' => 'integer', 'YPZD_JSYC' => 'integer', 'YPZD_DMYP' => 'integer', 'YPZD_XY' => 'integer', 'YPZD_HSXS' => 'integer', 'YPZD_ZT' => 'integer', 'YPZD_PXH' => 'integer', 'YZXX_LB' => 'integer', 'YZXX_LX' => 'integer', 'YZXX_YL' => 'integer', 'YZXX_TS' => 'integer', 'YZXX_ZT' => 'integer', 'YZXX_YXBS' => 'integer', 'ZXJL_YXBS' => 'integer', 'BB_YXBS' => 'integer', 'BB_SXH' => 'integer', 'CSBW_YXBS' => 'integer', 'CSBW_SXH' => 'integer', 'CSZL_SXH' => 'integer', 'CSZL_ZT' => 'integer', 'CSZL_YXBS' => 'integer', 'CZFS_YXBS' => 'integer', 'CZFS_SXH' => 'integer', 'FSDD_YXBS' => 'integer', 'FSDD_SXH' => 'integer', 'FYXXLX_YXBS' => 'integer', 'FYXXLX_SXH' => 'integer', 'GMS_SXH' => 'integer', 'GMS_YXBS' => 'integer', 'HLXM_YXBS' => 'integer', 'HLXM_SXH' => 'integer', 'HSDD_YXBS' => 'integer', 'HSDD_SXH' => 'integer', 'HSGJ_YXBS' => 'integer', 'HSGJ_SXH' => 'integer', 'HSJPXYQ_YXBS' => 'integer', 'HSJPXYQ_SXH' => 'integer', 'HSTW_YXBS' => 'integer', 'HSTW_SXH' => 'integer', 'HSZT_YXBS' => 'integer', 'HSZT_SXH' => 'integer', 'HY_YHYS' => 'integer', 'HY_SXH' => 'integer', 'JJSS_YXBS' => 'integer', 'JJSS_SXH' => 'integer', 'JJYP_YXBS' => 'integer', 'JJYP_SXH' => 'integer', 'JWS_SXH' => 'integer', 'JWS_YXBS' => 'integer', 'JX_YXBS' => 'integer', 'JX_SXH' => 'integer', 'JY_SXH' => 'integer', 'JY_YJY' => 'integer', 'JZ_YXBS' => 'integer', 'JZ_SXH' => 'integer', 'JZCZ_YXBS' => 'integer', 'JZCZ_SXH' => 'integer', 'JZS_SXH' => 'integer', 'JZS_YXBS' => 'integer', 'JZYCZ_YXBS' => 'integer', 'JZYCZ_SXH' => 'integer', 'MZ_YXBS' => 'integer', 'MZ_SXH' => 'integer', 'MZBFZ_SXH' => 'integer', 'MZBFZ_YXBS' => 'integer', 'MZFF_YXBS' => 'integer', 'MZFF_SXH' => 'integer', 'QJFS_YXBS' => 'integer', 'QJFS_SXH' => 'integer', 'RYLB_YXBS' => 'integer', 'RYLB_SXH' => 'integer', 'RYZD_YXBS' => 'integer', 'RYZD_SXH' => 'integer', 'SB_YXBS' => 'integer', 'SB_SXH' => 'integer', 'SBQCZ_SXH' => 'integer', 'SHHM_YXBS' => 'integer', 'SHHM_SXH' => 'integer', 'SHLB_YXBS' => 'integer', 'SHLB_SXH' => 'integer', 'SQLB_YXBS' => 'integer', 'SQLB_SXH' => 'integer', 'SS_YXBS' => 'integer', 'SS_SXH' => 'integer', 'SSZL_YXBS' => 'integer', 'SSZL_SXH' => 'integer', 'SZ_YXBS' => 'integer', 'SZ_SXH' => 'integer', 'SZSJ_SXH' => 'integer', 'SZSJ_YSZSJ' => 'integer', 'TZ_SXH' => 'integer', 'TZFX_YXBS' => 'integer', 'TZFX_SXH' => 'integer', 'TZHLYQ_SXH' => 'integer', 'TZHLYQ_YXBS' => 'integer', 'TZZD_YXBS' => 'integer', 'WZCKFS_YXBS' => 'integer', 'WZCKFS_SXH' => 'integer', 'XB_YXBS' => 'integer', 'XB_SXH' => 'integer', 'XBS_SXH' => 'integer', 'XBS_YXBS' => 'integer', 'XKDJ_YXBS' => 'integer', 'XKDJ_SXH' => 'integer', 'XKYY_YXBS' => 'integer', 'XKYY_SXH' => 'integer', 'XX_YXBS' => 'integer', 'XX_SXH' => 'integer', 'XXQW_YXBS' => 'integer', 'XXQW_SXH' => 'integer', 'YJCZ_YXBS' => 'integer', 'YJCZ_SXH' => 'integer', 'YJS_SXH' => 'integer', 'YJS_YXBS' => 'integer', 'YPBM_YXBS' => 'integer', 'YPCKFS_YXBS' => 'integer', 'YPCKFS_SXH' => 'integer', 'YPDS_SXH' => 'integer', 'YPDS_ZT' => 'integer', 'YPDS_YXBS' => 'integer', 'YPDW_ZT' => 'integer', 'YPDW_YXBS' => 'integer', 'YPJX_ZT' => 'integer', 'YPJX_YXBS' => 'integer', 'YPLB_SXH' => 'integer', 'YPLB_ZT' => 'integer', 'YPLB_YXBS' => 'integer', 'YPLX_SXH' => 'integer', 'YPLX_ZT' => 'integer', 'YPLX_YXBS' => 'integer', 'YPPL_SXH' => 'integer', 'YPPL_ZT' => 'integer', 'YPPL_YXBS' => 'integer', 'YPRKFS_YXBS' => 'integer', 'YPRKFS_SXH' => 'integer', 'YPSQZT_YXBS' => 'integer', 'YPSQZT_SXH' => 'integer', 'YPYF_SXH' => 'integer', 'YPYF_ZT' => 'integer', 'YPYF_YXBS' => 'integer', 'YXCL_YXBS' => 'integer', 'YXCL_SXH' => 'integer', 'YYTJ_YXBS' => 'integer', 'YYTJ_SXH' => 'integer', 'YZTC_YXBS' => 'integer', 'YZTC_SXH' => 'integer', 'YZTCXQ_LX' => 'integer', 'YZTCXQ_YL' => 'integer', 'YZTCXQ_SXH' => 'integer', 'YZTCXQ_YXBS' => 'integer', 'ZD_YXBS' => 'integer', 'ZD_KYXG' => 'integer', 'ZD_SXH' => 'integer', 'ZDMC_SXH' => 'integer', 'ZDMC_YZDMC' => 'integer', 'ZJLX_YXBS' => 'integer', 'ZJLX_SXH' => 'integer', 'ZS_SXH' => 'integer', 'ZS_YXBS' => 'integer', 'ZSBFZ_YXBS' => 'integer', 'ZSBFZ_SXH' => 'integer', 'ZSLB_YXBS' => 'integer', 'ZSLB_SXH' => 'integer', 'ZSSX_YXBS' => 'integer', 'ZSSX_SXH' => 'integer', 'ZSXHLX_YXBS' => 'integer', 'ZSXHLX_SXH' => 'integer', 'ZW_YXBS' => 'integer', 'ZW_SXH' => 'integer', 'ZGZD_YXBS' => 'integer', 'CDXX_PID' => 'integer', 'CDXX_LX' => 'integer', 'CDXX_PX' => 'integer', 'CDXX_ZT' => 'integer', 'JSZ_PID' => 'integer', 'JSZ_ID' => 'integer', 'JSZ_PX' => 'integer', 'ZH_CJGLY' => 'integer', 'ZHJSGL_ZHID' => 'integer', 'ZHJSGL_JSID' => 'integer', 'JQR_CLCS' => 'integer', 'ZNYG_LX' => 'integer', 'SYZZ_ZT' => 'integer', 'SYZZ_DDZT' => 'integer', ]; // 特殊处理带有as别名的类型转换 if($column_field !== '*'){ foreach ($column_field as $key => $field){ if(!is_string($field)){ continue; } if(strpos(strtolower($field), 'count(') !== false){ $fields[$field] = 'integer'; } if(is_int($key) && strpos($field, 'as') !== false){ $field_arr = explode('as', $field); $old_name = trim($field_arr[0]); $new_name = trim($field_arr[1]); } else { $old_name = $key; $new_name = $field; } if(array_key_exists($old_name, $fields)){ $fields[$new_name] = 'integer'; } } } // 处理类型转换 foreach ($column as $key => $val){ if(is_array($val)){ foreach ($val as $field => $v){ if(array_key_exists($field, $fields)){ $column[$key][$field] = (int) $v; } } } } return $column; } /** * 数据别名大写转换 * @param $list * @param $fields * @return mixed */ protected function formatFieldUpper($list, $fields) { if(!$list){ return $list; } if(!$fields || $fields === '*'){ return $list; } // 存在别名 $field_arr = []; foreach ($fields as $key => $field){ if(!is_string($field)){ continue; } if(is_int($key) && strpos($field, 'as') !== false){ $field_arr[] = trim(explode('as', $field)[1]); } else { $field_arr[] = $field; } } if(!$field_arr){ return $list; } // 别名大写转换(添加小写元素,unset大写元素) if (count($list) !== count($list, COUNT_RECURSIVE)) { // 二维数组数据 foreach ($list as $key => $item) { foreach ($item as $field => $val){ $lo_field = strtolower($field); if(in_array($lo_field, $field_arr)){ $list[$key][$lo_field] = $val; unset($list[$key][$field]); } } } } else { // 一维数组数据 foreach ($list as $field => $val){ $lo_field = strtolower($field); if(in_array($lo_field, $field_arr)){ $list[$lo_field] = $val; unset($list[$field]); } } } return $list; } /** * column方法单个字段和2个字段特殊处理 * @param $fields * @param $result * @return array */ public function formatColumnField($fields, $result) { $count = count($fields); if($count === 1){ return array_keys($result); } elseif ($count === 2){ foreach ($result as $field => &$val){ if(strpos($fields[1], 'as') !== false){ $k = strtoupper(trim(explode('as', $fields[1])[1])); $val = $val[$k]; } else { $val = $val[$fields[1]]; } } unset($val); return $result; } return $result; } }