數據庫操作類

http://blog.csdn.net/linvo/article/details/4825933

數據庫操作類:DBCommon.class.php

  1.  //---------------------------------------------------------------------    
  2.  //      MySQL Master/Slave數據庫讀寫操作類    
  3.  //    
  4.  // 開發作者: heiyeluren    
  5.  // 版本歷史:     
  6.  //          2006-09-20  基本單數據庫操作功能, 25 個接口    
  7.  //          2007-07-30  支持單Master/多Slave數據庫操作,29個接口    
  8.  //          2008-09-07  修正了上一版本的部分Bug    
  9.  //          2009-11-17  在Master/Slave類的基礎上增加了強化單主機操作,    
  10.  //                  增加了部分簡潔操作接口和調試接口,優化了部分代碼,    
  11.  //                  本版本共42個接口    
  12.  // 應用項目: Y!NCP, Y!SNS, TM MiniSite//    
  13.  // 功能描述:自動支持Master/Slave 讀/寫 分離操作,支持多Slave主機    
  14.  //    
  15.  //-----------------------------------------------------------------------    
  16.          
  17.      
  18.          
  19.  /**  
  20.   * 常量定義  
  21.   */    
  22.  define("_DB_INSERT", 1);    
  23.  define("_DB_UPDATE", 2);    
  24.          
  25.          
  26.  /**  
  27.   * DB Common class  
  28.   *  
  29.   * 描述:能夠分別處理一臺Master寫操作,多臺Slave讀操作  
  30.   */    
  31.  class DBCommon    
  32.  {    
  33.      /**  
  34.       * 數據庫配置信息  
  35.       */    
  36.      var $wdbConf = array();    
  37.      var $rdbConf = array();    
  38.      /**  
  39.       * Master數據庫連接  
  40.       */    
  41.      var $wdbConn = null;    
  42.      /**  
  43.       * Slave數據庫連接  
  44.       */    
  45.      var $rdbConn = array();    
  46.      /**  
  47.       * 當前操作的數據庫鏈接  
  48.       */    
  49.      var $currConn = null;    
  50.      /**  
  51.       * 是否只有一臺Master數據庫服務器  
  52.       */    
  53.      var $singleHost = true;    
  54.      /**  
  55.       * 數據庫結果  
  56.       */    
  57.      var $dbResult;    
  58.      /**  
  59.       * 數據庫查詢結果集  
  60.       */    
  61.      var $dbRecord;    
  62.      
  63.      /**  
  64.       * SQL語句  
  65.       */    
  66.      var $dbSql;    
  67.      /**  
  68.       * 數據庫編碼  
  69.       */    
  70.      var $dbCharset = "UTF8";    
  71.      /**  
  72.       * 數據庫版本  
  73.       */    
  74.      var $dbVersion = "5.0";    
  75.      
  76.      
  77.      /**  
  78.       * 初始化的時候是否要連接到數據庫  
  79.       */    
  80.      var $isInitConn = false;    
  81.      /**  
  82.       * 是否要設置字符集  
  83.       */    
  84.      var $isCharset = false;    
  85.      /**  
  86.       * 數據庫結果集提取方式  
  87.       */    
  88.      var $fetchMode = MYSQL_ASSOC;    
  89.      /**  
  90.       * 執行中發生錯誤是否記錄日誌  
  91.       */    
  92.      var $isLog = false;    
  93.      /**  
  94.       * 執行中的SQL是否記錄,設定級別  
  95.       *  
  96.       * 0:不記錄     
  97.       * 1:記錄insert    
  98.       * 2:記錄insert/update    
  99.       * 3:記錄insert/update/delete    
  100.       * 4:記錄select/insert/update/delete  
  101.       */    
  102.      var $logSqlLevel = 0;    
  103.      /**  
  104.       * 記錄Log文件路徑  
  105.       */    
  106.      var $logFile = '/tmp/db_common_error.log';    
  107.      /**  
  108.       * 是否查詢出錯的時候終止腳本執行  
  109.       */    
  110.      var $isExit = false;    
  111.      /**  
  112.       * MySQL執行是否出錯了  
  113.       */    
  114.      var $isError = false;    
  115.      /**  
  116.       * MySQL執行錯誤消息  
  117.       */    
  118.      var $errMsg  = '';    
  119.      
  120.      
  121.      
  122.      //------------------------    
  123.      //    
  124.      //  類本身操作方法    
  125.      //    
  126.      //------------------------    
  127.      
  128.      /**  
  129.       * 設置類屬性  
  130.       *  
  131.       * @param str $key  需要設置的屬性名  
  132.       * @param str $value 需要設置的屬性值  
  133.       * @return void  
  134.       */    
  135.      function set($key$value){    
  136.          $this->$key = $value;    
  137.      }    
  138.      
  139.      /**  
  140.       * 讀取類屬性  
  141.       *  
  142.       * @param str $key  需要讀取的屬性名  
  143.       * @return void  
  144.       */    
  145.      function get($key){    
  146.          return $this->$key;    
  147.      }    
  148.      
  149.      
  150.      
  151.      
  152.      //------------------------    
  153.      //    
  154.      //   基礎底層操作接口    
  155.      //    
  156.      //------------------------    
  157.      
  158.      /**  
  159.       * 構造函數  
  160.       *   
  161.       * 傳遞配置信息,配置信息數組結構:  
  162.       * $masterConf = array(  
  163.       *        "host"    => Master數據庫主機地址  
  164.       *        "user"    => 登錄用戶名  
  165.       *        "pwd"    => 登錄密碼  
  166.       *        "db"    => 默認連接的數據庫  
  167.       *    );  
  168.       * $slaveConf = array(  
  169.       *        "host"    => Slave1數據庫主機地址|Slave2數據庫主機地址|...  
  170.       *        "user"    => 登錄用戶名  
  171.       *        "pwd"    => 登錄密碼  
  172.       *        "db"    => 默認連接的數據庫  
  173.       *    );  
  174.       *  
  175.       * @param bool $singleHost  是否只有一臺主機  
  176.       * @return void  
  177.       */    
  178.      function DBCommon($masterConf$slaveConf=array(), $singleHost = true){    
  179.          //構造數據庫配置信息    
  180.          if (is_array($masterConf) && !emptyempty($masterConf)){    
  181.              $this->wdbConf = $masterConf;    
  182.          }    
  183.          if (!is_array($slaveConf) || emptyempty($slaveConf)){    
  184.              $this->rdbConf = $masterConf;    
  185.          } else {    
  186.              $this->rdbConf = $slaveConf;    
  187.          }    
  188.          $this->singleHost = $singleHost;    
  189.          //初始化連接(一般不推薦)    
  190.          if ($this->isInitConn){    
  191.              $this->getDbWriteConn();  
  192. if (!$this->singleHost){ $this->getDbReadConn(); } } } /** * 
  193. 獲取Master的寫數據連接 */ function getDbWriteConn(){ //判斷是否已經連接 if  
  194. ($this->wdbConn && is_resource($this->wdbConn)) { return  
  195. $this->wdbConn; } //沒有連接則自行處理 $db =  
  196. $this->connect($this->wdbConf['host'], $this->wdbConf['user'],  
  197. $this->wdbConf['pwd'], $this->wdbConf['db']); if (!$db ||  
  198. !is_resource($db)) { return false; } $this->wdbConn = $dbreturn  
  199. $this->wdbConn; } /** * 獲取Slave的讀數據連接 */ function getDbReadConn(){  
  200. //如果有可用的Slave連接,隨機挑選一臺Slave if (is_array($this->rdbConn) &&  
  201. !emptyempty($this->rdbConn)) { $key = array_rand($this->rdbConn);  
  202. if (isset($this->rdbConn[$key]) &&  
  203. is_resource($this->rdbConn[$key])) { return $this->rdbConn[$key];  
  204. } } //連接到所有Slave數據庫,如果沒有可用的Slave機則調用Master $arrHost = explode("|",  
  205. $this->rdbConf['host']); if (!is_array($arrHost) ||  
  206. emptyempty($arrHost)){ return $this->getDbWriteConn(); }  
  207. $this->rdbConn = array(); foreach($arrHost as $tmpHost){ $db =  
  208. $this->connect($tmpHost$this->rdbConf['user'],  
  209. $this->rdbConf['pwd'], $this->rdbConf['db']); if ($db &&  
  210. is_resource($db)){ $this->rdbConn[] = $db; } }  
  211. //如果沒有一臺可用的Slave則調用Master if (!is_array($this->rdbConn) ||  
  212. emptyempty($this->rdbConn)){ $this->errorLog("Not availability  
  213. slave db connection, call master db connection"); return  
  214. $this->getDbWriteConn(); } //隨機在已連接的Slave機中選擇一臺 $key =  
  215. array_rand($this->rdbConn); if (isset($this->rdbConn[$key])  
  216. && is_resource($this->rdbConn[$key])){ return  
  217. $this->rdbConn[$key]; }  
  218. //如果選擇的slave機器是無效的,並且可用的slave機器大於一臺則循環遍歷所有能用的slave機器 if  
  219. (count($this->rdbConn) > 1){ foreach($this->rdbConn as $conn){  
  220. if (is_resource($conn)){ return $conn; } } }  
  221. //如果沒有可用的Slave連接,則繼續使用Master連接 return $this->getDbWriteConn(); } /**  
  222. * 連接到MySQL數據庫公共方法 */ function connect($dbHost$dbUser$dbPasswd,  
  223. $dbDatabase){ //連接數據庫主機 $db = mysql_connect($dbHost, $dbUser,  
  224. $dbPasswd); if (!$db) { $this->errorLog("Mysql connect "$dbHost ."  
  225. failed"); return false; } //選定數據庫 if (!mysql_select_db($dbDatabase,  
  226. $db)) { $this->errorLog("select db $dbDatabase failed"$db); return  
  227. false; } //設置字符集 if ($this->isCharset){ if ( $this->dbVersion ==  
  228. '' ){ $res = mysql_query("SELECT VERSION()"); $this->dbVersion =  
  229. mysql_result($res, 0); } if ($this->dbCharset!='' &&  
  230. preg_match("/^(5.|4.1)/"$this->dbVersion)){ if (mysql_query("SET  
  231. NAMES '".$this->dbCharset."'", $db) === false){  
  232. $this->errorLog("Set db_host '$dbHost' charset=".  
  233. $this->dbCharset ." failed."$db); return false; } } } return $db;  
  234. /** * 關閉數據庫連接 */ function disconnect($dbConn=null, $closeAll=false){  
  235. //關閉指定數據庫連接 if ($dbConn && is_resource($dbConn)){  
  236. mysql_close($dbConn); $dbConn = null; } //關閉所有數據庫連接 if ($closeAll){ if  
  237. ($this->rdbConn && is_resource($this->rdbConn)){  
  238. mysql_close($this->rdbConn); $this->rdbConn = null;    
  239.              }    
  240.              if (is_array($this->rdbConn) && !emptyempty($this->rdbConn)){    
  241.                  foreach($this->rdbConn as $conn){    
  242.                      if ($conn && is_resource($conn)){    
  243.                          mysql_close($conn);    
  244.                      }    
  245.                  }    
  246.                  $this->rdbConn = array();    
  247.              }    
  248.          }    
  249.          return true;    
  250.      }    
  251.      
  252.      /**  
  253.       * 選擇數據庫  
  254.       */    
  255.      function selectDb($dbName$dbConn=null){    
  256.          //重新選擇一個連接的數據庫    
  257.          if ($dbConn && is_resource($dbConn)){    
  258.              if (!mysql_select_db($dbName$dbConn)){    
  259.                  $this->errorLog("Select database:$dbName failed."$dbConn);    
  260.                  return false;    
  261.              }    
  262.              return true;    
  263.          }    
  264.          //重新選擇所有連接的數據庫    
  265.          if ($this->wdbConn && is_resource($this->wdbConn)){    
  266.              if (!mysql_select_db($dbName$this->wdbConn)){    
  267.                  $this->errorLog("Select database:$dbName failed."$this->wdbConn);    
  268.                  return false;    
  269.              }    
  270.          }    
  271.          if (is_array($this->rdbConn && !emptyempty($this->rdbConn))){    
  272.              foreach($this->rdbConn as $conn){    
  273.                  if ($conn && is_resource($conn)){    
  274.                      if (!mysql_select_db($dbName$conn)){    
  275.                          $this->errorLog("Select database:$dbName failed."$conn);    
  276.                          return false;    
  277.                      }    
  278.                  }    
  279.              }    
  280.          }    
  281.          return true;    
  282.      }    
  283.      
  284.      /**  
  285.       * 執行SQL語句(底層操作)  
  286.       */    
  287.      function _query($sql$isMaster=false){    
  288.          if (trim($sql) == ""){    
  289.              $this->errorLog("Sql query is empty.");    
  290.              return false;    
  291.          }    
  292.          //是否只有一臺數據庫機器    
  293.          if ($this->singleHost){    
  294.              $isMaster = true;       
  295.          }    
  296.      
  297.          //獲取執行SQL的數據庫連接    
  298.          if (!$isMaster){    
  299.              $optType = trim(strtolower(substr(ltrim($sql), 0, 6)));    
  300.          }    
  301.          if ($isMaster || $optType!="select"){    
  302.              $dbConn = $this->getDbWriteConn();    
  303.          } else {    
  304.              $dbConn = $this->getDbReadConn();    
  305.          }    
  306.          if (!$dbConn || !is_resource($dbConn)){    
  307.              $this->isError = true;    
  308.              $this->errMsg  = 'Not availability db connection.';    
  309.              $this->currConn = null;    
  310.      
  311.              $this->errorLog("Not availability db connection. Query SQL:"$sql);    
  312.              if ($this->isExit) {    
  313.                  exit;    
  314.              }    
  315.              return false;    
  316.          }    
  317.          //記錄執行的SQL    
  318.          if ($this->logSqlLevel){    
  319.              $isLog = false;    
  320.              $logLevel = $this->logSqlLevel;    
  321.              if ($logLevel==1 && in_array($optTypearray('insert'))){    
  322.                  $isLog = true;    
  323.              }    
  324.              if ($logLevel==2 && in_array($optTypearray('insert''update'))){    
  325.                  $isLog = true;    
  326.              }    
  327.              if ($logLevel==3 && in_array($optTypearray('insert''update''delete'))){    
  328.                  $isLog = true;    
  329.              }    
  330.              if ($logLevel==4 && in_array($optTypearray('insert''update''delete''select'))){    
  331.                  $isLog = true;    
  332.              }    
  333.              if ($isLog){    
  334.                  $this->errorLog($sql);    
  335.              }    
  336.          }    
  337.      
  338.          //執行查詢    
  339.          $this->currConn = $dbConn;    
  340.          $this->dbSql = $sql;    
  341.          $this->dbResult = null;    
  342.          $this->dbResult = @mysql_query($sql$dbConn);    
  343.          if ($this->dbResult === false){    
  344.              $this->isError = true;    
  345.              $this->errMsg  = 'MySQL errno:'. mysql_errno($dbConn) .', error:'. mysql_error($dbConn);    
  346.              $this->errorLog("Query sql failed. SQL:".$sql$dbConn);    
  347.              if ($this->isExit) {    
  348.                  exit;    
  349.              }    
  350.              return false;    
  351.          }    
  352.      
  353.          $this->isError = false;    
  354.          $this->errMsg  = '';    
  355.      
  356.          return true;    
  357.      }    
  358.      
  359.      /**  
  360.       * 錯誤日誌  
  361.       */    
  362.      function errorLog($msg=''$conn=null){    
  363.          if (!$this->isLog){    
  364.              return;    
  365.          }    
  366.          if ($msg=='' && !$conn) {    
  367.              return false;    
  368.          }    
  369.          $log = "MySQL Error: $msg";    
  370.          if ($conn && is_resource($conn)) {    
  371.              $log .= " mysql_msg:". mysql_error($conn);    
  372.          }    
  373.          $log .= " ["date("Y-m-d H:i:s") ."]";    
  374.          if ($this->logFile != ''){    
  375.              error_log($log ."/n", 3, $this->logFile);    
  376.          } else {    
  377.              error_log($log);    
  378.          }    
  379.          return true;    
  380.      }    
  381.      
  382.      
  383.      
  384.      //--------------------------    
  385.      //    
  386.      //       數據獲取接口    
  387.      //    
  388.      //--------------------------    
  389.      /**  
  390.       * 獲取SQL執行的全部結果集(二維數組)  
  391.       *  
  392.       * @param string $sql 需要執行查詢的SQL語句  
  393.       * @return 成功返回查詢結果的二維數組,失敗返回false, 數據空返回NULL  
  394.       */    
  395.      function getAll($sql$isMaster=false){    
  396.          if (!$this->_query($sql$isMaster)){    
  397.              return false;    
  398.          }    
  399.          $this->dbRecord = array();    
  400.          while ($row = @mysql_fetch_array($this->dbResult, $this->fetchMode)) {    
  401.              $this->dbRecord[] = $row;    
  402.          }    
  403.          @mysql_free_result($this->dbResult);    
  404.          if (!is_array($this->dbRecord) || emptyempty($this->dbRecord)){    
  405.              return NULL;    
  406.          }    
  407.          return $this->dbRecord;    
  408.      }    
  409.      
  410.      /**  
  411.       * 獲取單行記錄(一維數組)  
  412.       *  
  413.       * @param string $sql 需要執行查詢的SQL語句  
  414.       * @return 成功返回結果記錄的一維數組,失敗返回false, 數據空返回NULL  
  415.       */    
  416.      function getRow($sql$isMaster=false){    
  417.          if (!$this->_query($sql$isMaster)){    
  418.              return false;    
  419.          }    
  420.          $this->dbRecord = array();    
  421.          $this->dbRecord = @mysql_fetch_array($this->dbResult, $this->fetchMode);    
  422.          @mysql_free_result($this->dbResult);    
  423.          if (!is_array($this->dbRecord) || emptyempty($this->dbRecord)){    
  424.              return NULL;    
  425.          }    
  426.          return $this->dbRecord;    
  427.      }    
  428.      
  429.      /**  
  430.       * 獲取一列數據(一維數組)  
  431.       *  
  432.       * @param string $sql 需要獲取的字符串  
  433.       * @param string $field 需要獲取的列,如果不指定,默認是第一列  
  434.       * @return 成功返回提取的結果記錄的一維數組,失敗返回false, 數據空返回NULL  
  435.       */    
  436.      function getCol($sql$field=''$isMaster=false){    
  437.          if (!$this->_query($sql$isMaster)){    
  438.              return false;    
  439.          }    
  440.          $this->dbRecord = array();    
  441.          while($row = @mysql_fetch_array($this->dbResult, $this->fetchMode)){    
  442.              if (trim($field) == ''){    
  443.                  $this->dbRecord[] = current($row);    
  444.              } else {    
  445.                  $this->dbRecord[] = $row[$field];    
  446.              }    
  447.          }    
  448.          @mysql_free_result($this->dbResult);    
  449.          if (!is_array($this->dbRecord) || emptyempty($this->dbRecord)){    
  450.              return NULL;    
  451.          }    
  452.          return $this->dbRecord;    
  453.      }    
  454.      
  455.      /**  
  456.       * 獲取一個數據(當條數組)  
  457.       *  
  458.       * @param string $sql 需要執行查詢的SQL  
  459.       * @return 成功返回獲取的一個數據,失敗返回false, 數據空返回NULL  
  460.       */    
  461.      function getOne($sql$field=''$isMaster=false){    
  462.          if (!$this->_query($sql$isMaster)){    
  463.              return false;    
  464.          }    
  465.          $this->dbRecord = array();    
  466.          $row = @mysql_fetch_array($this->dbResult, $this->fetchMode);    
  467.          @mysql_free_result($this->dbResult);    
  468.          if (!is_array($row) || emptyempty($row)){    
  469.              return NULL;    
  470.          }    
  471.          if (trim($field) != ''){    
  472.              $this->dbRecord = $row[$field];    
  473.          }else{    
  474.              $this->dbRecord = current($row);    
  475.          }    
  476.          return $this->dbRecord;    
  477.      }    
  478.      
  479.      
  480.      
  481.      /**  
  482.       * 獲取指定各種條件的記錄  
  483.       *  
  484.       * @param string $table 表名(訪問的數據表)  
  485.       * @param string $field 字段(要獲取的字段)  
  486.       * @param string $where 條件(獲取記錄的條件語句,不包括WHERE,默認爲空)  
  487.       * @param string $order 排序(按照什麼字段排序,不包括ORDER BY,默認爲空)  
  488.       * @param string $limit 限制記錄(需要提取多少記錄,不包括LIMIT,默認爲空)  
  489.       * @param bool $single 是否只是取單條記錄(是調用getRow還是getAll,默認是false,即調用getAll)  
  490.       * @return 成功返回記錄結果集的數組,失敗返回false  
  491.       */    
  492.      function getRecord($table$field='*'$where=''$order=''$limit=''$single=false, $isMaster=false){    
  493.          $sql = "SELECT $field FROM $table";    
  494.          $sql .= trim($where)!='' ? " WHERE $where " : $where;    
  495.          $sql .= trim($order)!='' ? " ORDER BY $order " : $order;    
  496.          $sql .= trim($limit)!='' ? " LIMIT $limit " : $limit;    
  497.          if ($single){    
  498.              return $this->getRow($sql$isMaster);    
  499.          }    
  500.          return $this->getAll($sql$isMaster);    
  501.      }    
  502.      
  503.      /**  
  504.       * 獲取指點各種條件的記錄(跟getRecored類似)  
  505.       *  
  506.       * @param string $table 表名(訪問的數據表)  
  507.       * @param string $field 字段(要獲取的字段)  
  508.       * @param string $where 條件(獲取記錄的條件語句,不包括WHERE,默認爲空)  
  509.       * @param array $order_arr 排序數組(格式類似於: array('id'=>true), 那麼就是按照ID爲順序排序, array('id'=>false), 就是按照ID逆序排序)  
  510.       * @param array $limit_arr 提取數據的限制數組()  
  511.       * @return unknown  
  512.       */    
  513.      function getRecordByWhere($table$field='*'$where=''$arrOrder=array(), $arrLimit=array(), $isMaster=false){    
  514.          $sql = " SELECT $field FROM $table ";    
  515.          $sql .= trim($where)!='' ? " WHERE $where " : $where;    
  516.          if (is_array($arrOrder) && !emptyempty($arrOrder)){    
  517.              $arrKey = key($arrOrder);    
  518.              $sql .= " ORDER BY $arrKey " . ($arrOrder[$arrKey] ? "ASC" : "DESC");    
  519.          }    
  520.          if (is_array($arrLimit) && !emptyempty($arrLimit)){    
  521.              $startPos = intval(array_shift($arrLimit));    
  522.              $offset = intval(array_shift($arrLimit));    
  523.              $sql .= " LIMIT $startPos,$offset ";    
  524.          }    
  525.          return $this->getAll($sql$isMaster);    
  526.      }    
  527.      
  528.      /**  
  529.       * 獲取指定條數的記錄  
  530.       *  
  531.       * @param string $table 表名  
  532.       * @param int $startPos 開始記錄  
  533.       * @param int $offset 偏移量  
  534.       * @param string $field 字段名  
  535.       * @param string $where 條件(獲取記錄的條件語句,不包括WHERE,默認爲空)  
  536.       * @param string $order 排序(按照什麼字段排序,不包括ORDER BY,默認爲空)  
  537.       * @return 成功返回包含記錄的二維數組,失敗返回false  
  538.       */    
  539.      function getRecordByLimit($table$startPos$offset$field='*'$where=''$oder=''$isMaster=false){    
  540.          $sql = " SELECT $field FROM $table ";    
  541.          $sql .= trim($where)!='' ? " WHERE $where " : $where;    
  542.          $sql .= trim($order)!='' ? " ORDER BY $order " : $order;    
  543.          $sql .= " LIMIT $startPos,$offset ";    
  544.          return $this->getAll($sql$isMaster);    
  545.      }    
  546.      
  547.      /**  
  548.       * 獲取排序記錄  
  549.       *  
  550.       * @param string $table 表名  
  551.       * @param string $orderField 需要排序的字段(比如id)  
  552.       * @param string $orderMethod 排序的方式(1爲順序, 2爲逆序, 默認是1)  
  553.       * @param string $field 需要提取的字段(默認是*,就是所有字段)  
  554.       * @param string $where 條件(獲取記錄的條件語句,不包括WHERE,默認爲空)  
  555.       * @param string $limit 限制記錄(需要提取多少記錄,不包括LIMIT,默認爲空)  
  556.       * @return 成功返回記錄的二維數組,失敗返回false  
  557.       */    
  558.      function getRecordByOrder($table$orderField$orderMethod=1, $field='*'$where=''$limit=''$isMaster=false){    
  559.          //$order_method的值爲1則爲順序, $order_method值爲2則2則是逆序排列    
  560.          $sql = " SELECT $field FROM $table ";    
  561.          $sql .= trim($where)!='' ? " WHERE $where " : $where;    
  562.          $sql .= " ORDER BY $orderField " . ( $orderMethod==1 ? "ASC" : "DESC");    
  563.          $sql .= trim($limit)!='' ? " LIMIT $limit " : $limit;    
  564.          return $this->getAll($sql$isMaster);    
  565.      }    
  566.      
  567.      /**  
  568.       * 分頁查詢(限制查詢的記錄條數)  
  569.       *  
  570.       * @param string $sql 需要查詢的SQL語句  
  571.       * @param int $startPos 開始記錄的條數  
  572.       * @param int $offset 每次的偏移量,需要獲取多少條  
  573.       * @return 成功返回獲取結果記錄的二維數組,失敗返回false  
  574.       */    
  575.      function limit_query($sql$startPos$offset$isMaster=false){    
  576.          $start_pos = intval($startPos);    
  577.          $offset = intval($offset);    
  578.          $sql = $sql . " LIMIT $startPos,$offset ";    
  579.          return $this->getAll($sql$isMaster);    
  580.      }    
  581.      
  582.      
  583.      //--------------------------    
  584.      //    
  585.      //     無數據返回操作接口    
  586.      //    
  587.      //--------------------------    
  588.      /**  
  589.       * 執行執行非Select查詢操作  
  590.       *  
  591.       * @param string $sql 查詢SQL語句  
  592.       * @return bool  成功執行返回true, 失敗返回false  
  593.       */    
  594.      function execute($sql$isMaster=false){    
  595.          if (!$this->_query($sql$isMaster)){    
  596.              return false;    
  597.          }    
  598.          return true;    
  599.          /*$count = @mysql_affected_rows($this->dbLink);  
  600.          if ($count <= 0){  
  601.              return false;  
  602.          }  
  603.          return true;*/    
  604.      }    
  605.      
  606.      /**  
  607.       * 自動執行操作(針對Insert/Update操作)  
  608.       *  
  609.       * @param string $table 表名  
  610.       * @param array $field_array 字段數組(數組中的鍵相當於字段名,數組值相當於值, 類似 array( 'id' => 100, 'user' => 'heiyeluren')  
  611.       * @param int $mode 執行操作的模式 (是插入還是更新操作, 1是插入操作Insert, 2是更新操作Update)  
  612.       * @param string $where 如果是更新操作,可以添加WHERE的條件  
  613.       * @return bool 執行成功返回true, 失敗返回false  
  614.       */    
  615.      function autoExecute($table$arrField$mode$where=''$isMaster=false){    
  616.          if ($table=='' || !is_array($arrField) || emptyempty($arrField)){    
  617.              return false;    
  618.          }    
  619.          //$mode爲1是插入操作(Insert), $mode爲2是更新操作    
  620.          if ($mode == 1){    
  621.              $sql = " INSERT INTO `$table` SET ";    
  622.          } elseif ($mode == 2) {    
  623.              $sql = " UPDATE `$table` SET ";    
  624.          } else {    
  625.              $this->errorLog("Operate type '$mode' is error, in call DB::autoExecute process table $table.");    
  626.              return false;    
  627.          }    
  628.          foreach ($arrField as $key => $value){    
  629.              $sql .= "`$key`='$value',";    
  630.          }    
  631.          $sql = rtrim($sql',');    
  632.          if ($mode==2 && $where!=''){    
  633.              $sql .= "WHERE $where";    
  634.          }    
  635.          return $this->execute($sql$isMaster);    
  636.      }    
  637.      
  638.      /**  
  639.       * 鎖表表  
  640.       *  
  641.       * @param string $tblName 需要鎖定表的名稱  
  642.       * @return mixed 成功返回執行結果,失敗返回錯誤對象  
  643.       */    
  644.      function lockTable($tblName){    
  645.          return $this->_query("LOCK TABLES $tblName", true);    
  646.      }    
  647.      
  648.      /**  
  649.       * 對鎖定表進行解鎖  
  650.       *  
  651.       * @param string $tblName 需要鎖定表的名稱  
  652.       * @return mixed 成功返回執行結果,失敗返回錯誤對象  
  653.       */    
  654.      function unlockTable($tblName){    
  655.          return $this->_query("UNLOCK TABLES $tblName", true);    
  656.      }    
  657.      
  658.      /**  
  659.       * 設置自動提交模塊的方式(針對InnoDB存儲引擎)  
  660.       * 一般如果是不需要使用事務模式,建議自動提交爲1,這樣能夠提高InnoDB存儲引擎的執行效率,如果是事務模式,那麼就使用自動提交爲0  
  661.       *  
  662.       * @param bool $autoCommit 如果是true則是自動提交,每次輸入SQL之後都自動執行,缺省爲false  
  663.       * @return mixed 成功返回true,失敗返回錯誤對象  
  664.       */    
  665.      function setAutoCommit($autoCommit = false){    
  666.          $autoCommit = ( $autoCommit ? 1 : 0 );    
  667.          return $this->_query("SET AUTOCOMMIT = $autoCommit", true);    
  668.      }    
  669.      
  670.      /**  
  671.       * 開始一個事務過程(針對InnoDB引擎,兼容使用 BEGIN 和 START TRANSACTION)  
  672.       *  
  673.       * @return mixed 成功返回true,失敗返回錯誤對象  
  674.       */    
  675.      function startTransaction(){    
  676.          if (!$this->_query("BEGIN")){    
  677.              return $this->_query("START TRANSACTION", true);    
  678.          }    
  679.      }    
  680.      
  681.      /**  
  682.       * 提交一個事務(針對InnoDB存儲引擎)  
  683.       *  
  684.       * @return mixed 成功返回true,失敗返回錯誤對象  
  685.       */    
  686.      function commit(){    
  687.          if (!$this->_query("COMMIT", true)){    
  688.              return false;    
  689.          }    
  690.          return $this->setAutoCommit( true );    
  691.      }    
  692.      
  693.      /**  
  694.       * 發生錯誤,會滾一個事務(針對InnoDB存儲引擎)  
  695.       *  
  696.       * @return mixed 成功返回true,失敗返回錯誤對象  
  697.       */    
  698.      
  699.      function rollback(){    
  700.          if (!$this->_query("ROLLBACK", true)){    
  701.              return false;    
  702.          }    
  703.          return $this->setAutoCommit( true );    
  704.      }    
  705.      
  706.      
  707.      
  708.      //--------------------------    
  709.      //    
  710.      //    其他數據操作接口    
  711.      //    
  712.      //--------------------------    
  713.      
  714.      /**  
  715.       * 獲取上次插入操作的的ID  
  716.       *  
  717.       * @return int 如果沒有連接或者查詢失敗,返回0, 成功返回ID  
  718.       */    
  719.      function getLastId(){    
  720.          $dbConn = $this->getDbWriteConn();    
  721.          if (($lastId = mysql_insert_id($dbConn)) > 0){    
  722.              return $lastId;    
  723.          }    
  724.          return $this->getOne("SELECT LAST_INSERT_ID()"'', true);    
  725.      }    
  726.      
  727.      /**  
  728.       * 獲取記錄集裏面的記錄條數 (用於Select操作)  
  729.       *  
  730.       * @return int 如果上一次無結果集或者記錄結果集爲空,返回0, 否則返回結果集數量  
  731.       */    
  732.      function getNumRows($res=null){    
  733.          if (!$res || !is_resource($res)){    
  734.              $res = $this->dbResult;    
  735.          }    
  736.          return mysql_num_rows($res);    
  737.      }    
  738.      
  739.      /**  
  740.       * 獲取受到影響的記錄數量 (用於Update/Delete/Insert操作)  
  741.       *  
  742.       * @return int 如果沒有連接或者影響記錄爲空, 否則返回影響的行數量  
  743.       */    
  744.      function getAffectedRows(){    
  745.          $dbConn = $this->getDbWriteConn();    
  746.          if ( ($affetedRows = mysql_affected_rows($dbConn)) <= 0){    
  747.              return $affetedRows;    
  748.          }    
  749.          return $this->getOne("SELECT ROW_COUNT()""", true);            
  750.      }    
  751.      
  752.      
  753.      
  754.      
  755.      //--------------------------    
  756.      //    
  757.      //    監測開發調試接口    
  758.      //    
  759.      //--------------------------    
  760.      
  761.      /**  
  762.       * 獲取最後一次查詢的SQL語句  
  763.       *  
  764.       * @return string 返回最後一次查詢的SQL語句  
  765.       */    
  766.      function getLastSql(){    
  767.          return $this->dbSql;    
  768.      }    
  769.      
  770.      /**  
  771.       * 返回SQL最後操作的數據庫記錄結果集  
  772.       *  
  773.       * @return mixed 最後結果集,可能是數組或者普通單個元素值  
  774.       */    
  775.      function getDBRecord(){    
  776.          return $this->dbRecord;    
  777.      }    
  778.      
  779.      /**  
  780.       * 獲取當前操作的數據庫連接資源  
  781.       *  
  782.       * @return resouce 返回當前正在執行操作的數據庫鏈接資源  
  783.       */    
  784.      function getCurrConnection(){    
  785.          return $this->currConn;    
  786.      }    
  787.      
  788.      /**  
  789.       * SQL 執行是否出錯  
  790.       *   
  791.       * @return bool   
  792.       */    
  793.      function isError(){    
  794.          return $this->isError;    
  795.      }    
  796.      
  797.      /**  
  798.       * SQL 執行錯誤消息  
  799.       *   
  800.       * @return string  
  801.       */    
  802.      function getError(){    
  803.          return $this->errMsg;    
  804.      }    
  805.      
  806.      
  807.      /**  
  808.       * 輸出所有類屬性和SQL  
  809.       *  
  810.       * @param bool $format 使用哪種打印方式, false爲 print_r, true爲var_dump  
  811.       * @return void  
  812.       */    
  813.      function p($format = false){    
  814.          echo "<h3>DBCommon Debug info</h3> <br />/n";    
  815.          echo "Execute SQL: <b>"$this->getLastSql() ."</b>  <br />/n";    
  816.          echo "MySQL Error: <b>"$this->getError() ."</b>  <br />/n";    
  817.          echo "<br />Other Attribute: <pre>/n";    
  818.          $vars = get_object_vars($this);    
  819.          if ($format){    
  820.              var_dump($vars);    
  821.          } else {    
  822.              print_r($vars);             
  823.          }    
  824.          echo "</pre>/n<br /><br /><h5>Debug done.</h5>";    
  825.      }    
  826.          
  827.      /**  
  828.       * 輸出所有類方法名  
  829.       *   
  830.       * @return void  
  831.       */    
  832.      function m()    
  833.      {    
  834.          $class = get_class($this);    
  835.          $arr = get_class_methods($class);    
  836.          echo "<h3>$class method list</h3><br />/n";    
  837.          foreach ($arr as $method) {    
  838.              echo "/t  $method() <br />/n";    
  839.          }    
  840.      }    
  841.      
  842.      /**  
  843.       * 調試函數  
  844.       *  
  845.       * @param bool $format 使用哪種打印方式, false爲 print_r, true爲var_dump  
  846.       * @return void  
  847.       */    
  848.      function debug($format = false, $printMethod = false){    
  849.          $this->p($format);    
  850.          if ($printMethod){    
  851.              $this->m();    
  852.          }    
  853.      }    
  854.      
  855.      
  856.      
  857.      
  858.      //--------------------------------    
  859.      //    
  860.      //    兼容 TMService 的簡潔接口    
  861.      //    
  862.      //--------------------------------    
  863.      
  864.      /**  
  865.       * 查詢結果:二維數組返回  
  866.       *   
  867.       * @param string $sql 需要執行的SQL  
  868.       * @return 成功返回獲取的二維數組,失敗返回false, 數據空返回NULL  
  869.       */    
  870.      function query($sql){    
  871.          return $this->getAll($sql);    
  872.      }    
  873.      
  874.      /**  
  875.       * 插入數據  
  876.       *  
  877.       * @param array $field_array 字段數組(數組中的鍵相當於字段名,數組值相當於值, 類似 array( 'id' => 100, 'user' => 'heiyeluren')  
  878.       * @param string $table 表名  
  879.       * @return bool 執行成功返回true, 失敗返回false  
  880.       */    
  881.      function insert($arrField$table){    
  882.          return $this->autoExecute($table$arrField, 1);    
  883.      }    
  884.      
  885.      /**  
  886.       * 更新數據  
  887.       *  
  888.       * @param array $field_array 字段數組(數組中的鍵相當於字段名,數組值相當於值, 類似 array( 'id' => 100, 'user' => 'heiyeluren')  
  889.       * @param string $table 表名  
  890.       * @param string $where 如果是更新操作,可以添加WHERE的條件  
  891.       * @return bool 執行成功返回true, 失敗返回false  
  892.       */    
  893.      function update($arrField$where$table){    
  894.          if (trim($where) == ''){    
  895.              return false;    
  896.          }    
  897.          return $this->autoExecute($table$arrField, 2, $where);    
  898.      }    
  899.      
  900.      /**  
  901.       * 獲取某個表的Count  
  902.       *   
  903.       * @param array $arrField 需要處理的where條件的key,value  
  904.       * @param string $table 需要獲取的表名  
  905.       * @return 成功返回獲取的一個整數值,失敗返回false, 數據空返回NULL  
  906.       */    
  907.      function getCount($arrField$notFields$table){    
  908.          $sql = "SELECT COUNT(1) as cnt FROM ".$table." WHERE ";    
  909.          foreach ($arrField as $key => $value){    
  910.              $sql .= " `$key`='$value' AND ";    
  911.          }    
  912.          if (!emptyempty($notFields)){    
  913.              foreach ($arrField as $key => $value){    
  914.                  $sql .= " `$key`!='$value' AND ";    
  915.              }    
  916.          }    
  917.          $sql .= " 1 ";    
  918.          $row = $this->getOne($sql);    
  919.          if ($row===NULL || $row===false){    
  920.              return $row;    
  921.          }    
  922.          if (is_array($row)){    
  923.              return (int)current($row);    
  924.          }    
  925.          return (int)$row;    
  926.      }    
  927.          
  928.      
  929.  }     

 

