zoukankan      html  css  js  c++  java
  • 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 ?>

     

  • 相关阅读:
    MS SQL Server备份与恢复实例
    如何加快查询,优化数据库
    使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
    URL重写可删节日期模式正则表达式之强力应用
    索引全攻略
    大数据量分页存储过程效率测试附代码
    形成查询结果(实体框架) 使用导航属性导航关系
    C#开源资源大汇总
    大数据量的系统的数据库结构如何设计?
    数据库查询优化
  • 原文地址:https://www.cnblogs.com/thoupin/p/3345540.html
Copyright © 2011-2022 走看看