mirror of https://gitee.com/zorlan/skycaiji
190 lines
5.8 KiB
PHP
190 lines
5.8 KiB
PHP
<?php
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| SkyCaiji (蓝天采集器)
|
|
|--------------------------------------------------------------------------
|
|
| Copyright (c) 2018 https://www.skycaiji.com All rights reserved.
|
|
|--------------------------------------------------------------------------
|
|
| 使用协议 https://www.skycaiji.com/licenses
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
|
|
namespace skycaiji\admin\model;
|
|
use think\Db;
|
|
/*动态操作数据库*/
|
|
|
|
|
|
class DbCommon{
|
|
public $config=null;
|
|
public function __construct($config=array()) {
|
|
|
|
$this->config=array(
|
|
'type'=>strtolower($config['db_type']),
|
|
'database'=>$config['db_name'],
|
|
'username'=>$config['db_user'],
|
|
'password'=>$config['db_pwd'],
|
|
'hostname'=>$config['db_host'],
|
|
'hostport'=>$config['db_port'],
|
|
'charset'=>$config['db_charset'],
|
|
'prefix'=>$config['db_prefix'],
|
|
'dsn'=>$config['db_dsn'],
|
|
'resultset_type'=>'array',
|
|
'break_reconnect'=>true,
|
|
'params'=>array(),
|
|
);
|
|
if(!empty($GLOBALS['_sc']['c']['site']['dblong'])){
|
|
|
|
$this->config['params'][\PDO::ATTR_PERSISTENT]=true;
|
|
}
|
|
|
|
if(isset($config['fields_strict'])){
|
|
|
|
$this->config['fields_strict']=$config['fields_strict'];
|
|
}
|
|
|
|
if($this->config['type']=='mysqli'){
|
|
|
|
$this->config['type']='mysql';
|
|
}elseif($this->config['type']=='sqlserver'){
|
|
|
|
$this->config['type']='sqlsrv';
|
|
}
|
|
}
|
|
/**
|
|
* 获取数据库连接
|
|
* @param string $table
|
|
* @param string $force
|
|
* @param string $compatible 兼容的数据库模型
|
|
* @return \think\db\Query|NULL
|
|
*/
|
|
public function db($table='',$force=false,$compatible=false){
|
|
if(!empty($this->config)){
|
|
$config=$this->config;
|
|
if($config['type']=='oracle'){
|
|
|
|
$config['type']='\think\oracle\Connection';
|
|
}
|
|
if($compatible){
|
|
|
|
|
|
|
|
$db=Db::connect($config, $force);
|
|
}else{
|
|
$db=Db::connect($config, $force);
|
|
}
|
|
if($table){
|
|
$db=$db->name($table);
|
|
}
|
|
return $db;
|
|
}else{
|
|
return null;
|
|
}
|
|
}
|
|
/**
|
|
* 获取数据库中的所有表
|
|
*/
|
|
public function getTables(){
|
|
$list=array();
|
|
if('oracle'==$this->config['type']){
|
|
$tables=$this->db()->query("select table_name from user_tables");
|
|
if(!empty($tables)){
|
|
foreach ($tables as $table){
|
|
$list[$table['TABLE_NAME']]=$table['TABLE_NAME'];
|
|
}
|
|
}
|
|
}else{
|
|
$tables=$this->db()->getTables($this->config['database']);
|
|
if(!empty($tables)){
|
|
foreach ($tables as $table){
|
|
$list[$table]=$table;
|
|
}
|
|
}
|
|
}
|
|
return $list;
|
|
}
|
|
/*获取表的所有字段信息*/
|
|
public function getFields($tableName=''){
|
|
$tb_fields=array();
|
|
if(!empty($tableName)){
|
|
if('sqlsrv'==$this->config['type']){
|
|
|
|
list($tableName) = explode(' ', $tableName);
|
|
$tableNames = explode('.', $tableName);
|
|
$tableName = isset($tableNames[1]) ? $tableNames[1] : $tableNames[0];
|
|
|
|
$sql = "SELECT column_name, data_type, character_maximum_length, column_default, is_nullable
|
|
FROM information_schema.tables AS t
|
|
JOIN information_schema.columns AS c
|
|
ON t.table_catalog = c.table_catalog
|
|
AND t.table_schema = c.table_schema
|
|
AND t.table_name = c.table_name
|
|
WHERE t.table_name = '$tableName'";
|
|
|
|
$result = $this->db()->query($sql);
|
|
if ($result) {
|
|
foreach ($result as $key => $val) {
|
|
$val = array_change_key_case($val,CASE_LOWER);
|
|
$tb_fields[$val['column_name']] = [
|
|
'name' => $val['column_name'],
|
|
'type' => $val['data_type'].($val['character_maximum_length']?('('.$val['character_maximum_length'].')'):''),
|
|
'notnull' => ('yes' == strtolower($val['is_nullable']))?false:true,
|
|
'default' => $val['column_default'],
|
|
'primary' => false,
|
|
'autoinc' => false,
|
|
];
|
|
}
|
|
}
|
|
|
|
$sql = "SELECT column_name FROM information_schema.key_column_usage WHERE table_name='{$tableName}'";
|
|
$result = $this->db()->query($sql);
|
|
if ($result) {
|
|
foreach ($result as $key => $val) {
|
|
$tb_fields[$val['column_name']]['primary'] = true;
|
|
}
|
|
}
|
|
|
|
$sql = "SELECT column_name FROM information_schema.columns WHERE TABLE_NAME='{$tableName}' AND COLUMNPROPERTY(OBJECT_ID('{$tableName}'),COLUMN_NAME,'IsIdentity')=1";
|
|
$result = $this->db()->query($sql);
|
|
if ($result) {
|
|
foreach ($result as $key => $val) {
|
|
$tb_fields[$val['column_name']]['autoinc'] = true;
|
|
}
|
|
}
|
|
}else{
|
|
$fields=$this->db()->getFields($tableName);
|
|
if(!empty($fields)){
|
|
foreach ($fields as $k=>$v){
|
|
$tb_fields[$k]=array_change_key_case($v,CASE_LOWER);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return $tb_fields;
|
|
}
|
|
/*获取表的字段信息*/
|
|
public static function fieldsInfo($tableName){
|
|
|
|
if(empty($tableName)){
|
|
return array();
|
|
}
|
|
$tableName = '`'.$tableName.'`';
|
|
$tbFields=db()->query('SHOW COLUMNS FROM '.$tableName);
|
|
$fields=array();
|
|
if(!empty($tbFields)){
|
|
foreach ($tbFields as $tbField){
|
|
$tbField=array_change_key_case($tbField,CASE_LOWER);
|
|
$fields[$tbField['field']]=array(
|
|
'name' => $tbField['field'],
|
|
'type' => $tbField['type'],
|
|
'notnull' => (strtolower($tbField['null']) == 'yes')?false:true,
|
|
'default' => $tbField['default'],
|
|
'primary' => (strtolower($tbField['key']) == 'pri'),
|
|
'autoinc' => (strtolower($tbField['extra']) == 'auto_increment'),
|
|
);
|
|
}
|
|
}
|
|
return $fields;
|
|
}
|
|
}
|
|
|
|
?>
|