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是一款非常流行的开源论坛软件,它基于PHP+MySQL技术构建,具有强大的功能和高度可定制性。本文将详细介绍Discuz! X1.5的目录结构,帮助开发者更好地理解...
【Discuz X1.5 程序目录与文件列表详解】 Discuz! X1.5 是一个功能强大的社区建站平台,集成了论坛(BBS)、社交网络(SNS)、门户(Portal)和群组(Group)等多种功能,旨在为用户提供一站式的社区服务体验。在...
适用版本:discuz X 的任何版本 版权所属:银领创业协会 支持网站: http://www.ylcyxh.cn 重要申明:请您在安装之前务必备份相关数据和相关文件。因任何未备份相关数据和相关文件造成的数据丢失我们概不负责。 -...
$discuz = & discuz_core::instance();//实例化 使用此种方法是为了兼容PHP4 与PHP5 复制代码 这里我们进到./source/class/class_core.php 看看这个核心类 首先来分别看看这些属性 var $db = null;//存储数据库对象 ...
PentestDB支持Windows/Linux/MacOS,需使用python 2.6.x 或 2.7.x运行 2.1 解决lxml依赖 项目中的脚本文件依赖于lxml linux系统一般默认安装lxml,如果没有可通过以下方式安装: pip install lxml apt-get ...