phpcms 源碼分析四: 數據庫類實現

  此次是逆雪寒的數據庫類分析:php

 

  1 <?php
  2         /*
  3         這個講  phpcms 的數據庫類  和  phpcms 的文本緩存的實現.看了看
  4         
  5         都是很簡單的東西.你們看着我註釋慢慢看吧.慢慢理解,最好能裝了PHPCMS 在來看.由於這樣能夠看下它的數據庫結構信息.能夠幫助理解.
  6         
  7         不明白的繼續問吧.
  8         
  9         首先是數據庫類,phpcms 的數據庫 分mysql 和mssql 版本.  MSSQL 版本的我就不說了. 
 10         他們主要的sql 語句不一樣點就在於咱們分頁經常使用到的 limit  語句.因此.在 mssql 數據庫類驅動裏.他作了個挺好的封裝.
 11         讓MYSQL 和MSSQL在SQL語句方面的差別性就很小了.能夠說PHPCMS你能夠隨便轉換數據庫只要在代碼中換下數據庫類驅動就行.
 12         [php] 
 13         <?php
 14         /*
 15         mysql數據庫類。寫得比較簡單。也沒什麼好說的。你們本身看下理解下。
 16         而後就能夠跳過了。
 17         */
 18 
 19         /*
 20          這個東西是否是很熟呀。對了。在上一章已經講過了。也已經在上一章的common.inc.php 啓動文件裏面定義了  IN_PHPCMS   
 21          因此在如下的PHP文件裏都檢測下是不是人爲」跳牆「進來的。是就中斷
 22         */
 23         defined('IN_PHPCMS') or exit('Access Denied');
 24 
 25         /*
 26         * Mysql 數據庫類,支持Cache功能
 27         */
 28         
 29         class db_mysql
 30         {
 31             
 32             /*
 33             * MySQL 鏈接標識
 34             * @var resource
 35             */
 36             var $connid;
 37             
 38             /*
 39             * 整型變量用來計算被執行的sql語句數量
 40             * @var int
 41             */
 42             var $querynum = 0;
 43             
 44             /*
 45             * 數據庫鏈接,返回數據庫鏈接標識符
 46             * @param string 數據庫服務器主機
 47             * @param string 數據庫服務器賬號
 48             * @param string 數據庫服務器密碼
 49             * @param string 數據庫名
 50             * @param bool 是否保持持續鏈接,1爲持續鏈接,0爲非持續鏈接
 51             * @return link_identifier
 52             */
 53             function connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0) 
 54             {
 55                   global $CONFIG;
 56 
 57                   /*
 58                    mysql_pconnect()  爲常鏈接。它和mysql_connect 的區別是 前者在多進程的WEB服務器上效率比較好。
 59                    但也有瑕疵就是在有關事務和數據表鎖方面。詳情請查看本身的手冊。
 60                   */
 61                   $func = $pconnect == 1 ? 'mysql_pconnect' : 'mysql_connect';
 62 
 63                   if(!$this->connid = @$func($dbhost, $dbuser, $dbpw))
 64                   {
 65                           $this->halt('Can not connect to MySQL server');
 66                   }
 67                   
 68                   // 當mysql版本爲4.1以上時,啓用數據庫字符集設置
 69                   if($this->version() > '4.1' && $CONFIG['dbcharset'])
 70                   {
 71                            mysql_query("SET NAMES '".$CONFIG['dbcharset']."'" , $this->connid);
 72                   }
 73                   
 74                   // 當mysql版本爲5.0以上時,設置sql mode,mysql5數據庫帶了字符集模式。設置下就好
 75                   if($this->version() > '5.0') 
 76                   {
 77                            mysql_query("SET sql_mode=''" , $this->connid);
 78                   }
 79                   
 80                   if($dbname) 
 81                   {
 82 //                           if($email=!@mysql_select_db($dbname)!@mysql_select_db($dbname($email) , $this->connid))
 83                            {
 84                             $this->halt('Cannot use database '.$dbname);
 85                            }
 86                   }
 87                   
 88                   return $this->connid;
 89             }
 90             
 91             /*
 92             * 選擇數據庫
 93             * @param string 數據庫名
 94             */
 95             function select_db($dbname) 
 96             {
 97                 return mysql_select_db($dbname , $this->connid);
 98             }
 99             
