这篇文章主要介绍“怎么写redis db pdo类”,在日常操作中,相信很多人在怎么写redis db pdo类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么写redis db pdo类”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
<?php /** * Created by PhpStorm. * User: ywx * Date: 2019/7/10 * Time: 14:57 */ namespace core; class Db { private $conn; private $sql = [ 'where' => null, 'wheresql' => null, 'orderBy' => null, 'limit' => null, 'up' => null, 'ins' => null, 'group' => null, 'fields' => null, ]; private $type; private $tablename; private $deBug = false; public function __construct( $data = []) { if($data){ $this->_setDbDrive($data); } } private function _setDbDrive($dbConf){ $dns = 'mysql:host='.$dbConf['db_ip'].';dbname='.$dbConf['db_name'].';charset=utf8mb4'; try { $db = new \PDO($dns,$dbConf['db_user'],$dbConf['db_pass']); } catch(\PDOException $e) { die('Could not connect to the database:<br/>' . $e); } $this->conn[$dbConf['name']] = $db; } /** * 判断是否创建连接 * @param $table */ private function checkTable($table){ //获取表库信息 $db_info = _getDBIP($table); $this->sql = [];//重置缓存 $this->type = $db_info['name'];//缓存库信息 //初始化连接 if(!isset($this->conn[$db_info['name']])){ $this->_setDbDrive($db_info); } $this->tablename = $table; } public function table($tablename) { $this->checkTable($tablename); return $this; } public function select($fields = '*') { $sql = sprintf("SELECT %s FROM %s", $fields, $this->tablename); $this->sql['fields'] = $fields; if(!empty($this->sql['where'])) { $sql .= ' WHERE ' . $this->sql['wheresql']; } if(!empty($this->sql['orderBy'])) { $sql .= ' ORDER BY ' . $this->sql['orderBy']; } if(!empty($this->sql['limit'])) { $sql .= ' LIMIT ' . $this->sql['limit']; } if(!empty($this->sql['group'])) { $sql .= ' GROUP BY ' . $this->sql['group']; } return $this->_select($sql); } public function deBug(){ $this->deBug = true; return $this; } public function find($fields = '*') { $this->limit(1); $result = $this->select($fields); return $result; } public function insert($data) { $keys = "`".implode('`,`', array_keys($data))."`"; $values = ":i".implode(", :i", array_keys($data)); $this->sql['ins'] = $data; $querySql = sprintf("INSERT INTO %s ( %s ) VALUES ( %s )", $this->tablename, $keys, $values); return $this->_insert($querySql); } public function delete() { if(!$this->sql['where']) return false; $querySql = sprintf("DELETE FROM %s WHERE ( %s )", $this->tablename, $this->sql['wheresql']); return $this->_update($querySql); } /** * 传入数组 ['apid'=>['+',15],'bpid'=>105] 目前二位数组仅支持 加减 * @param $data * @return mixed */ public function update($data) { $updateFields = []; foreach ($data as $key => $value) { if(!is_array($value)){ $updateFields[] = "`$key`=:u{$key} "; }else{ $updateFields[] = "`$key`= `{$key}` {$value[0]} {$value[1]}"; unset($data[$key]); } } $this->sql['up'] = $data; $updateFields = implode(',', $updateFields); $sql = sprintf("UPDATE %s SET %s", $this->tablename, $updateFields); if(!empty($this->sql['where'])) { $sql .= ' WHERE ' . $this->sql['wheresql']; } return $this->_update($sql); } public function limit($limit, $limitCount = null) { if(!$limitCount) { $this->sql['limit'] = $limit; }else{ $this->sql['limit'] = $limit .','. $limitCount; } return $this; } public function orderBy($orderBy) { $this->sql['orderBy'] = $orderBy; return $this; } public function groupBy($group) { $this->sql['group'] = $group; return $this; } public function where($where) { if(!is_array($where)) { return null; } $crondsArr = []; foreach ($where as $key => $value) { if(!is_array($value)) { $crondsArr[] = "`$key`=:w{$key}"; continue; }else if($value[0] == 'in'){//处理in逻辑 $val = ' ('; foreach($value[1] as $k=>$v){ if($k == 0){ $val .= ':win'.$k; }else{ $val .= ',:win'.$k; } } $val .= ')'; }else{//处理 > < <> 等逻辑 $val = ' :w' . $key; } $crondsArr[] = "`$key` ".$value[0]. $val; } $this->sql['wheresql'] = implode(' AND ', $crondsArr); $this->sql['where'] = $where; return $this; } public function whereOr($where) { if(!is_array($where)) { return null; } $crondsArr = []; foreach ($where as $key => $value) { $fieldValue = $value; if(is_array($fieldValue)) { $crondsArr[] = "`$key` ".$fieldValue[0]. ' :wo' . $key; }else{ $crondsArr[] = "`$key`=:wo{$key}"; } } $sql = implode(' OR ', $crondsArr); if(!empty($this->sql['wheresql'])){ $this->sql['wheresql'] .= ' AND ' . '(' . $sql . ')'; }else{ $this->sql['wheresql'] = '(' . $sql . ')'; } if(!empty($this->sql['whereor'])){ $this->sql['whereor'] = array_merge($this->sql['whereor'], $where); }else{ $this->sql['whereor'] = $where; } return $this; } private function _select($sql){ if($this->type == 'master') { //确认redis缓存数据 if($data = $this->_checkRedisMasterData()){ return $data; } } $stmt = $this->conn[$this->type]->prepare($sql); $stmt = $this->_setWhereParam($stmt); if($this->deBug){ return $stmt->debugDumpParams(); } $ret = $stmt->execute(); if(!$ret) return null; if($this->sql['limit'] == 1){ $retData = $stmt->fetch(\PDO::FETCH_ASSOC); }else{ $retData = $stmt->fetchAll(\PDO::FETCH_ASSOC); } $re_data = $this->_formatTransform($retData); return $this->_wirteRedisMasterData($re_data); } private function _update($sql){ $stmt = $this->conn[$this->type]->prepare($sql); $stmt = $this->_setWhereParam($stmt); //update if(!empty($this->sql['up'])){ foreach($this->sql['up'] as $k=>$v){ $stmt->bindValue('u'.$k,trim($v,'\'')); } } if($this->deBug){ return $stmt->debugDumpParams(); } $ret = $stmt->execute(); return $ret; } private function _insert($sql){ $stmt = $this->conn[$this->type]->prepare($sql); //install if(!empty($this->sql['ins'])){ foreach($this->sql['ins'] as $k=>$v){ $stmt->bindValue('i'.$k,$v); } } $ret = $stmt->execute(); if($ret) { return $this->conn[$this->type]->lastInsertId(); } return false; } private function _setWhereParam($stmt){ //绑定参数 where if(!empty($this->sql['where'])){ foreach($this->sql['where'] as $k=>$v){ if(!is_array($v)){ $val = $v; }else if($v[0] == 'in'){ foreach($v[1] as $key=>$v1){ $stmt->bindValue('win'.$key,$v1); } continue; }else{ $val = $v[1]; } $stmt->bindValue('w'.$k,$val); } } if(!empty($this->sql['whereor'])){ foreach($this->sql['whereor'] as $k=>$v){ if(!is_array($v)){ $val = $v; }else{ $val = $v[1]; } $stmt->bindValue('wo'.$k,$val); } } return $stmt; } public function close() { return $this->conn = null; } //开启事务 public function startTrans($tab = 'item'){ //准备数据库资源 $this->table($tab); if(empty($this->conn['server'])){ exit(); } $this->conn['server']->beginTransaction(); } //提交事务 public function dbCommit(){ if(empty($this->conn['server'])){ exit(); } $this->conn['server']->commit(); } //回滚事务 public function dbRollBack($data = '',$e = ''){ if(empty($this->conn['server'])){ exit(); } $this->conn['server']->rollBack(); if(!empty($data) &&!empty($e)){ _writeLog($data,'update-error--'.date('Y-m-d H:i:s').$e->getMessage(),'error'); } } /** * 原生查询 * @param $querySql * @return mixed */ public function query($table, $querySql) { $this->checkTable($table); $querystr = strtolower(trim(substr($querySql,0,6))); $stmt = $this->conn[$this->type]->prepare($querySql); $ret = $stmt->execute(); $this->sql = []; if(!$ret) var_dump($stmt->errorInfo()); if($querystr == 'select') { $retData = $stmt->fetchAll(\PDO::FETCH_ASSOC); return $this->_formatTransform($retData); }elseif($ret && $querystr == 'insert') { return $this->conn[$this->type]->lastInsertId(); }else{ return $this->_formatTransform($ret); } } private function _formatTransform($data){ if(!is_array($data))return $data; if($this->tablename == 'round_star' || $this->tablename == 'chapter_reward' || $this->tablename == 'dailyround' ){ }elseif($this->tablename == 'userdatas' || $this->tablename == 'userDatas'){ array_walk_recursive($data, function(&$value , $key){ if($key == 'coin'){ $value = (string)$value; }elseif(ctype_digit($value)){ $value = (int)$value; }elseif(is_json($value)){ // jsonチェック $value = json_decode($value, true); } }); }else{ array_walk_recursive($data, function(&$value, $key){ if(ctype_digit($value) && $key != 'name'){ $value = (int)$value; }elseif(is_json($value)){ $value = json_decode($value, true); } }); } return $data; } /** * 二维数组多条更新 * @param $data */ public function updateAll($data){ if(!empty($data['table'])){ $table = $data['table']; $whe = ['id'=>$data['id']]; unset($data['table']); unset($data['id']); $t = $this->table($table)->where($whe)->insert($data); if(!$t)return false; }else{ foreach($data as $k=>$v){ $table = $v['table']; $whe = ['id'=>$v['id']]; unset($v['table']); unset($v['id']); $t = $this->table($table)->where($whe)->update($v); if(!$t)return false; } } return true; } /** * 多条数据插入 * @param $data */ public function insertAll($data){ if(!empty($data['table'])){ $table = $data['table']; unset($data['table']); $t = $this->table($table)->insert($data); if(!$t)return false; }else{ foreach($data as $k=>$v){ $table = $v['table']; unset($v['table']); $t = $this->table($table)->insert($v); if(!$t)return false; } } return true; } /** * @param $table * @param $on * @param string $join * @param string $t1 */ public function join($table, $on, $join = ' left ', $t1 = ' a '){ $this->tablename .= $t1 . $join . $table . $on; } //确认缓存并获取 private function _checkRedisMasterData(){ if(_getRedis()->exists($this->_getMasterRedisName())){ $data = json_decode(_getRedis()->get($this->_getMasterRedisName()),true); return $data; } return false; } //写入缓存,设置有效期 private function _wirteRedisMasterData($data){ if($this->type != 'master') return $data; _getRedis()->set($this->_getMasterRedisName(),json_encode($data)); _getRedis()->expire($this->_getMasterRedisName(),MASTER_EXPIRE); $this->sql = []; return $data; } //获取缓存名 private function _getMasterRedisName(){ $arr = [ 'string', $this->tablename, json_encode($this->sql['where']), $this->sql['limit'], $this->sql['orderBy'], $this->sql['group'], $this->sql['fields'], ]; $str = implode('_',$arr); return $str; } }
到此,关于“怎么写redis db pdo类”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。