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

discuz X1.5 DB类分析

阅读更多
class DB
{
	/*获取表名*/
	function table($table) {
		return DB::_execute('table_name', $table);
	}
	/*删除*/
	function delete($table, $condition, $limit = 0, $unbuffered = true) {
		if(empty($condition)) {
			$where = '1';//表达式为空,则where 1 网上有这方面的说明,不过我还没看懂什么意思,1=1为永真,1<>1为永假
		} elseif(is_array($condition)) {
			$where = DB::implode_field_value($condition, ' AND ');//若为数组,进行分隔,
		} else {
			$where = $condition;
		}
		$sql = "DELETE FROM ".DB::table($table)." WHERE $where ".($limit ? "LIMIT $limit" : '');//生成sql语句
		return DB::query($sql, ($unbuffered ? 'UNBUFFERED' : ''));//执行
	}
	/*插入*/
	function insert($table, $data, $return_insert_id = false, $replace = false, $silent = false) {

		$sql = DB::implode_field_value($data);//分隔数组

		$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';//选择是replace into 或 insert into

		$table = DB::table($table); //获取表
		$silent = $silent ? 'SILENT' : '';//这个是指查询类型,一般分两种mysql_query和mysql_unbuffered_query,默认为mysql_query

		$return = DB::query("$cmd $table SET $sql", $silent);//生成sql语句

		return $return_insert_id ? DB::insert_id() : $return;//返回新插入的行的id

	}
	/*更新*/
	function update($table, $data, $condition, $unbuffered = false, $low_priority = false) {
		$sql = DB::implode_field_value($data);//分隔数组
		//low_priority意为低优先级,在网上大致查了下,意思是它的优先级不会高于读操作
		//假如在写的时候,有一个读的操作,那么系统允许,把读操作插入到写前面,等读完了,再写
		$cmd = "UPDATE ".($low_priority ? 'LOW_PRIORITY' : '');
		$table = DB::table($table);//获取表名
		$where = '';
		if(empty($condition)) {//判断表达式
			$where = '1';
		} elseif(is_array($condition)) {
			$where = DB::implode_field_value($condition, ' AND ');
		} else {
			$where = $condition;
		}
		$res = DB::query("$cmd $table SET $sql WHERE $where", $unbuffered ? 'UNBUFFERED' : '');//生成sql语句
		return $res;//返回执行结果
	}
	/*分隔数组*/
	function implode_field_value($array, $glue = ',') {
		$sql = $comma = '';
		foreach ($array as $k => $v) {
			$sql .= $comma."`$k`='$v'";
			$comma = $glue;
		}
		return $sql;
	}
	/*获取插入新行的id*/
	function insert_id() {
		return DB::_execute('insert_id');
	}
	/*生成关联数组*/
	function fetch($resourceid, $type = MYSQL_ASSOC) {
		return DB::_execute('fetch_array', $resourceid, $type);
	}
	/*获取结果集中的第一行数据*/
	function fetch_first($sql) {
		DB::checkquery($sql);
		return DB::_execute('fetch_first', $sql);
	}
	/*返回结果集中的某一行*/
	function result($resourceid, $row = 0) {
		return DB::_execute('result', $resourceid, $row);
	}
	/*返回结果集中的第一行*/
	function result_first($sql) {
		DB::checkquery($sql);
		return DB::_execute('result_first', $sql);
	}
	/*执行查询*/
	function query($sql, $type = '') {
		DB::checkquery($sql);//过滤sql语句
		return DB::_execute('query', $sql, $type);
	}
	/*select语句查询所影响的行数*/
	function num_rows($resourceid) {
		return DB::_execute('num_rows', $resourceid);
	}
	/*update,insert,delete语句所影响的行数*/
	function affected_rows() {
		return DB::_execute('affected_rows');
	}
	/*释放内存*/
	function free_result($query) {
		return DB::_execute('free_result', $query);
	}
	/*输出错误信息*/
	function error() {
		return DB::_execute('error');
	}
	/*获取错误编号*/
	function errno() {
		return DB::_execute('errno');
	}
	//DB::_execute('table_name', $table)
	//相当于$res = $db->table_name($table);
	function _execute($cmd , $arg1 = '', $arg2 = '') {
		static $db;
		if(empty($db)) $db = & DB::object();//创建db_mysql对象
		$res = $db->$cmd($arg1, $arg2);
		return $res;
	}
	/*实例化db_mysql对象*/
	function &object() {
		static $db;
		if(empty($db)) $db = new db_mysql();
		return $db;
	}
	/*检查sql语句*/
	function checkquery($sql) {
		static $status = null, $checkcmd = array('SELECT', 'UPDATE', 'INSERT', 'REPLACE', 'DELETE');
		if($status === null) $status = getglobal('config/security/querysafe/status');
		if($status) {
			$cmd = trim(strtoupper(substr($sql, 0, strpos($sql, ' '))));
			if(in_array($cmd, $checkcmd)) {
				$test = DB::_do_query_safe($sql);
				if($test < 1) DB::_execute('halt', 'security_error', $sql);
			}
		}
		return true;
	}
	/*过滤sql语句*/
	function _do_query_safe($sql) {
		static $_CONFIG = null;
		if($_CONFIG === null) {
			$_CONFIG = getglobal('config/security/querysafe');
		}

		$sql = str_replace(array('\\\\', '\\\'', '\\"', '\'\''), '', $sql);
		$mark = $clean = '';
		if(strpos($sql, '/') === false && strpos($sql, '#') === false && strpos($sql, '-- ') === false) {
			$clean = preg_replace("/'(.+?)'/s", '', $sql);
		} else {
			$len = strlen($sql);
			$mark = $clean = '';
			for ($i = 0; $i <$len; $i++) {
				$str = $sql[$i];
				switch ($str) {
					case '\'':
						if(!$mark) {
							$mark = '\'';
							$clean .= $str;
						} elseif ($mark == '\'') {
							$mark = '';
						}
						break;
					case '/':
						if(empty($mark) && $sql[$i+1] == '*') {
							$mark = '/*';
							$clean .= $mark;
							$i++;
						} elseif($mark == '/*' && $sql[$i -1] == '*') {
							$mark = '';
							$clean .= '*';
						}
						break;
					case '#':
						if(empty($mark)) {
							$mark = $str;
							$clean .= $str;
						}
						break;
					case "\n":
						if($mark == '#' || $mark == '--') {
							$mark = '';
						}
						break;
					case '-':
						if(empty($mark)&& substr($sql, $i, 3) == '-- ') {
							$mark = '-- ';
							$clean .= $mark;
						}
						break;

					default:

						break;
				}
				$clean .= $mark ? '' : $str;
			}
		}

		$clean = preg_replace("/[^a-z0-9_\-\(\)#\*\/\"]+/is", "", strtolower($clean));

		if($_CONFIG['afullnote']) {
			$clean = str_replace('/**/','',$clean);
		}

		if(is_array($_CONFIG['dfunction'])) {
			foreach($_CONFIG['dfunction'] as $fun) {
				if(strpos($clean, $fun.'(') !== false) return '-1';
			}
		}

		if(is_array($_CONFIG['daction'])) {
			foreach($_CONFIG['daction'] as $action) {
				if(strpos($clean,$action) !== false) return '-3';
			}
		}

		if($_CONFIG['dlikehex'] && strpos($clean, 'like0x')) {
			return '-2';
		}

		if(is_array($_CONFIG['dnote'])) {
			foreach($_CONFIG['dnote'] as $note) {
				if(strpos($clean,$note) !== false) return '-4';
			}
		}

		return 1;

	}

}