100             /*
101             * 執行sql語句
102             * @param string sql語句
103             * @param string 默認爲空,可選值爲 CACHE UNBUFFERED
104             * @param int Cache以 秒爲單位 的生命週期
105             * @return resource
106             */
107             function query($sql , $type = '' , $expires = 3600, $dbname = '') 
108             {
109                 /*
110                  mysql_unbuffered_query 效率更好。節省內存 看手冊
111                 */
112                   $func = $type == 'UNBUFFERED' ? 'mysql_unbuffered_query' : 'mysql_query';
113     
114                 if(!($query = $func($sql , $this->connid)) && $type != 'SILENT')
115                 {
116                        $this->halt('MySQL Query Error', $sql);
117                   }
118                   
119                   $this->querynum++;
120                   
121                   return $query;
122             }
123             
124             /*
125             * 執行sql語句,只獲得一條記錄
126             * @param string sql語句
127             * @param string 默認爲空,可選值爲 CACHE UNBUFFERED
128             * @param int Cache以秒爲單位的生命週期
129             * @return array
130             */
131             function get_one($sql, $type = '', $expires = 3600, $dbname = '')
132             {
133                   $query = $this->query($sql, $type, $expires, $dbname);
134                   
135                   $rs = $this->fetch_array($query);
136                   
137                   $this->free_result($query);
138                   
139                   return $rs ;
140             }
141             
142             /*
143             * 從結果集中取得一行做爲關聯數組
144             * @param resource 數據庫查詢結果資源
145             * @param string 定義返回類型
146             * @return array
147             */
148             function fetch_array($query, $result_type = MYSQL_ASSOC) 
149             {
150                   return mysql_fetch_array($query, $result_type);
151             }
152             
153             /*
154             * 取得前一次 MySQL 操做所影響的記錄行數
155             * @return int
156             */
157             function affected_rows() 
158             {
159                   return mysql_affected_rows($this->connid);
160             }
161             
162             /*
163             * 取得結果集中行的數目
164             * @return int
165             */
166             function num_rows($query) 
167             {
168                   return mysql_num_rows($query);
169             }
170             
171             /*
172             * 返回結果集中字段的數目
173             * @return int
174             */
175             function num_fields($query) 
176             {
177                   return mysql_num_fields($query);
178             }
179             
180             /*
181             * @return array
182             */
183             function result($query, $row) 
184             {
185                   return @mysql_result($query, $row);
186             }
187             
188             function free_result($query) 
189             {
190                   return mysql_free_result($query);
191             }
192             
193             /*
194             * 取得上一步 INSERT 操做產生的 ID 
195             * @return int
196             */
197             function insert_id() 
198             {
199                   return mysql_insert_id($this->connid);
200             }
201             
202             /*
203             * @return array
204             */
205             function fetch_row($query) 
206             {
207                   return mysql_fetch_row($query);
208             }
209             
210             /*
211             * @return string
212             */
213             function version() 
214             {
215                   return mysql_get_server_info($this->connid);
216             }
217             
218             function close() 
219             {
220                   return mysql_close($this->connid);
221             }
222             
223             /*
224             * @return string
225             */
226             function error()
227             {
228                   return @mysql_error($this->connid);
229             }
230             
231             /*
232             * @return int
233             */
234             function errno()
235             {
236                 /*
237                  mysql_errno()  函數也挺好使的哦。本身試下
238                 */
239                   return intval(@mysql_errno($this->connid)) ;
240             }
241             
242             /*
243             * 顯示mysql錯誤信息
244             */
245             function halt($message = '', $sql = '')
246             {
247                   exit("MySQL Query:$sql <br> 
248                         MySQL Error:".$this->error()." <br> 
249                         MySQL Errno:".$this->errno()." <br> 
250                         Message:$message");
251             }
252         }
253 ?>
相關文章
相關標籤/搜索