tv/include/db.class.php
2025-11-28 14:28:58 +08:00

801 lines
24 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*
* FileMySQL数据库操作类
* Author易如意
* QQ51154393
* Urlwww.eruyi.cn
*/
require_once 'db.config.php';
class Db{
//1.私有的静态属性
private static $link;
private $table_name;
private $objdb;
private $options;
private function __construct() {
if (!$this->objdb = @mysqli_connect(DB_HOST, DB_USER, DB_PASSWD)) {
switch ($this->geterrno()) {
case 2005:
exit("连接数据库失败,数据库地址错误或者数据库服务器不可用");
break;
case 2003:
exit("连接数据库失败,数据库端口错误");
break;
case 2006:
exit("连接数据库失败,数据库服务器不可用");
break;
case 1045:
exit("连接数据库失败,数据库用户名或密码错误");
break;
default :
exit("连接数据库失败,请检查数据库信息。错误编号:" . $this->geterrno());
break;
}
}
if ($this->getMysqlVersion() > '4.1') {
mysqli_query($this->objdb,"SET NAMES 'utf8'");
}
@mysqli_select_db($this->objdb,DB_NAME) OR exit("连接数据库失败,未找到您填写的数据库");
}
//静态公共接口
public static function getInstance(){
if(!(self::$link instanceof self)){
self::$link = new self();
}
return self::$link;
}
/**
* 获取mysql错误
*/
function geterror() {
return mysqli_error($this->objdb);
}
/**
* 取得数据库版本信息
*/
function getMysqlVersion() {
return mysqli_get_server_info($this->objdb);
}
/**
* 获取mysql错误编码
*/
function geterrno() {
return mysqli_connect_errno($this->objdb);
}
//返回数据库实例对象
public static function table($table_name,$val=FALSE){
$link = self::getInstance();
if(!defined('DB_PRE') or DB_PRE == ''){
if($val){
$link->table_name = "`$table_name` $val";
}else{
$link->table_name = "`$table_name`";
}
}else{
if($val){
$link->table_name = "`".DB_PRE."$table_name` $val";
}else{
$link->table_name = "`".DB_PRE."$table_name`";
}
}
return $link;
}
//field:格式->('id,name,time......')
public function field($field){
$this->options['field'] = $field;
return $this;
}
//处理field数据组sql
public function deal_field($field){
$field = $field['field'];
return $field;
}
//设置where条件(数组和多个where都可以)where('id',12) 或者 where([id=>12])
public function where($key,$factor=null,$val=null){
if($key != null && $factor != null && is_array($val)){//属于三者都有的情况,中间的参数就是条件
if(is_string($key) && is_string($factor)){
$v_str = "`$key` $factor ";
}else{
die("failed: ".'不合法');
}
$count_val = count($val);
$nums = 1;
$str = '';
foreach($val as $k=>$v){
if($count_val == $nums){
$str .= "'$v'";
}else{
$str .= "'$v'".' '.'and'.' ';
}
$nums++;
}
$nums = 1;
$v_str = $v_str.$str;
}elseif($key != null && $factor != null && $val != null && !is_array($val)){
$v = (string)$val;
if(is_string($key) && is_string($factor) && is_string($v)){
if($factor == 'in'){
$v_str = "$key $factor $val";
}else{
$v_str = "$key $factor '$val'";
}
}elseif(is_array($key) && is_string($factor) && is_string($val)){
$count_key = count($key);
$nums = 1;
$str = '';
foreach($key as $k=>$v){
if($count_key == $nums){
$str .= "$k ='$v'";
}else{
$str .= "$k ='$v'".' '.'and'.' ';
}
$nums++;
}
$nums = 1;
$v_str = $factor.$str.$val;
}else{
die("failed: ".'不合法');
}
}else{//两个或者一个参数的情况
$v = (string)$val;
$val = (string)$factor;//此种情况将第二参数传给第三个参数
if(is_string($key) && !is_array($key)){//为字符串
$v_str = "$key = '$val'";
}else if(is_array($key)){
$count_key = count($key);
$nums = 1;
$str = '';
foreach($key as $k=>$v){
if($count_key == $nums){
$str .= "$k ='$v'";
}else{
$str .= "$k ='$v'".' '.'and'.' ';
}
$nums++;
}
$nums = 1;
$v_str = $str;
}else{
die("failed: ".'不合法');
}
}
$this->options['where'][] = $v_str;
return $this;
}
//处理where数据组sql
public function deal_where($where){
$arr = $where['where'];
$count_key = count($arr);
$nums = 1;
$str = '';
foreach($arr as $key=>$val){
if($count_key == $nums){
$str .= $val;
}else{
$str .= $val.' '.'and'.' ';
}
$nums++;
}
$nums = 1;
return 'where '.$str;
}
//设置orwhere条件(数组和多个where都可以)where('id',12) 或者 where([id=>12])
public function whereOr($key,$factor='',$val=''){
$v = (string)$val;
if($key != '' && $factor != '' && $v != ''){//属于三者都有的情况,中间的参数就是条件
if(is_string($key) && is_string($factor) && is_string($v)){
$v_str = "$key $factor '$val'";
}elseif(is_array($key) && is_string($factor) && is_string($v)){
$count_key = count($key);
$nums = 1;
$str = '';
foreach($key as $k=>$v){
if($count_key == $nums){
$str .= "$k = '$v'";
}else{
$str .= "$k = '$v'".' '.'or'.' ';
}
$nums++;
}
$nums = 1;
$v_str = $factor.$str.$val;
}else{
die("failed: ".'不合法');
}
}else{//两个或者一个参数的情况
$val = (string)$factor;//此种情况将第二参数传给第三个参数
if(is_string($key) && !is_array($key)){//为字符串
$v_str = "$key ='$val'";
}else if(is_array($key) && !empty($val)){
$count_key = count($key);
$nums = 1;
$str = '';
foreach($key as $k=>$v){
if($count_key == $nums){
$str .= "$k = '$v'";
}else{
$str .= "$k = '$v'".' '.'or'.' ';
}
$nums++;
}
$nums = 1;
$v_str = $str.$val;
}else if(is_array($key) && empty($val)){
$count_key = count($key);
$nums = 1;
$str = '';
foreach($key as $k=>$v){
if($count_key == $nums){
$str .= "$k = '$v'";
}else{
$str .= "$k = '$v'".' '.'or'.' ';
}
$nums++;
}
$nums = 1;
$v_str = $str;
}else{
die("failed: ".'不合法');
}
}
$this->options['whereOr'][] = $v_str;
return $this;
}
//处理orwhere数据组sql
public function deal_whereOr($whereOr){
$arr = $whereOr['whereOr'];
$count_key = count($arr);
$nums = 1;
$str = '';
foreach($arr as $key=>$val){
if($count_key == $nums){
$str .= $val;
}else{
$str .= $val.' '.'or'.' ';
}
$nums++;
}
$nums = 1;
return 'or '.$str;
}
//设置JOIN条件(数组和多个JOIN都可以)JOIN('id',12) 或者 JOIN([id=>12])
public function join($key=null,$factor='',$val=''){
$v = (string)$val;
if($key != '' && $factor != '' && $v != ''){//属于三者都有的情况,中间的参数就是条件
if(is_string($key) && is_string($factor) && is_string($v)){
if(!defined('DB_PRE') or DB_PRE == ''){
$v_str = "`$key` $factor ON ($val)";
}else{
$v_str = "`".DB_PRE."$key` $factor ON ($val)";
}
}else{
die("failed: ".'不合法');
}
}else{//两个或者一个参数的情况
$val = (string)$factor;//此种情况将第二参数传给第三个参数
if(is_string($key) && !is_array($key) && $val != '' ){
if (strpos($key, " ")){
$v_str = "$key ON ($val)";
}else{
if(!defined('DB_PRE') or DB_PRE == ''){
$v_str = "`$key` ON ($val)";
}else{
$v_str = "`".DB_PRE."$key` ON ($val)";
}
}
}elseif(is_string($key) && !is_array($key) && $val == '' ){
$v_str = "$key ";
}else if(is_array($key)){
$count_key = count($key);
$nums = 1;
$str = '';
foreach($key as $k=>$v){
if($count_key == $nums){
if(!defined('DB_PRE') or DB_PRE == ''){
$str .= "`$k` ON ($v)";
}else{
$str .= "`".DB_PRE."$k` ON ($v)";
}
}else{
if(!defined('DB_PRE') or DB_PRE == ''){
$str .= "`$k` ON ($v)".' '.'LEFT JOIN'.' ';
}else{
$str .= "`".DB_PRE."$k` ON ($v)".' '.'LEFT JOIN'.' ';
}
}
$nums++;
}
$nums = 1;
$v_str = $str;
}else{
$v_str = '';
}
}
$this->options['join'][] = $v_str;
return $this;
}
//处理JOIN数据组sql
public function deal_join($join){
$arr = $join['join'];
$count_key = count($arr);
$nums = 1;
$str = '';
foreach($arr as $key=>$val){
if($count_key == $nums){
$str .= $val;
}else{
$str .= $val.' '.'LEFT JOIN'.' ';
}
$nums++;
}
$nums = 1;
return 'LEFT JOIN '.$str;
}
//追加sql原生语句
public function addto($val){
$v_str = (string)$val;
$this->options['addto'][] = $v_str;
return $this;
}
//处理原生数据组sql
public function deal_addto($addto){
$arr = $addto['addto'];
$count_key = count($arr);
$nums = 1;
$str = '';
foreach($arr as $key=>$val){
if($count_key == $nums){
$str .= $val;
}else{
$str .= $val.' ';
}
$nums++;
}
$nums = 1;
return $str;
}
//设置排序 格式->('id desc,time aes') //ORDER BY ticketnum_id desc,project_id desc
public function order($order){
$this->options['order'] = $order;
return $this;
}
//处理order数据租sql
public function deal_order($order){
$order = $order['order'];
return 'ORDER BY '.$order;
}
//设置分页查询、格式->('0,10')
public function limit($limit,$nums=''){
if((string)$nums == '' && (string)$limit != ''){
$this->options['limit'] = '0'.','.(string)$limit;
}else{
$this->options['limit'] = (string)$limit.','.(string)$nums;
}
return $this;
}
//处理limit数据租sql
public function deal_limit($limit){
$limit = $limit['limit'];
return 'limit '.$limit;
}
//判断表存在否
public function exist($true=true){
$link = self::getInstance()->objdb;
$table = $this->table_name;
$array = $this->do_sql();
$sql = 'SELECT * from '.$table;
if($true == false){return $sql;}//输出sql
return $this->query_exist($link,$sql);
}
//判断表存在否sql操作
public function query_exist($link,$sql){
$result = mysqli_query($link,$sql);
if($result){
return true;
}else{
return false;
}
}
//查找单条
public function find($true=true){
$link = self::getInstance()->objdb;
$table = $this->table_name;
$array = $this->do_sql();
$field = isset($array['field'])?$array['field']:'*';
$make = isset($array['make'])?$array['make']:'';
$sql = 'SELECT '.$field.' from '.$table.' '.$make;
if($true == false){return $sql;}//输出sql
return $this->query_find($link,$sql);
}
//查找单条数据sql操作
public function query_find($link,$sql){
$result = mysqli_query($link,$sql);
if($result){
$arr = [];
if($result && mysqli_num_rows($result)>0){
$arr = mysqli_fetch_assoc($result);
}
}elseif(APP_DEBUG==1 && !$result){
exit("SQL$sql <br />错误:" . $this->geterror());
}
//$this->close_db($link);
return isset($arr)?$arr:false;
}
//查询多条
public function select($true=true){
$link = self::getInstance()->objdb;
$table = $this->table_name;
$array = $this->do_sql();
$field = isset($array['field'])?$array['field']:'*';
$make = isset($array['make'])?$array['make']:'';
$sql = 'SELECT '.$field.' from '.$table.' '.$make;
if($true == false){return $sql;}//输出sql
return $this->query_select($link,$sql);
}
//查找多条数据sql操作
public function query_select($link,$sql){
$result = mysqli_query($link,$sql);
$arr = [];
if($result && mysqli_num_rows($result)>0){
while($row=mysqli_fetch_assoc($result)){
$arr[] = $row;
}
}elseif(APP_DEBUG==1 && !$result){
exit("SQL$sql <br />错误:" . $this->geterror());
}
//$this->close_db($link);
return $arr;
}
//聚合查询-count
public function count($true=true){
$link = self::getInstance()->objdb;
$table = $this->table_name;
$array = $this->do_sql();
$make = isset($array['make'])?$array['make']:'';
$sql = 'SELECT '.'count(*)'.' from '.$table.' '.$make;
if($true == false){return $sql;}//输出sql
return $this->query_count($link,$sql);
}
//聚合查询-count sql操作
public function query_count($link,$sql){
$result = mysqli_query($link,$sql);
if($result){
$count_json = mysqli_fetch_assoc($result);
$count = $count_json['count(*)'];
}elseif(APP_DEBUG==1 && !$result){
exit("SQL$sql <br />错误:" . $this->geterror());
}
return (int)$count;
}
//聚合查询-max
public function max($max,$true=true){
$link = self::getInstance()->objdb;
$table = $this->table_name;
$array = $this->do_sql();
$make = isset($array['make'])?$array['make']:'';
$sql = 'SELECT '.'max('.$max.')'.' from '.$table.' '.$make;
if($true == false){return $sql;}//输出sql
return $this->query_max($link,$sql,$max);
}
//聚合查询-max sql操作
public function query_max($link,$sql){
$result = mysqli_query($link,$sql);
if($result){
$count_json = mysqli_fetch_assoc($result);
$str_arr = explode(' ', $sql);
$key_str = $str_arr[1];
$count = $count_json[$key_str];
}elseif(APP_DEBUG==1 && !$result){
exit("SQL$sql <br />错误:" . $this->geterror());
}
return (int)$count;
}
//聚合查询-min
public function min($min,$true=true){
$link = self::getInstance()->objdb;
$table = $this->table_name;
$array = $this->do_sql();
$make = isset($array['make'])?$array['make']:'';
$sql = 'SELECT '.'min('.$min.')'.' from '.$table.' '.$make;
if($true == false){return $sql;}//输出sql
return $this->query_min($link,$sql,$min);
}
//聚合查询-min sql操作
public function query_min($link,$sql){
$result = mysqli_query($link,$sql);
if($result){
$count_json = mysqli_fetch_assoc($result);
$str_arr = explode(' ', $sql);
$key_str = $str_arr[1];
$count = $count_json[$key_str];
}elseif(APP_DEBUG==1 && !$result){
exit("SQL$sql <br />错误:" . $this->geterror());
}
return (int)$count;
}
//聚合查询-sum
public function sum($sum,$true=true){
$link = self::getInstance()->objdb;
$table = $this->table_name;
$array = $this->do_sql();
$make = isset($array['make'])?$array['make']:'';
$sql = 'SELECT '.'sum('.$sum.')'.' from '.$table.' '.$make;
if($true == false){return $sql;}//输出sql
return $this->query_sum($link,$sql,$sum);
}
//聚合查询-sum sql操作
public function query_sum($link,$sql){
$result = mysqli_query($link,$sql);
if($result){
$count_json = mysqli_fetch_assoc($result);
$str_arr = explode(' ', $sql);
$key_str = $str_arr[1];
$count = $count_json[$key_str];
}elseif(APP_DEBUG==1 && !$result){
exit("SQL$sql <br />错误:" . $this->geterror());
}
return (int)$count;
}
//聚合查询-avg
public function avg($avg,$true=true){
$link = self::getInstance()->objdb;
$table = $this->table_name;
$array = $this->do_sql();
$make = isset($array['make'])?$array['make']:'';
$sql = 'SELECT '.'avg('.$avg.')'.' from '.$table.' '.$make;
if($true == false){return $sql;}//输出sql
return $this->query_avg($link,$sql,$avg);
}
//聚合查询-avg sql操作
public function query_avg($link,$sql){
$result = mysqli_query($link,$sql);
if($result){
$count_json = mysqli_fetch_assoc($result);
$str_arr = explode(' ', $sql);
$key_str = $str_arr[1];
$count = $count_json[$key_str];
}elseif(APP_DEBUG==1 && !$result){
exit("SQL$sql <br />错误:" . $this->geterror());
}
return (int)$count;
}
//处理options组成sql语句(公共函数)
public function do_sql(){
$array = $this->options;
if(empty($array)){
return [];
}
$this->options = [];//清除记录
$data = []; $stra = ''; $strb = '';
foreach ($array as $key => $val) {
$deal_something = 'deal_'.$key;
if($key == 'field'){
$stra .= $this->$deal_something($array).' ';
$data['field'] = $stra;
}else{
$strb .= $this->$deal_something($array).' ';
$data['make'] = $strb;
}
}
return $data;
}
//添加插入数据 $add:数组(['xxx'=>'xxx','xxxx'=>'xxxx'])
public function add($add,$true=true){
if(!is_array($add)){
return false;
}
$data = $this->deal_add($add);
$link = self::getInstance()->objdb;
$table = $this->table_name;
$sql = 'INSERT INTO '.$table.' '.$data['key'].' VALUES '.$data['val'];
if($true == false){return $sql;}//输出sql
return $this->query_add($link,$sql);
}
//添加插入数据 sql操作
public function query_add($link,$sql){
$result = mysqli_query($link,$sql);
if($result && mysqli_affected_rows($link)>0){
$res = mysqli_insert_id($link);
//$this->close_db($link);
return $res;
}elseif(APP_DEBUG==1){
exit("SQL$sql <br />错误:" . $this->geterror());
}else{
return false;
}
}
//处理add的数据租sql
public function deal_add($add){
$nums = 1;
$counts = count($add);
$stra = ''; $strb = '';
foreach($add as $key=>$val){
if($nums == 1){
$stra .= '(`'.(string)$key.'`';
$strb .= '('.(string)"'$val'";
}elseif($nums == $counts){
$stra .= ',`'.(string)$key.'`)';
$strb .= ','.(string)"'$val'".')';
}else{
$stra .= ',`'.(string)$key.'`';
$strb .= ','.(string)"'$val'";
}
$nums++;
}
$data['key'] = $stra;
$data['val'] = $strb;
return $data;
}
//更新操作 格式( ['name'=>'王天佑',time=>'1234567890'] )
public function update($data,$true=true){
if(!is_array($data)){
return false;
}
$data = $this->deal_update($data);
$link = self::getInstance()->objdb;
$table = $this->table_name;
$array = $this->do_sql();
$make = isset($array['make'])?$array['make']:'';
$sql = 'UPDATE '.$table.' SET '.$data.' '.$make;
if($true == false){return $sql;}//输出sql
return $this->query_update($link,$sql);
}
//更新操作 sql操作
public function query_update($link,$sql){
$result = mysqli_query($link,$sql);
$effet = mysqli_affected_rows($link);
if($result && $effet>0){
$res = $effet;
//$this->close_db($link);
return $res;
}elseif(APP_DEBUG==1 && !$result){
exit("SQL$sql <br />错误:" . $this->geterror());
}else{
return false;
}
}
//处理更新数据组sql 格式['aaaa'=>'aaaa','bbbb'=>'bbbb']
public function deal_update($data){
$nums = 1;
$counts = count($data);
$str = '';
foreach($data as $key=>$val){
if($nums == $counts){
$str .= $key.' = '.(string)"'$val'";
}else{
$str .= $key.' = '.(string)"'$val'".' , ';
}
$nums++;
}
return $str;
}
//删除函操作 格式( ['name'=>'王天佑',time=>'1234567890'] )
public function del($true=true){
$data = $this->deal_del();
$link = self::getInstance()->objdb;
$table = $this->table_name;
$sql = 'DELETE FROM '.$table.' '.$data;
if($true == false){return $sql;}//输出sql
return $this->query_del($link,$sql);
}
//删除函操作 sql操作
public function query_del($link,$sql){
$res = mysqli_query($link,$sql);
$effet = mysqli_affected_rows($link);
if($res){
//$this->close_db($link);
return $effet;
}elseif(APP_DEBUG == 1 && !$res){
exit("SQL$sql <br />错误:" . $this->geterror());
}else{
return false;
}
}
//处理删除函数
public function deal_del(){
$array = $this->options;
if(empty($array)){
return '';
}
$res = $this->deal_where($array);
return $res;
}
//原生sql操作
public static function query($sql){
$obj = self::getInstance();
$link = $obj->objdb;
$str_arr = explode(' ', $sql);
$data = ['INSERT'=>'query_add','DELETE'=>'query_del','UPDATE'=>'query_update','SELECT'=>['count('=>'query_count','max('=>'query_max','min('=>'query_min','sum('=>'query_sum','avg('=>'query_avg']];
$func_name = '';
$a = strtoupper($str_arr[0]);
$b = strtolower($str_arr[1]);
foreach($data as $key=>$val){
if($key == $a){
if(is_string($val)){//属于增删改
$func_name = $val;break;
}else if(is_array($val)){//属于查
foreach($val as $k=>$v){
if(strpos($b,$k) === 0){
$func_name = $v;break;
}else{
$func_name = 'query_select';
}
}
}
}
}
if($func_name === ''){//sql不合法
die("sql: ".'不合法');
}else{
return $obj->$func_name($link,$sql);
}
}
//数据库安装
public static function establish($sql){
$link = self::getInstance()->objdb;
return mysqli_query($link,$sql);
}
//关闭连接
public function close_db($link){
mysqli_close($link);
}
}