分享到:
评论

相关推荐

    Discuz X1.5使用手册

    为了帮助用户更顺利地搭建和使用Discuz X1.5论坛系统,本文将详细解读《Discuz X1.5使用手册》中的关键步骤和要点,从而为用户提供一份清晰、实用的操作指南。 首先,我们要明确搭建Discuz X1.5论坛系统的基本要求...

    Discuz_X1.5_SC_GBK.dz1.5论坛

    2. 下载解压:获取"Discuz_X1.5_SC_GBK.dz1.5论坛"压缩包,解压后得到"upload"目录,这是论坛的安装文件。 3. 数据库配置:创建MySQL数据库,并记录数据库名、用户名、密码。 4. 安装向导:访问服务器上"upload...

    DISCUZ X1.5 2.0游戏插件

    【标题】"DISCUZ X1.5 2.0 游戏插件"涉及到的是一个针对DISCUZ论坛系统的游戏扩展应用。DISCUZ是一款非常流行的开源社区论坛软件,它允许用户创建和管理自己的在线论坛,提供丰富的功能和自定义选项。X1.5和X2.0是该...

    discuz x1.5 wap

    discuz x1.5 wap 手机接口,拷贝到论坛根目录即可 WAP 2.3比之前的版本更新的细节如下: --贴子界面优化。 --自动读取标题。 --增加置顶贴区别。 --页面直接显示用户。 --修复登录BUG。(要是你登录还有问题,我也...

    discuz!x1.5数据

    discuz!x1.5数据表的说明文档,包含所有的表的说明,。定义,等等

    discuz X1.5论坛部署(windows)

    ### discuz X1.5论坛部署(Windows) #### 一、概述 本文旨在详细介绍如何在Windows环境下部署Discuz X1.5论坛系统。通过本文,您将了解到完整的部署流程,包括系统环境的准备、所需软件的选择及安装、环境变量的...

    discuz x1.5经典版

    X1.5 经典版:中国SNS源码的里程碑》 Discuz! X1.5经典版,作为中国社交网络服务(SNS)领域的一款标志性产品,自发布以来就受到了广大站长和开发者的热烈追捧。这款开源的论坛软件,以其强大的功能、稳定的表现...

    Discuz!X1.5论坛系统详解

    X1.5是一款深受用户喜爱的论坛系统,其设计目标是提供高效、易用且功能丰富的网络社区平台。在Discuz!X1.5版本中,开发者着重提升了系统的性能和用户体验,通过一系列的改进使论坛更具吸引力。 首先,广场作为论坛...

    Discuz! X1.5导航插件

    X1.5导航插件是一款专为Discuz! X1.5平台设计的强大辅助工具,它旨在帮助用户更好地管理和优化社区网站的导航功能,提升用户体验,增强网站的互动性和实用性。这款插件在www.58119.com上有着生动的展示,通过实际...

    Discuz_X1.5_SC_UTF8

    在Discuz_X1.5_SC_UTF8中使用UTF-8编码,意味着论坛可以无缝处理中文信息,无论是用户注册、发帖还是评论,都能保证文字的正确显示。 4. **文件结构解析** - **upload**:这个目录通常包含了论坛所需的静态资源,...

    付费浏览帖子(看帖扣分)For Discuz!X2 & X1.5

    X2 & X1.5" 是一个针对Discuz!论坛系统的插件,旨在实现一种特殊的社区运营策略,即用户需要付费才能查看某些特定的帖子。这个插件主要用于那些希望增加社区内容价值,或者通过内容收费来获取额外收入的Discuz!论坛...

    discuz X1.5最新康盛源码

    这款源码是康盛创想在X1.5版本时发布的产品,集成了许多先进特性和优化,旨在提供更好的用户体验和管理效率。 1. **框架与技术栈** Discuz! X1.5 使用PHP作为后端编程语言,这使得它在性能和跨平台性上具有优势。...

    discuz x1.5 数据库说明

    Discuz!X1.5 数据结构说明书.CHM

    Discuz_X1.5正式版

    X1.5:搭建与优化指南》 Discuz! X1.5作为一款知名的社区论坛软件,以其强大的功能和易用性深受广大用户喜爱。这款正式版无任何限制,为用户提供了一个自由度极高的平台,无论你是个人用户还是企业组织,都可以...

    discuz! X 1.5 远程图片本地化插件 DZ! X 1.5

    X 1.5 远程图片本地化插件"是提升Discuz! X 1.5 论坛性能的有效工具,通过自动抓取和存储远程图片,解决了图片加载慢的问题,改善了用户浏览体验。正确安装和配置这个插件,将为你的论坛运营带来显著的效益。

    discuz x 1.5 urf-8 中文

    X 1.5 URF-8:中文版深度解析》 Discuz! X 1.5是一款由Comsenz公司开发的社区论坛软件,它以其强大的功能、高效的性能以及良好的用户体验,在国内互联网社区建设领域占据了重要的地位。URF-8,即Unicode Right-to-...

    Discuz!X1.5手机验证注册包,基于短信猫

    X1.5版本,这是一个非常流行的开源社区论坛软件,广泛应用于各类网站,为用户提供互动交流平台。 首先,我们需要了解Discuz!X1.5的基本功能。Discuz!X1.5是Comsenz公司开发的一款社区论坛系统,它具有强大的管理...

    discuz x1.5数据库结构

    X1.5是Discuz!论坛系统的一个版本,它是一款基于PHP和MySQL的社区建站软件,被广泛应用于搭建互动交流平台。本文将深入解析Discuz! X1.5的数据库结构,帮助您更好地理解和管理您的论坛数据。 在Discuz! X1.5中,...

    Discuz! X1.5音乐插件

    X1.5音乐插件"是一个专门为Discuz! X1.5版本论坛设计的扩展功能,旨在为用户带来丰富的在线音乐体验。这个插件的安装和使用,可以让论坛用户在浏览帖子的同时享受音乐播放,提升社区的互动性和娱乐性。 【描述】...

    discuz x 1.5目录结构

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

Global site tag (gtag.js) - Google Analytics