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

     

  • 相关阅读:
    对应于 算法原型 中的“纸条”
    Hive 实际上对于所存储的文件的完整性以及数据内容是否和表结构一致无支配力
    kettle
    regularexpression_action
    Consumer Group Example
    Neural Task Programming: Learning to Generalize Across Hierarchical Tasks
    dm层 集市层 四层 Build a multi-level data strategy
    图片服务器 sns 加爬虫 免上云
    不等式放缩 维时间戳是数据仓库无时间维度的事实表的灾难 度表 事实表
    MaLoc: a practical magnetic fingerprinting approach to indoor localization using smartphones
  • 原文地址:https://www.cnblogs.com/thoupin/p/3345540.html
Copyright © 2020-2023  润新知