php 읽 기와 쓰기 분리 기능 이 있 는 MySQL 클래스 의 전체 실례 구현

이 사례 는 phop 이 읽 기와 쓰기 분리 기능 을 실현 하 는 MySQL 류 를 다 루 고 있다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
개요:
1.sql 구문 에 따라 읽 기 라 이브 러 리 연결 인지 라 이브 러 리 쓰기 인지 판단
2.체인 호출$this->where()->get()
3.서로 다른 호스트 가 서로 다른 인 스 턴 스 에 대응 합 니 다.new 를 여러 번 사용 하지 않 습 니 다.
구체 적 인 코드 는 다음 과 같다.

<?php
class DBRWmysql
{
  private static $Instance = null;
  private $links = array();//    
  private $link = null; //    
  public $dbType = 'read';
  public $_host=''; //        
  public $_database = '';//      
  public $_tablename = '';//      
  public $_dt ='';//database.tablename
  public $isRelease = 0; //         
  public $fields = '*';
  public $arrWhere = [];
  public $order = '';
  public $arrOrder = [];
  public $limit = '';
  public $sql = '';
  public $rs;//   
  private function __construct($database='', $tablename='', $isRelease=0)
  {
    $this->_database = $database;//database name
    $this->_tablename = $tablename;//table name
    $this->_dt = "`{$this->_database}`.`{$this->_tablename}`";
    $this->isRelease = $isRelease;
  }
  public static function getInstance($database='', $tablename='', $isRelease=0)
  {
    if (self::$Instance == null) {
      self::$Instance = new DBRWmysql($database, $tablename, $isRelease);
    }
    self::$Instance->_database = $database;
    self::$Instance->_tablename = $tablename;
    self::$Instance->_dt    = "`{$database}`.`{$tablename}`";
    self::$Instance->isRelease = $isRelease;
    return self::$Instance;
  }
  //      ,      MYSQL  ,         
  //      ,              
  //type == 'write' 'read'
  public function getLink($type)
  {
    $this->dbType = $$type;
    //           (    )
    $dbConfig = DBConfig::$$type;
    $randKey = array_rand($dbConfig);
    $config = $dbConfig[$randKey];
    //     
    $host = $config['host'];
    $username = $config['username'];
    $password = $config['password'];
    if (empty($this->links[$host])) {
      $this->_host = $host;
      $this->links[$host] = new mysqli($host, $username, $password);
      if($this->links[$host]->connect_error) {
        $this->error($this->links[$host]->connect_error);
      }
    }
    //     
    $this->link = $this->links[$host];
    $this->link->query("set names utf8mb4;"); //  emoji  
    $this->link->query("use {$this->_database};");
  }
  public function getCurrentLinks()
  {
    return $this->links;
  }
  //    
  public function __destruct()
  {
    foreach ($this->links as $v) {
      $v->close();
    }
  }
  //    
  public function query($sql)
  {
    $this->sql = $sql;
    if (strpos($sql, 'select') !== false) {
      $this->getLink('read');//  
    } else {
      $this->getLink('write');//  
    }
    $this->rs = $this->link->query($sql);
    ($this->rs === false) && $this->error('sql error: '.$sql.PHP_EOL.$this->link->error);
    //         ,        
    if ($this->isRelease) {
      $this->link->close();
      unset($this->links[$this->_host]);
    }
    return $this->rs;
  }
  // 
  public function insert($arrData)
  {
    foreach ($arrData as $key=>$value) {
      $fields[] = $key;
      $values[] = "'".$value."'";
      // $fields[] = '`'.$key.'`';
      // $values[] = "'".$value."'";
    }
    $strFields = implode(',', $fields);
    $strValues = implode(',', $values);
    $sql = "insert into {$this->_dt} ($strFields) values ($strValues)";
    $this->query($sql);
    $insert_id = $this->link->insert_id;
    return $insert_id;
  }
  // 
  public function replace($arrData)
  {
    foreach ($arrData as $key=>$value) {
      $fields[] = $key;
      $values[] = "'{$value}'";
    }
    $strFields = implode(',', $fields);
    $strValues = implode(',', $values);
    $sql = "replace into {$this->_dt} ($strFields) values ($strValues)";
    $this->query($sql);
    return $this->link->insert_id;
  }
  // 
  //        
  //         ,      
  public function insertm($arrFields, $arrData)
  {
    foreach ($arrFields as $v) {
      // $fields[] = "`{$v}`";
      $fields[] = $v;
    }
    foreach ($arrData as $v) {
      $data[] = '('.implode(',', $v).')';
    }
    $strFields = implode(',', $fields);
    $strData = implode(',', $data);
    $sql = "insert into {$this->_dt} ($strFields) values {$strData}";
    $this->query($sql);
    return $this->link->insert_id;
  }
  // 
  public function delete()
  {
    $where = $this->getWhere();
    $limit = $this->getLimit();
    $sql = " delete from {$this->_dt} {$where} {$limit}";
    $this->query($sql);
    return $this->link->affected_rows;
  }
  // 
  public function update($data)
  {
    $where = $this->getWhere();
    $arrSql = array();
    foreach ($data as $key=>$value) {
      $arrSql[] = "{$key}='{$value}'";
    }
    $strSql = implode(',', $arrSql);
    $sql = "update {$this->_dt} set {$strSql} {$where} {$this->limit}";
    $this->query($sql);
    return $this->link->affected_rows;
  }
  //    
  public function getCount()
  {
    $where = $this->getWhere();
    $sql = " select count(1) as n from {$this->_dt} {$where} ";
    $resault = $this->query($sql);
    ($resault===false) && $this->error('getCount error: '.$sql);
    $arrRs = $this->rsToArray($resault);
    $num = array_shift($arrRs);
    return $num['n'];
  }
  //           
  //  field   ,       $field      
  public function rsToArray($field = '')
  {
    $arrRs = $this->rs->fetch_all(MYSQLI_ASSOC); //       php mysqlnd  
    $this->rs->free();//     
    if ($field) {
      $arrResult = [];
      foreach ($arrRs as $v) {
        $arrResult[$v[$field]] = $v;
      }
      return $arrResult;
    }
    return $arrRs;
  }
  //         
  public function qw($strFields)
  {
    $strFields = preg_replace('#\s+#', ' ', $strFields);
    $arrNewFields = explode(' ', $strFields );
    $arrNewFields = array_filter($arrNewFields);
    foreach ($arrNewFields as $k => $v) {
      $arrNewFields[$k]= '`'.$v.'`';
    }
    return implode(',', $arrNewFields);
  }
  //      ,            ...  (   )
  public function getInsertData($strData)
  {
    // $bmap = "jingdu,$jingdu weidu,$weidu content,$content";
  }
  //select in
  //arrData     ,     
  public function select_in($key, $arrData, $fields='')
  {
    $fields = $fields ? $fields : '*';
    sort($arrData);
    $len = count($arrData);
    $cur = 0;
    $pre = $arrData[0];
    $new = array('0' => array($arrData[0]));
    for ($i = 1; $i < $len; $i++) {
      if (($arrData[$i] - $pre) == 1 ) {
        $new[$cur][] = $arrData[$i];
      } else {
        $cur = $i;
        $new[$cur][] = $arrData[$i];
      }
      $pre = $arrData[$i];
    }
    $arrSql = array();
    foreach ($new as $v) {
      $len = count($v) - 1;
      if ($len) {
        $s = $v[0];
        $e = end($v);
        $sql = "(select $fields from {$this->_dt} where $key between $s and $e)";
      } else {
        $s = $v[0];
        $sql = "(select $fields from {$this->_dt} where $key = $s)";
      }
      $arrSql[] = $sql;
    }
    $strUnion = implode(' UNION ALL ', $arrSql);
    $res = $this->query($strUnion);
    return $this->rstoarray($res);
  }
  //where in
  public function setWhereIn($key, $arrData)
  {
    if (empty($arrData)) {
      $str = "(`{$key}` in ('0'))";
      $this->addWhere($str);
      return $str;
    }
    foreach ($arrData as &$v) {
      $v = "'{$v}'";
    }
    $str = implode(',', $arrData);
    $str = "(`{$key}` in ( {$str} ))";
    $this->addWhere($str);
    return $this;
  }
  //where in
  public function setWhere($arrData)
  {
    if (empty($arrData)) {
      return '';
    }
    foreach ($arrData as $k => $v) {
      $str = "(`{$k}` = '{$v}')";
      $this->addWhere($str);
    }
    return $this;
  }
  //between and
  public function setWhereBetween($key, $min, $max)
  {
    $str = "(`{$key}` between '{$min}' and '{$max}')";
    $this->addWhere($str);
    return $this;
  }
  //where a>b
  public function setWhereBT($key, $value)
  {
    $str = "(`{$key}` > '{$value}')";
    $this->addWhere($str);
    return $this;
  }
  //where a<b
  public function setWhereLT($key, $value)
  {
    $str = "(`{$key}` < '{$value}')";
    $this->addWhere($str);
    return $this;
  }
  //  where  
  public function addWhere($where)
  {
    $this->arrWhere[] = $where;
  }
  //        where  
  public function getWhere()
  {
    if (empty($this->arrWhere)) {
      return 'where 1';
    } else {
      return 'where '.implode(' and ', $this->arrWhere);
    }
  }
  //     
  public function setFields($fields)
  {
    $this->fields = $fields;
    return $this;
  }
  // order by a desc
  public function setOrder($order)
  {
    $this->arrOrder[] = $order;
    return $this;
  }
  //  order  
  public function getOrder()
  {
    if (empty($this->arrOrder)) {
      return '';
    } else {
      $str = implode(',', $this->arrOrder);
      $this->order = "order by {$str}";
    }
    return $this->order;
  }
  //e.g. '0, 10'
  // limit      where    :select ... where id > 1234 limit 0, 10
  public function setLimit($limit)
  {
    $this->limit = 'limit '.$limit;
    return $this;
  }
  //    sql  ,       
  public function arrQuery($sql, $field='')
  {
    $this->query($sql);
    $this->clearQuery();
    ($this->rs===false) && $this->error('select error: '.$sql);
    return $this->rsToArray($field);
  }
  //   $field    ,                
  //    join
  public function get($field='')
  {
    $where = $this->getWhere();
    $order = $this->getOrder();
    $sql = " select {$this->fields} from {$this->_dt} {$where} {$order} {$this->limit} ";
    return $this->arrQuery($sql, $field);
  }
  //      
  public function getOne()
  {
    $this->setLimit(1);
    $rs = $this->get();
    return !empty($rs) ? $rs[0] : [];
  }
  //              
  public function getOneField($field)
  {
    $this->setFields($field);
    $rs = $this->getOne();
    return !empty($rs[$field]) ? $rs[$field] : '';
  }
  //              
  public function getFields($field)
  {
    $this->setFields($field);
    $rs = $this->get();
    $result = [];
    foreach ($rs as $v) {
      $result[] = $v[$field];
    }
    unset($rs);
    return $result;
  }
  //      
  //        
  public function clearQuery()
  {
    $this->fields = '*';
    $this->arrWhere = [];
    $this->order = '';
    $this->arrOrder = [];
    $this->limit = '';
  }
  //       
  public function close()
  {
    $this->link->close();
  }
  //  
  //      
  public function autocommit($bool)
  {
    $this->link->autocommit($bool);
  }
  //      
  public function commit()
  {
    $this->link->commit();
  }
  //  
  public function rollback()
  {
    $this->link->rollback();
  }
  //    sql  
  public function error($sql)
  {
    //if (IS_TEST) {}
    exit($sql);
  }
}

더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기