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

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

 

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

 

 

你可能感兴趣的:(phpcms)