这次是逆雪寒的数据库类分析:
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 ?>