`
yeyuan
  • 浏览: 230851 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

discuz X1.5 db_mysql类分析

阅读更多
/*
 *数据库操作类
 */
class db_mysql
{
	var $tablepre;
	var $version = '';
	var $querynum = 0;
	var $curlink;
	var $link = array();
	var $config = array();
	var $sqldebug = array();
	var $map = array();
	/*构造函数,读入数据库相关配置*/
	function db_mysql($config = array()) {
		if(!empty($config)) {
			$this->set_config($config);
		}
	}
	/*
	 *设置数据库配置信息,设置表前缀
	 *不理解,这个$config里面的数据是怎么来的,也没见有赋值呀?
	 *配置文件里的数据库配置信息是在$_config这个数组里存的,
	 */
	function set_config($config) {
		$this->config = &$config;
		$this->tablepre = $config['1']['tablepre'];
		if(!empty($this->config['map'])) {
			$this->map = $this->config['map'];
		}
	}
	/*连接数据库*/
	function connect($serverid = 1) {

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

		$this->link[$serverid] = $this->_dbconnect(
			$this->config[$serverid]['dbhost'],
			$this->config[$serverid]['dbuser'],
			$this->config[$serverid]['dbpw'],
			$this->config[$serverid]['dbcharset'],
			$this->config[$serverid]['dbname'],
			$this->config[$serverid]['pconnect']
			);
		$this->curlink = $this->link[$serverid];		
	}
	/*数据库连接验证!*/
	function _dbconnect($dbhost, $dbuser, $dbpw, $dbcharset, $dbname, $pconnect) {
		$link = null;
		$func = empty($pconnect) ? 'mysql_connect' : 'mysql_pconnect';
		if(!$link = @$func($dbhost, $dbuser, $dbpw, 1)) {
			$this->halt('notconnect');
		} else {
			$this->curlink = $link;
			if($this->version() > '4.1') {//版本检测
				$dbcharset = $dbcharset ? $dbcharset : $this->config[1]['dbcharset'];
				$serverset = $dbcharset ? 'character_set_connection='.$dbcharset.', character_set_results='.$dbcharset.', character_set_client=binary' : '';
				$serverset .= $this->version() > '5.0.1' ? ((empty($serverset) ? '' : ',').'sql_mode=\'\'') : '';
				$serverset && mysql_query("SET $serverset", $link);
			}
			$dbname && @mysql_select_db($dbname, $link);
		}
		return $link;
	}
	/*获取表名,暂时不太清楚map里存的是什么东西。*/
	function table_name($tablename) {
		if(!empty($this->map) && !empty($this->map[$tablename])) {
			$id = $this->map[$tablename];
			if(!$this->link[$id]) {
				$this->connect($id);
			}
			$this->curlink = $this->link[$id];
		} else {
			$this->curlink = $this->link[1];
		}
		return $this->tablepre.$tablename;
	}
	/*选择数据库*/
	function select_db($dbname) {
		return mysql_select_db($dbname, $this->curlink);
	}
	/*将查询的结果集,转换为数组*/
	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);
	}
	/*执行查询语句*/
	function query($sql, $type = '') {
		//检测是否开启debug模块
		if(defined('DISCUZ_DEBUG') && DISCUZ_DEBUG) {
			$starttime = dmicrotime();
		}
		//判断查询类型是使用mysql_unbuffrerd_query,还是mysql_query
		//二者区别:http://www.w3school.com.cn/php/func_mysql_unbuffered_query.asp
		$func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?
		'mysql_unbuffered_query' : 'mysql_query';
		if(!($query = $func($sql, $this->curlink))) {
			if(in_array($this->errno(), array(2006, 2013)) && substr($type, 0, 5) != 'RETRY') {
				$this->connect();
				return $this->query($sql, 'RETRY'.$type);
			}
			if($type != 'SILENT' && substr($type, 5) != 'SILENT') {
				$this->halt('query_error', $sql);
			}
		}

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

		$this->querynum++;//查询次数
		return $query;
	}
	/*返回update,insert,delete操作所影响的行数,执行成功则返回所影响的行数,否则返回-1*/
	function affected_rows() {
		return mysql_affected_rows($this->curlink);
	}
	/*输出错误信息*/
	function error() {
		return (($this->curlink) ? mysql_error($this->curlink) : mysql_error());
	}
	/*返回上一次操作的错误编号,不带错误文本,如果没有错误则返回0*/
	function errno() {
		return intval(($this->curlink) ? mysql_errno($this->curlink) : mysql_errno());
	}
	/*返回结果集,可以指定返回某一行*/
	function result($query, $row = 0) {
		$query = @mysql_result($query, $row);
		return $query;
	}
	/*返回select查询所影响的行数,只对selcet有效,若检测update,insert,delete,请使用mysql_affected_rows()*/
	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->curlink)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0);
	}
	/*把返回的数据集生成数组,如果查询的数据集为空,则返回false*/
	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->curlink);
		}
		return $this->version;
	}
	/*关闭连接*/
	function close() {
		return mysql_close($this->curlink);
	}
	/*输入出相关错误提示,文件所在位置:source/class/class_error.php*/
	function halt($message = '', $sql = '') {
		require_once libfile('class/error');
		discuz_error::db_error($message, $sql);
	}

}
分享到:
评论

相关推荐

    discuz x 1.5目录结构

    ### Discuz X1.5 目录结构解析 #### 一、概述 Discuz! X1.5是一款非常流行的开源论坛软件,它基于PHP+MySQL技术构建,具有强大的功能和高度可定制性。本文将详细介绍Discuz! X1.5的目录结构,帮助开发者更好地理解...

    discuz代码分析--Install篇

    《Discuz代码分析——Install篇》 在深入探讨Discuz!论坛系统Install模块的代码之前,我们首先要了解一些基础概念。Discuz!是一款基于PHP和MySQL数据库构建的开源社区论坛软件,它以其强大的功能和易用性,在全球...

    MYSQL5 LOG 分析工具.rar

    MySQL记录日志查询对于跟踪PHP MySQL体系下的MySQL负载调优问题很有用处,比如安装了很多Discuz!插件的用户,这样可以大概排查出那些插件有代码问题。其实启用MySQL的慢查询日志很简单,只需要在MYSQL.INI 增加参数...

    Linux+apache+mysql+php搭建Discuz论坛.pdf

    scripts/mysql_install_db --user=mysql chown -R mysql:mysql /usr/local/mysql ``` 接下来,将MySQL的配置文件复制到/etc目录,并创建服务启动脚本,设置开机启动。 ```bash cp /usr/local/mysql/support-files/**...

    最全的discuz二次开发讲解教程.doc

    Discuz数据处理过程包括对MYSQL数据库的操作处理,全部封装在dbstuff(db_mysql.class.php)类中。Discuz显示控制包括网站多样式风格输出,每套风格分别在templates及images下对应一个风格文件的存放目录。Discuz...

    php下mysql数据库操作类(改自discuz)

    本篇文章将详细解析基于PHP的MySQL数据库操作类,该类来源于Discuz论坛系统并经过修改,适用于其他PHP项目。通过学习和理解这个类,开发者可以更好地掌握PHP与MySQL的交互技巧。 首先,让我们来了解此类的基本结构...

    UCenter应用程序开发简单实例(双向同步).doc

    然后,我们再新建一个文件夹,命名为include,并拷贝一份Discuz的db_mysql.class.php和db_mysql_error.inc.php到include目录下。最后,我们在myapp1目录下新建一个config.inc.php文件,这是本应用程序的配置文件。 ...

    Discuz X 数据库常用操作方法整理

    首先,`DB`类是Discuz X中用于数据库操作的基础类。通过`DB::table()`函数,你可以获取带有前缀的完整表名,这对于多站点或多应用环境下的数据库操作尤为重要。例如,`DB::table('tablename')`会根据配置自动添加...

    Discuz_X2.5四合一版本

    产品的现有架构,仅数据库操作相关的架构优化,就涉及317个程序文件的4525处代码片段修改,并新增DB类文件217个。 从Discuz! X2.5起,数据读写层已经实现全面独立封装。新版支持以表为单位的分服务器部署;数据表...

    天使小金库插件 for Discuz!7.0 UTF8简体中文 v1.0

    2. 论坛后台导入插件设置discuz_plugin_seccb.txt 3. 导入数据库seccbsql.txt 4. 此步请慎重 如果安装过我的其他插件请省略此步  如果不确定请先打开 include/db_mysql.class.php  搜索 function get_one 如果...

    LinuxAS4+httpd2.2.4+mysql5.0.40+php5.1.2+Discuz!_5

    根据给定文件的信息,我们可以提炼出关于如何在LinuxAS4操作系统上搭建基于httpd2.2.4、mysql5.0.40、php5.1.2以及Discuz!_5的应用环境的关键步骤和技术要点。 ### 一、Apache Web服务器安装与配置 #### 1. 安装...

    ucenter 1.6.0 UTF8 去掉 mysql_connect()

    2. 替换为`mysqli_connect()`,同时更新其他相关函数,如`mysql_select_db()`替换为`mysqli_select_db()`,`mysql_query()`替换为`mysqli_query()`等。 3. 如果选择PDO,需要创建PDO实例,例如`$pdo = new PDO('...

    discuz7.0学习资料

    discuz7.0学习资料,包含: discuz7.0文件目录说明, 详细数据字典, 模板标签说明, 主要文件源码注释(common.inc.php,db_mysql.class.php,global.func.php,logging.php等), ucenter数据字典。

    DISCUZ 源码分析

    在DISCUZ 中,数据库操作主要通过`DB`类实现,该类封装了SQL查询、事务处理等操作。通过对源码分析,我们可以学习到如何高效地进行数据库交互,以及如何优化SQL语句以提升性能。 3. **模板引擎** DISCUZ 使用了...

    Discuz!二次开发[文].pdf

    - 数据库操作封装在db_mysql.class.php类中,外部数据通过daddslashes()函数预处理。 5. 显示控制: - 使用template.func.php中的parse_template()函数,将HTML模板中的标签转换为PHP代码,实现多样式风格输出。...

    MySQL最重要的基础知识详解 中文版

    ### MySQL最重要的基础知识详解 #### 第1章 概述 ##### 1.1 什么是MySQL? MySQL是一种关系型数据库管理系统(RDBMS),它以其高性能、可靠性和易用性而闻名。MySQL支持多种操作系统,如Windows、Linux等,并且可以...

    discuz7 phpMysql操作类

    `Discuz7 PHPMySQL操作类`是PHP中用于数据库操作的一个自定义类,它封装了MySQL数据库的连接、查询和其他相关操作。这个类在Discuz! 7版本中被使用,Discuz! 是一个广泛使用的开源论坛系统。下面将详细介绍此类的...

Global site tag (gtag.js) - Google Analytics