discuz 7.0 db_mysql.php 详解

字体大小: 中小 标准 ->行高大小: 标准
discuz 7.0 db_mysql.php 详解

7.0 似乎也不怎么复杂. 

<?php



/*

    [Discuz!] (C)2001-2007 Comsenz Inc.

    This is NOT a freeware, use is subject to license terms



    $Id: db_mysql.class.php 13278 2008-04-03 09:39:07Z cnteacher $

*/

//禁止外部引用,即非本地使用.

if(!defined('IN_DISCUZ')) {

    exit('Access Denied');

}



class dbstuff {



    var $version = '';  //mysql版本号

    var $querynum = 0;  //执行次数   

    var $link;         //mysql 连接

    

    //数据库服务名,用户名,密码,数据库名,默认非长连接,连接报错开头,数据库字符编码

    function connect($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0, $halt = TRUE, $dbcharset2 = '') {

        

        //如果$pconnect===0就mysql_connect或者就mysql_pconnect;

        $func = empty($pconnect) ? 'mysql_connect' : 'mysql_pconnect';

        //连接错误

        if(!$this->link = @$func($dbhost, $dbuser, $dbpw, 1)) {

            //判断一下$halt是为为真再报错.(这有意思);

            $halt && $this->halt('Can not connect to MySQL server');

        } else {

            //4.1以上进入.低过4.1神仙都难帮你了.

            if($this->version() > '4.1') {

                //引入两个编码集,统一编码/及数据库编码

                global $charset, $dbcharset;

                //一切依类实例时为标准

                $dbcharset = $dbcharset2 ? $dbcharset2 : $dbcharset;

                //如果$dbcharset不存在,就用统一编码来处理. 并且判断统一编码是否在数组中,存在就删除utf-8中的-(因为统一编码一定会有中间的'-').否则保持空白. 

                $dbcharset = !$dbcharset && in_array(strtolower($charset), array('gbk', 'big5', 'utf-8')) ? str_replace('-', '', $charset) : $dbcharset;

                //如果$dbcharset存在就组全SQL语句,否则为空.

                $serverset = $dbcharset ? 'character_set_connection='.$dbcharset.', character_set_results='.$dbcharset.', character_set_client=binary' : '';

                //判断一下mysql版本号,返回: ,sql_mode='';

                $serverset .= $this->version() > '5.0.1' ? ((empty($serverset) ? '' : ',').'sql_mode=\'\'') : '';

                //执行了. 全句SQL: SET character_set_connection=utf8, character_set_results=utf8, character_set_client=binary,sql_mode=''

                $serverset && mysql_query("SET $serverset", $this->link);

            }

            //选择数据库名.

            $dbname && @mysql_select_db($dbname, $this->link);

        }



    }

    //方法:选择数据库名

    function select_db($dbname) {

        return mysql_select_db($dbname, $this->link);

    }

    //方法:依字段键名方法返回查询结果

    function fetch_array($query, $result_type = MYSQL_ASSOC) {

        return mysql_fetch_array($query, $result_type);

    }

    //方法: 更强悍, 执行与查询共体.通常在查询一条信息时使用.

    function fetch_first($sql) {

        return $this->fetch_array($this->query($sql));

    }

    //方法:清除查询结果

    function result_first($sql) {

        return $this->result($this->query($sql), 0);

    }

    //方法:sql执行,最通用的方法

    function query($sql, $type = '') {

        

        //引入几个变量, 没一个认识的.似乎里面也没有用到, 大可以删除.

        global $debug, $discuz_starttime, $sqldebug, $sqlspenttimes;

        

        //神仙也不知道discuz 7.0 /include/debug.func.php文件在哪.是个bug吧.

        if(defined('SYS_DEBUG') && SYS_DEBUG) {

            @include_once DISCUZ_ROOT.'./include/debug.func.php';

            sqldebug();

        }

        //UNBUFFERED模式.

        $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?

            'mysql_unbuffered_query' : 'mysql_query';

        //判断执行有结果.    

        if(!($query = $func($sql, $this->link))) {

            //判断连接成功,并且$type中没有RETRY

            if(in_array($this->errno(), array(2006, 2013)) && substr($type, 0, 5) != 'RETRY') {  //这个if会被无视

                $this->close();   //关闭连接.

                require DISCUZ_ROOT.'./config.inc.php';   //引入配置文件.

                //调用连接方法.

                $this->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, true, $dbcharset);

                //执行SQL

                $this->query($sql, 'RETRY'.$type);

            } elseif($type != 'SILENT' && substr($type, 5) != 'SILENT') {  //报错.

                $this->halt('MySQL Query Error', $sql);

            }

        }

        //查询次数+1 (不清楚它的作用.)

        $this->querynum++;

        //返回结果集.(从这里看来,中间的判断其实没有作用);

        return $query;

    }

    //取得前一次 MySQL 操作所影响的记录行数

    function affected_rows() {

        return mysql_affected_rows($this->link);

    }

    

    // 返回SQL错误

    function error() {

        return (($this->link) ? mysql_error($this->link) : mysql_error());

    }

    // 返回SQL错误与上结合.

    function errno() {

        return intval(($this->link) ? mysql_errno($this->link) : mysql_errno());

    }

    //清除执行结果

    function result($query, $row = 0) {

        $query = @mysql_result($query, $row);

        return $query;

    }

    //取得结果集的条数.

    function num_rows($query) {

        $query = mysql_num_rows($query);

        return $query;

    }

    //取得结果集中字段的数目

    function num_fields($query) {

        return mysql_num_fields($query);

    }

    //释放结果内存

    function free_result($query) {

        return mysql_free_result($query);

    }

    

    //取得前一次插入ID值.

    function insert_id() {

        return ($id = mysql_insert_id($this->link)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0);

    }

    //依数字键名返回查询结果.

    function fetch_row($query) {

        $query = mysql_fetch_row($query);

        return $query;

    }

    //从结果集中取得列信息并作为对象返回

    function fetch_fields($query) {

        return mysql_fetch_field($query);

    }

    // 取得mysql版本号信息

    function version() {

        if(empty($this->version)) {

            $this->version = mysql_get_server_info($this->link);

        }

        return $this->version;

    }

    //关闭连接

    function close() {

        return mysql_close($this->link);

    }

    //报错方法. 引入一个文件. 

    function halt($message = '', $sql = '') {

        define('CACHE_FORBIDDEN', TRUE);

        require_once DISCUZ_ROOT.'./include/db_mysql_error.inc.php';

    }

}



?>

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/493.html