首页
站长论坛BBS
救助
投稿
discuz视频教程
discuz技术支持
版块
登录
快速注册

discuz X论坛 db_mysql类分析

建站高手 2015-6-30 [Discuz开发] 来自PC 复制链接
04626
discuz使用视频教程
31idc

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
  1. /*
  2. *数据库操作类
  3. */
  4. class db_mysql
  5. {
  6.         var $tablepre;
  7.         var $version = '';
  8.         var $querynum = 0;
  9.         var $curlink;
  10.         var $link = array();
  11.         var $config = array();
  12.         var $sqldebug = array();
  13.         var $map = array();
  14.         /*构造函数,读入数据库相关配置*/
  15.         function db_mysql($config = array()) {
  16.                 if(!empty($config)) {
  17.                         $this->set_config($config);
  18.                 }
  19.         }
  20.         /*
  21.          *设置数据库配置信息,设置表前缀
  22.          *不理解,这个$config里面的数据是怎么来的,也没见有赋值呀?
  23.          *配置文件里的数据库配置信息是在$_config这个数组里存的,
  24.          */
  25.         function set_config($config) {
  26.                 $this->config = &$config;
  27.                 $this->tablepre = $config['1']['tablepre'];
  28.                 if(!empty($this->config['map'])) {
  29.                         $this->map = $this->config['map'];
  30.                 }
  31.         }
  32.         /*连接数据库*/
  33.         function connect($serverid = 1) {

  34.                 if(empty($this->config) || empty($this->config[$serverid])) {
  35.                         $this->halt('config_db_not_found');//配置文件出错,则输出错误信息
  36.                 }

  37.                 $this->link[$serverid] = $this->_dbconnect(
  38.                         $this->config[$serverid]['dbhost'],
  39.                         $this->config[$serverid]['dbuser'],
  40.                         $this->config[$serverid]['dbpw'],
  41.                         $this->config[$serverid]['dbcharset'],
  42.                         $this->config[$serverid]['dbname'],
  43.                         $this->config[$serverid]['pconnect']
  44.                         );
  45.                 $this->curlink = $this->link[$serverid];               
  46.         }
  47.         /*数据库连接验证!*/
  48.         function _dbconnect($dbhost, $dbuser, $dbpw, $dbcharset, $dbname, $pconnect) {
  49.                 $link = null;
  50.                 $func = empty($pconnect) ? 'mysql_connect' : 'mysql_pconnect';
  51.                 if(!$link = @$func($dbhost, $dbuser, $dbpw, 1)) {
  52.                         $this->halt('notconnect');
  53.                 } else {
  54.                         $this->curlink = $link;
  55.                         if($this->version() > '4.1') {//版本检测
  56.                                 $dbcharset = $dbcharset ? $dbcharset : $this->config[1]['dbcharset'];
  57.                                 $serverset = $dbcharset ? 'character_set_connection='.$dbcharset.', character_set_results='.$dbcharset.', character_set_client=binary' : '';
  58.                                 $serverset .= $this->version() > '5.0.1' ? ((empty($serverset) ? '' : ',').'sql_mode=\'\'') : '';
  59.                                 $serverset && mysql_query("SET $serverset", $link);
  60.                         }
  61.                         $dbname && @mysql_select_db($dbname, $link);
  62.                 }
  63.                 return $link;
  64.         }
  65.         /*获取表名,暂时不太清楚map里存的是什么东西。*/
  66.         function table_name($tablename) {
  67.                 if(!empty($this->map) && !empty($this->map[$tablename])) {
  68.                         $id = $this->map[$tablename];
  69.                         if(!$this->link[$id]) {
  70.                                 $this->connect($id);
  71.                         }
  72.                         $this->curlink = $this->link[$id];
  73.                 } else {
  74.                         $this->curlink = $this->link[1];
  75.                 }
  76.                 return $this->tablepre.$tablename;
  77.         }
  78.         /*选择数据库*/
  79.         function select_db($dbname) {
  80.                 return mysql_select_db($dbname, $this->curlink);
  81.         }
  82.         /*将查询的结果集,转换为数组*/
  83.         function fetch_array($query, $result_type = MYSQL_ASSOC) {
  84.                 return mysql_fetch_array($query, $result_type);
  85.         }
  86.         /*根据名字推测是返回结果集中的第一条记录,不过代码还没看懂*/
  87.         function fetch_first($sql) {
  88.                 return $this->fetch_array($this->query($sql));
  89.         }
  90.         /*返回结果集中的第一行*/
  91.         function result_first($sql) {
  92.                 return $this->result($this->query($sql), 0);
  93.         }
  94.         /*执行查询语句*/
  95.         function query($sql, $type = '') {
  96.                 //检测是否开启debug模块
  97.                 if(defined('discuz_DEBUG') && DISCUZ_DEBUG) {
  98.                         $starttime = dmicrotime();
  99.                 }
  100.                 //判断查询类型是使用mysql_unbuffrerd_query,还是mysql_query
  101.                 //二者区别:http://www.w3school.com.cn/php/func_mysql_unbuffered_query.asp
  102.                 $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?
  103.                 'mysql_unbuffered_query' : 'mysql_query';
  104.                 if(!($query = $func($sql, $this->curlink))) {
  105.                         if(in_array($this->errno(), array(2006, 2013)) && substr($type, 0, 5) != 'RETRY') {
  106.                                 $this->connect();
  107.                                 return $this->query($sql, 'RETRY'.$type);
  108.                         }
  109.                         if($type != 'SILENT' && substr($type, 5) != 'SILENT') {
  110.                                 $this->halt('query_error', $sql);
  111.                         }
  112.                 }

  113.                 if(defined('DISCUZ_DEBUG') && DISCUZ_DEBUG) {
  114.                         $this->sqldebug[] = array($sql, number_format((dmicrotime() - $starttime), 6), debug_backtrace());
  115.                 }

  116.                 $this->querynum++;//查询次数
  117.                 return $query;
  118.         }
  119.         /*返回update,insert,delete操作所影响的行数,执行成功则返回所影响的行数,否则返回-1*/
  120.         function affected_rows() {
  121.                 return mysql_affected_rows($this->curlink);
  122.         }
  123.         /*输出错误信息*/
  124.         function error() {
  125.                 return (($this->curlink) ? mysql_error($this->curlink) : mysql_error());
  126.         }
  127.         /*返回上一次操作的错误编号,不带错误文本,如果没有错误则返回0*/
  128.         function errno() {
  129.                 return intval(($this->curlink) ? mysql_errno($this->curlink) : mysql_errno());
  130.         }
  131.         /*返回结果集,可以指定返回某一行*/
  132.         function result($query, $row = 0) {
  133.                 $query = @mysql_result($query, $row);
  134.                 return $query;
  135.         }
  136.         /*返回select查询所影响的行数,只对selcet有效,若检测update,insert,delete,请使用mysql_affected_rows()*/
  137.         function num_rows($query) {
  138.                 $query = mysql_num_rows($query);
  139.                 return $query;
  140.         }
  141.         /*返回结果集中的字段数*/
  142.         function num_fields($query) {
  143.                 return mysql_num_fields($query);
  144.         }
  145.         /*释放资源所占内存*/
  146.         function free_result($query) {
  147.                 return mysql_free_result($query);
  148.         }
  149.         /*返回新插入行的自增id*/
  150.         function insert_id() {
  151.                 return ($id = mysql_insert_id($this->curlink)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0);
  152.         }
  153.         /*把返回的数据集生成数组,如果查询的数据集为空,则返回false*/
  154.         function fetch_row($query) {
  155.                 $query = mysql_fetch_row($query);
  156.                 return $query;
  157.         }
  158.         /*返回数据集中的字段信息,比如类型,长度等*/
  159.         function fetch_fields($query) {
  160.                 return mysql_fetch_field($query);
  161.         }
  162.         /*返回服务器上的mysql版本,返回一字符串*/
  163.         function version() {
  164.                 if(empty($this->version)) {
  165.                         $this->version = mysql_get_server_info($this->curlink);
  166.                 }
  167.                 return $this->version;
  168.         }
  169.         /*关闭连接*/
  170.         function close() {
  171.                 return mysql_close($this->curlink);
  172.         }
  173.         /*输入出相关错误提示,文件所在位置:source/class/class_error.php*/
  174.         function halt($message = '', $sql = '') {
  175.                 require_once libfile('class/error');
  176.                 discuz_error::db_error($message, $sql);
  177.         }

  178. }
复制代码



上一篇:discuz X论坛的DB类分析
下一篇:discuz X论坛PHP分页的分析
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

快速回复 返回顶部 返回列表