/*
*数据库操作类
*/
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 X1.5 目录结构解析 #### 一、概述 Discuz! X1.5是一款非常流行的开源论坛软件,它基于PHP+MySQL技术构建,具有强大的功能和高度可定制性。本文将详细介绍Discuz! X1.5的目录结构,帮助开发者更好地理解...
《Discuz代码分析——Install篇》 在深入探讨Discuz!论坛系统Install模块的代码之前,我们首先要了解一些基础概念。Discuz!是一款基于PHP和MySQL数据库构建的开源社区论坛软件,它以其强大的功能和易用性,在全球...
MySQL记录日志查询对于跟踪PHP MySQL体系下的MySQL负载调优问题很有用处,比如安装了很多Discuz!插件的用户,这样可以大概排查出那些插件有代码问题。其实启用MySQL的慢查询日志很简单,只需要在MYSQL.INI 增加参数...
scripts/mysql_install_db --user=mysql chown -R mysql:mysql /usr/local/mysql ``` 接下来,将MySQL的配置文件复制到/etc目录,并创建服务启动脚本,设置开机启动。 ```bash cp /usr/local/mysql/support-files/**...
Discuz数据处理过程包括对MYSQL数据库的操作处理,全部封装在dbstuff(db_mysql.class.php)类中。Discuz显示控制包括网站多样式风格输出,每套风格分别在templates及images下对应一个风格文件的存放目录。Discuz...
本篇文章将详细解析基于PHP的MySQL数据库操作类,该类来源于Discuz论坛系统并经过修改,适用于其他PHP项目。通过学习和理解这个类,开发者可以更好地掌握PHP与MySQL的交互技巧。 首先,让我们来了解此类的基本结构...
然后,我们再新建一个文件夹,命名为include,并拷贝一份Discuz的db_mysql.class.php和db_mysql_error.inc.php到include目录下。最后,我们在myapp1目录下新建一个config.inc.php文件,这是本应用程序的配置文件。 ...
首先,`DB`类是Discuz X中用于数据库操作的基础类。通过`DB::table()`函数,你可以获取带有前缀的完整表名,这对于多站点或多应用环境下的数据库操作尤为重要。例如,`DB::table('tablename')`会根据配置自动添加...
产品的现有架构,仅数据库操作相关的架构优化,就涉及317个程序文件的4525处代码片段修改,并新增DB类文件217个。 从Discuz! X2.5起,数据读写层已经实现全面独立封装。新版支持以表为单位的分服务器部署;数据表...
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的应用环境的关键步骤和技术要点。 ### 一、Apache Web服务器安装与配置 #### 1. 安装...
2. 替换为`mysqli_connect()`,同时更新其他相关函数,如`mysql_select_db()`替换为`mysqli_select_db()`,`mysql_query()`替换为`mysqli_query()`等。 3. 如果选择PDO,需要创建PDO实例,例如`$pdo = new PDO('...
discuz7.0学习资料,包含: discuz7.0文件目录说明, 详细数据字典, 模板标签说明, 主要文件源码注释(common.inc.php,db_mysql.class.php,global.func.php,logging.php等), ucenter数据字典。
在DISCUZ 中,数据库操作主要通过`DB`类实现,该类封装了SQL查询、事务处理等操作。通过对源码分析,我们可以学习到如何高效地进行数据库交互,以及如何优化SQL语句以提升性能。 3. **模板引擎** DISCUZ 使用了...
- 数据库操作封装在db_mysql.class.php类中,外部数据通过daddslashes()函数预处理。 5. 显示控制: - 使用template.func.php中的parse_template()函数,将HTML模板中的标签转换为PHP代码,实现多样式风格输出。...
### MySQL最重要的基础知识详解 #### 第1章 概述 ##### 1.1 什么是MySQL? MySQL是一种关系型数据库管理系统(RDBMS),它以其高性能、可靠性和易用性而闻名。MySQL支持多种操作系统,如Windows、Linux等,并且可以...
`Discuz7 PHPMySQL操作类`是PHP中用于数据库操作的一个自定义类,它封装了MySQL数据库的连接、查询和其他相关操作。这个类在Discuz! 7版本中被使用,Discuz! 是一个广泛使用的开源论坛系统。下面将详细介绍此类的...