phpcms 源码分析四: 数据库类如何实现

这次是逆雪寒的数据库类分析: 1

  这次是逆雪寒的数据库类分析:

 

  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 ?>