調用上面數據庫操作對象:

  1. /**  
  2.  * 工廠模式對象獲取  
  3.  *  
  4.  */    
  5. class common    
  6. {    
  7.     /**  
  8.      * 數據庫單例對象  
  9.      */    
  10.     public static $db = NULL;    
  11.     
  12.     /**  
  13.      * 獲取數據庫對象  
  14.      *  
  15.      *  
  16.      *  
  17.       數據庫使用示例和介紹:  
  18.       $db = common::getDB();  
  19.   
  20.       //簡潔接口  
  21.       $db->query($sql);  //查詢,二維數組 (兼容TM)  
  22.       $db->insert($arr, $table); //插入數據 (兼容TM)  
  23.       $db->update($arr, $where, $table); //更新數據 (兼容TM)  
  24.       $db->getCount($arr, $notfield, $table); //獲取數量 (兼容TM)  
  25.   
  26.       //基本數據操作接口  
  27.       $db->getAll($sql); //讀取所有數據,二維數組  
  28.       $db->getRow($sql); //讀取一行記錄,一維數組  
  29.       $db->getCol($sql); //讀取一列記錄,一維數組  
  30.       $db->getOne($sql); //獲取單個單元值  
  31.       $db->execute($sql); //純執行SQL,返回true或false  
  32.       $db->getNumRows(); //獲取上一次select操作記錄結果集總數  
  33.       $db->getAffectedRows(); //獲取上個操作影響的行數  
  34.   
  35.       //方便開發調試接口  
  36.       $db->debug();  //打印調試信息  
  37.       $db->isError(); //SQL是否執行錯誤,true爲有錯誤,false爲沒有錯誤  
  38.       $db->getError(); //SQL執行錯誤消息  
  39.       $db->getLastSql(); //獲取最後一條執行的SQL  
  40.       $db->getCurrConnection(); //獲取當前數據庫連接,方便直接自主操作MySQL  
  41.      */    
  42.     public static function getDB(){    
  43.         if (is_object(self::$db)){    
  44.             return self::$db;    
  45.         }    
  46.         $cryption = new TMCryption();    
  47.         $config = array(    
  48.             "host"  => 'localhost',    
  49.             "user"  => 'root',    
  50.             "pwd"   => '',    
  51.             "db"    => 'test',    
  52.         );    
  53.         self::$db = new DBCommon($configarray(), true);    
  54.         self::$db->set('isCharset', false);    
  55.         self::$db->query("SET NAMES utf8");    
  56.     
  57.         return self::$db;    
  58.     }   


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章