<?php namespace Lib; /** * db 池 * @author:dc * @time 2023/2/13 15:03 * Class DbPool * @package Lib */ class DbPool { /** * @var \Lib\DbPool[] */ static $instance = []; /** * @var \PDO */ private $client; /** * @return mixed * @author:dc * @time 2023/2/13 9:12 */ public function getClient(){ return $this->client; } public function __construct() { try { $this->client = new \PDO( 'mysql:charset=utf8mb4;dbname='.DB_DATABASE.';host='.DB_HOST.';port='.DB_PORT, DB_USER, DB_PASSWORD, [ \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'", \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, ] ); }catch (\PDOException $e){ } } /** * 查询 * @param string|array $sql * @return false|\PDOStatement * @author:dc * @time 2023/2/17 10:01 */ private function query(string|array $sql){ if(is_array($sql)){ list($sql,$params) = $sql; }else{ $params = null; } $query = $this->client->prepare($sql); // todo:: 记录日志,生产请注释 logs( $params ? [$sql,$params] : $sql, LOG_PATH.'/sql.log' ); if($query->execute($params)){ return $query; } return false; } /** * 更新数据 * @param string $table * @param array $data * @param string $where * @param bool $timeauto * @return int * @author:dc * @time 2023/2/17 14:03 */ public function update(string $table, array $data, string $where, $timeauto = true):int { if($timeauto){ $data['updated_at'] = empty($data['updated_at']) ? date('Y-m-d H:i:s') : $data['updated_at']; } $sql = "update `{$table}` set ".dbUpdate($data). " where ".$where; $data = $this->getData($data); $query = $this->query([$sql,$data]); if($query){ return $query->rowCount(); } return 0; } /** * 在更新/插入时处理数据 * @param $data * @return mixed * @author:dc * @time 2023/2/18 14:50 */ private function getData($data){ // 如果存储的值是数组,就json一次 foreach ($data as $k=>$datum){ if(is_array($datum)){ $data[$k] = json_encode($datum,JSON_UNESCAPED_UNICODE); }elseif ($datum === null){ $data[$k] = ''; } } return $data; } /** * 插入数据 * @param string $table * @param array $data * @param bool $timeauto * @return int * @author:dc * @time 2023/2/17 14:04 */ public function insert(string $table, array $data, $timeauto = true):int { if($timeauto){ $data['created_at'] = empty($data['created_at']) ? date('Y-m-d H:i:s') : $data['created_at']; } $sql = "insert into `{$table}` set ".dbUpdate($data); $data = $this->getData($data); $query = $this->query([$sql,$data]); if($query){ return $this->client->lastInsertId(); } return 0; } /** * 统计数量 * @param string $sql * @return int * @author:dc * @time 2023/2/14 16:19 */ public function count(string|array $sql):int{ $query = $this->query($sql); if($query){ return $query->fetch(\PDO::FETCH_COLUMN); } return 0; } /** * 某个值 * @param string|array $sql * @return mixed|null * @author:dc * @time 2023/2/17 11:03 */ public function value(string|array $sql){ $query = $this->query($sql); if($query){ return $query->fetch(\PDO::FETCH_COLUMN); } return null; } /** * 查询一条数据 * @param string|array $sql * @return mixed|null * @author:dc * @time 2023/2/13 14:54 */ public function first(string|array $sql){ $query = $this->query($sql); if($query){ return $query->fetch(); } return null; } /** * 查询列表 * @param string|array $sql * @return mixed|null * @author:dc * @time 2023/2/13 14:54 */ public function all(string|array $sql){ $query = $this->query($sql); if($query){ return $query->fetchAll(); } return null; } /** * 事务开启 * @author:dc * @time 2023/2/17 11:35 */ public function transaction(){ $this->client->beginTransaction(); } /** * 事务回滚 * @author:dc * @time 2023/2/17 11:35 */ public function rollBack(){ $this->client->rollBack(); } /** * 事务提交 * @author:dc * @time 2023/2/17 11:35 */ public function commit(){ $this->client->commit(); } /** * @param $cid * @return DbPool * @author:dc * @time 2023/2/13 9:39 */ public static function instance($cid=0){ if(empty(static::$instance[$cid])){ static::$instance[$cid] = new DbPool(); } return static::$instance[$cid]; } /** * 结束 */ public function __destruct(){ $this->client = null; } }