此次是逆雪寒的數據庫類分析: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 ?>