<noframes id="xlzjj">
    <address id="xlzjj"></address>
    <form id="xlzjj"></form><em id="xlzjj"><span id="xlzjj"><span id="xlzjj"></span></span></em><address id="xlzjj"></address>

      <noframes id="xlzjj">
      <form id="xlzjj"><nobr id="xlzjj"><progress id="xlzjj"></progress></nobr></form>

      <address id="xlzjj"></address>
      <address id="xlzjj"><address id="xlzjj"><listing id="xlzjj"></listing></address></address>
      <em id="xlzjj"></em>

      php mysql 數據庫操作類

      作者: 健隆 分類: php 發布時間: 2020-12-07 10:33
      <?php
      /**
       * Desc: php操作mysql的封裝類
       * Author zhifeng
       * Date: 2015/04/15
       * 連接模式:PDO
       */
       
      class MMysql {
           
          protected static $_dbh = null; //靜態屬性,所有數據庫實例共用,避免重復連接數據庫
          protected $_dbType = 'mysql';
          protected $_pconnect = true; //是否使用長連接
          protected $_host = 'localhost';
          protected $_port = 3306;
          protected $_user = 'root';
          protected $_pass = 'root';
          protected $_dbName = null; //數據庫名
          protected $_sql = false; //最后一條sql語句
          protected $_where = '';
          protected $_order = '';
          protected $_limit = '';
          protected $_field = '*';
          protected $_clear = 0; //狀態,0表示查詢條件干凈,1表示查詢條件污染
          protected $_trans = 0; //事務指令數 
        
          /**
           * 初始化類
           * @param array $conf 數據庫配置
           */
          public function __construct(array $conf) {
              class_exists('PDO') or die("PDO: class not exists.");
              $this->_host = $conf['host'];
              $this->_port = $conf['port'];
              $this->_user = $conf['user'];
              $this->_pass = $conf['passwd'];
              $this->_dbName = $conf['dbname'];
              //連接數據庫
              if ( is_null(self::$_dbh) ) {
                  $this->_connect();
              }
          }
           
          /**
           * 連接數據庫的方法
           */
          protected function _connect() {
              $dsn = $this->_dbType.':host='.$this->_host.';port='.$this->_port.';dbname='.$this->_dbName;
              $options = $this->_pconnect ? array(PDO::ATTR_PERSISTENT=>true) : array();
              try { 
                  $dbh = new PDO($dsn, $this->_user, $this->_pass, $options);
                  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  //設置如果sql語句執行錯誤則拋出異常,事務會自動回滾
                  $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //禁用prepared statements的仿真效果(防SQL注入)
              } catch (PDOException $e) { 
                  die('Connection failed: ' . $e->getMessage());
              }
              $dbh->exec('SET NAMES utf8');
              self::$_dbh = $dbh;
          }
       
          /** 
          * 字段和表名添加 `符號
          * 保證指令中使用關鍵字不出錯 針對mysql 
          * @param string $value 
          * @return string 
          */
          protected function _addChar($value) { 
              if ('*'==$value || false!==strpos($value,'(') || false!==strpos($value,'.') || false!==strpos($value,'`')) { 
                  //如果包含* 或者 使用了sql方法 則不作處理 
              } elseif (false === strpos($value,'`') ) { 
                  $value = '`'.trim($value).'`';
              } 
              return $value; 
          }
           
          /** 
          * 取得數據表的字段信息 
          * @param string $tbName 表名
          * @return array 
          */
          protected function _tbFields($tbName) {
              $sql = 'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="'.$tbName.'" AND TABLE_SCHEMA="'.$this->_dbName.'"';
              $stmt = self::$_dbh->prepare($sql);
              $stmt->execute();
              $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
              $ret = array();
              foreach ($result as $key=>$value) {
                  $ret[$value['COLUMN_NAME']] = 1;
              }
              return $ret;
          }
       
          /** 
          * 過濾并格式化數據表字段
          * @param string $tbName 數據表名 
          * @param array $data POST提交數據 
          * @return array $newdata 
          */
          protected function _dataFormat($tbName,$data) {
              if (!is_array($data)) return array();
              $table_column = $this->_tbFields($tbName);
              $ret=array();
              foreach ($data as $key=>$val) {
                  if (!is_scalar($val)) continue; //值不是標量則跳過
                  if (array_key_exists($key,$table_column)) {
                      $key = $this->_addChar($key);
                      if (is_int($val)) { 
                          $val = intval($val); 
                      } elseif (is_float($val)) { 
                          $val = floatval($val); 
                      } elseif (preg_match('/^\(\w*(\+|\-|\*|\/)?\w*\)$/i', $val)) {
                          // 支持在字段的值里面直接使用其它字段 ,例如 (score+1) (name) 必須包含括號
                          $val = $val;
                      } elseif (is_string($val)) { 
                          $val = '"'.addslashes($val).'"';
                      }
                      $ret[$key] = $val;
                  }
              }
              return $ret;
          }
           
          /**
          * 執行查詢 主要針對 SELECT, SHOW 等指令
          * @param string $sql sql指令 
          * @return mixed 
          */
          protected function _doQuery($sql='') {
              $this->_sql = $sql;
              $pdostmt = self::$_dbh->prepare($this->_sql); //prepare或者query 返回一個PDOStatement
              $pdostmt->execute();
              $result = $pdostmt->fetchAll(PDO::FETCH_ASSOC);
              return $result;
          }
           
          /** 
          * 執行語句 針對 INSERT, UPDATE 以及DELETE,exec結果返回受影響的行數
          * @param string $sql sql指令 
          * @return integer 
          */
          protected function _doExec($sql='') {
              $this->_sql = $sql;
              return self::$_dbh->exec($this->_sql);
          }
       
          /** 
          * 執行sql語句,自動判斷進行查詢或者執行操作 
          * @param string $sql SQL指令 
          * @return mixed 
          */
          public function doSql($sql='') {
              $queryIps = 'INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|LOAD DATA|SELECT .* INTO|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK'; 
              if (preg_match('/^\s*"?(' . $queryIps . ')\s+/i', $sql)) { 
                  return $this->_doExec($sql);
              }
              else {
                  //查詢操作
                  return $this->_doQuery($sql);
              }
          }
       
          /** 
          * 獲取最近一次查詢的sql語句 
          * @return String 執行的SQL 
          */
          public function getLastSql() { 
              return $this->_sql;
          }
       
          /**
           * 插入方法
           * @param string $tbName 操作的數據表名
           * @param array $data 字段-值的一維數組
           * @return int 受影響的行數
           */
          public function insert($tbName,array $data){
              $data = $this->_dataFormat($tbName,$data);
              if (!$data) return;
              $sql = "insert into ".$tbName."(".implode(',',array_keys($data)).") values(".implode(',',array_values($data)).")";
              return $this->_doExec($sql);
          }
       
          /**
           * 刪除方法
           * @param string $tbName 操作的數據表名
           * @return int 受影響的行數
           */
          public function delete($tbName) {
              //安全考慮,阻止全表刪除
              if (!trim($this->_where)) return false;
              $sql = "delete from ".$tbName." ".$this->_where;
              $this->_clear = 1;
              $this->_clear();
              return $this->_doExec($sql);
          }
        
          /**
           * 更新函數
           * @param string $tbName 操作的數據表名
           * @param array $data 參數數組
           * @return int 受影響的行數
           */
          public function update($tbName,array $data) {
              //安全考慮,阻止全表更新
              if (!trim($this->_where)) return false;
              $data = $this->_dataFormat($tbName,$data);
              if (!$data) return;
              $valArr = '';
              foreach($data as $k=>$v){
                  $valArr[] = $k.'='.$v;
              }
              $valStr = implode(',', $valArr);
              $sql = "update ".trim($tbName)." set ".trim($valStr)." ".trim($this->_where);
              return $this->_doExec($sql);
          }
        
          /**
           * 查詢函數
           * @param string $tbName 操作的數據表名
           * @return array 結果集
           */
          public function select($tbName='') {
              $sql = "select ".trim($this->_field)." from ".$tbName." ".trim($this->_where)." ".trim($this->_order)." ".trim($this->_limit);
              $this->_clear = 1;
              $this->_clear();
              return $this->_doQuery(trim($sql));
          }
        
          /**
           * @param mixed $option 組合條件的二維數組,例:$option['field1'] = array(1,'=>','or')
           * @return $this
           */
          public function where($option) {
              if ($this->_clear>0) $this->_clear();
              $this->_where = ' where ';
              $logic = 'and';
              if (is_string($option)) {
                  $this->_where .= $option;
              }
              elseif (is_array($option)) {
                  foreach($option as $k=>$v) {
                      if (is_array($v)) {
                          $relative = isset($v[1]) ? $v[1] : '=';
                          $logic    = isset($v[2]) ? $v[2] : 'and';
                          $condition = ' ('.$this->_addChar($k).' '.$relative.' '.$v[0].') ';
                      }
                      else {
                          $logic = 'and';
                          $condition = ' ('.$this->_addChar($k).'='.$v.') ';
                      }
                      $this->_where .= isset($mark) ? $logic.$condition : $condition;
                      $mark = 1;
                  }
              }
              return $this;
          }
        
          /**
           * 設置排序
           * @param mixed $option 排序條件數組 例:array('sort'=>'desc')
           * @return $this
           */
          public function order($option) {
              if ($this->_clear>0) $this->_clear();
              $this->_order = ' order by ';
              if (is_string($option)) {
                  $this->_order .= $option;
              }
              elseif (is_array($option)) {
                  foreach($option as $k=>$v){
                      $order = $this->_addChar($k).' '.$v;
                      $this->_order .= isset($mark) ? ','.$order : $order;
                      $mark = 1;
                  }
              }
              return $this;
          }
        
          /**
           * 設置查詢行數及頁數
           * @param int $page pageSize不為空時為頁數,否則為行數
           * @param int $pageSize 為空則函數設定取出行數,不為空則設定取出行數及頁數
           * @return $this
           */
          public function limit($page,$pageSize=null) {
              if ($this->_clear>0) $this->_clear();
              if ($pageSize===null) {
                  $this->_limit = "limit ".$page;
              }
              else {
                  $pageval = intval( ($page - 1) * $pageSize);
                  $this->_limit = "limit ".$pageval.",".$pageSize;
              }
              return $this;
          }
        
          /**
           * 設置查詢字段
           * @param mixed $field 字段數組
           * @return $this
           */
          public function field($field){
              if ($this->_clear>0) $this->_clear();
              if (is_string($field)) {
                  $field = explode(',', $field);
              }
              $nField = array_map(array($this,'_addChar'), $field);
              $this->_field = implode(',', $nField);
              return $this;
          }
        
          /**
           * 清理標記函數
           */
          protected function _clear() {
              $this->_where = '';
              $this->_order = '';
              $this->_limit = '';
              $this->_field = '*';
              $this->_clear = 0;
          }
        
          /**
           * 手動清理標記
           * @return $this
           */
          public function clearKey() {
              $this->_clear();
              return $this;
          }
       
          /**
          * 啟動事務 
          * @return void 
          */
          public function startTrans() { 
              //數據rollback 支持 
              if ($this->_trans==0) self::$_dbh->beginTransaction();
              $this->_trans++; 
              return; 
          }
           
          /** 
          * 用于非自動提交狀態下面的查詢提交 
          * @return boolen 
          */
          public function commit() {
              $result = true;
              if ($this->_trans>0) { 
                  $result = self::$_dbh->commit(); 
                  $this->_trans = 0;
              } 
              return $result;
          }
       
          /** 
          * 事務回滾 
          * @return boolen 
          */
          public function rollback() {
              $result = true;
              if ($this->_trans>0) {
                  $result = self::$_dbh->rollback();
                  $this->_trans = 0;
              }
              return $result;
          }
       
          /**
          * 關閉連接
          * PHP 在腳本結束時會自動關閉連接。
          */
          public function close() {
              if (!is_null(self::$_dbh)) self::$_dbh = null;
          }
       
      }
      
      
      
      <?php
       
      $mysql new MMysql($configArr);
       
      //插入
      $data array(
          'sid'=>101,
          'aa'=>123456,
          'bbc'=>'aaaaaaaaaaaaaa',
          );
      $mysql->insert('t_table',$data);
      //查詢
      $res $mysql->field(array('sid','aa','bbc'))
          ->order(array('sid'=>'desc','aa'=>'asc'))
          ->where(array('sid'=>"101",'aa'=>array('123455','>','or')))
          ->limit(1,2)
          ->select('t_table');
      $res $mysql->field('sid,aa,bbc')
          ->order('sid desc,aa asc')
          ->where('sid=101 or aa>123455')
          ->limit(1,2)
          ->select('t_table');
      //獲取最后執行的sql語句
      $sql $mysql->getLastSql();
      //直接執行sql語句
      $sql "show tables";
      $res $mysql->doSql($sql);
      //事務
      $mysql->startTrans();
      $mysql->where(array('sid'=>102))->update('t_table',array('aa'=>666666));
      $mysql->where(array('sid'=>103))->update('t_table',array('bbc'=>'呵呵8888呵呵'));
      $mysql->where(array('sid'=>104))->delete('t_table');
      $mysql->commit();

      如果覺得我的文章對您有用,請隨意打賞。您的支持將鼓勵我繼續創作!

      偷拍久久国产視频,AV一区二区国产剧情,国产剧情AV果冻传媒在线观看,国产网红k频道隔壁小姐姐,综合国产日韩亚洲欧美一区,爱豆传媒国产剧情免费观看,国产萝莉福利,国产网红主播剧情 国产精彩直播自慰在线观看| 国产偷拍夫妻迅雷 下载| 视讯一区 国产| 精东影业搬浮家| 榴莲视频秋葵小蝌蚪视频在线观看| 欧美 日韩 国产亚洲精品在线视频| 吉克隽逸好声音中文字幕| 国产偷拍和妈妈厨房| 国产七七樱子在哪里直播| 萌白酱百合在线| 国产电影剧情男主附身在玩具熊上| 国产偷拍国产自慰| 日本的大街| 北京天美大和传媒有限公司天眼查| 清儿在线播放中文字幕| 国产高清原创无水印| 91制片厂的演员杨柳| 协和丈夫中文字幕| 99re.5热在线视频精品| 月份日本| 超清加勒比中文字幕o| 易发赞助的直播app国产电影| 公共场合国产偷拍| 死库水 国产偷拍| 国产主播主播精选| 大陆偷拍国产a v免费| 大学生视频国产情侣| 国产电影开头是一对情侣在床上| 冒死偷拍国产展| 国产一区 大秀视频| 台湾麻豆传媒分享| 国产偷拍 酒店在线| 国产影制服| 韩国博主| 国产在线视频www色下载| 纹身欧美小臂| 日本街头恶搞| 空姐模特知名国产职场同事亚洲| 不卡中文字幕在线幕一区二区| 国产萝莉你懂的| 国产丝袜脚五十路在线视频| http://www.roijoy.com http://www.harrydress.com http://www.caspeaks.com http://www.aobakai.net http://www.lawhitecollardefense.com http://www.m1288.com