首页
站长论坛BBS
救助
投稿
discuz视频教程
discuz技术支持
版块
登录
快速注册

discuz X论坛的DB类分析

建站高手 2015-6-30 [Discuz开发] 来自PC 复制链接
05754
discuz使用视频教程
31idc

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

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

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

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

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

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

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

  27.         }
  28.         /*更新*/
  29.         function update($table, $data, $condition, $unbuffered = false, $low_priority = false) {
  30.                 $sql = DB::implode_field_value($data);//分隔数组
  31.                 //low_priority意为低优先级,在网上大致查了下,意思是它的优先级不会高于读操作
  32.                 //假如在写的时候,有一个读的操作,那么系统允许,把读操作插入到写前面,等读完了,再写
  33.                 $cmd = "UPDATE ".($low_priority ? 'LOW_PRIORITY' : '');
  34.                 $table = DB::table($table);//获取表名
  35.                 $where = '';
  36.                 if(empty($condition)) {//判断表达式
  37.                         $where = '1';
  38.                 } elseif(is_array($condition)) {
  39.                         $where = DB::implode_field_value($condition, ' AND ');
  40.                 } else {
  41.                         $where = $condition;
  42.                 }
  43.                 $res = DB::query("$cmd $table SET $sql WHERE $where", $unbuffered ? 'UNBUFFERED' : '');//生成sql语句
  44.                 return $res;//返回执行结果
  45.         }
  46.         /*分隔数组*/
  47.         function implode_field_value($array, $glue = ',') {
  48.                 $sql = $comma = '';
  49.                 foreach ($array as $k => $v) {
  50.                         $sql .= $comma."`$k`='$v'";
  51.                         $comma = $glue;
  52.                 }
  53.                 return $sql;
  54.         }
  55.         /*获取插入新行的id*/
  56.         function insert_id() {
  57.                 return DB::_execute('insert_id');
  58.         }
  59.         /*生成关联数组*/
  60.         function fetch($resourceid, $type = MYSQL_ASSOC) {
  61.                 return DB::_execute('fetch_array', $resourceid, $type);
  62.         }
  63.         /*获取结果集中的第一行数据*/
  64.         function fetch_first($sql) {
  65.                 DB::checkquery($sql);
  66.                 return DB::_execute('fetch_first', $sql);
  67.         }
  68.         /*返回结果集中的某一行*/
  69.         function result($resourceid, $row = 0) {
  70.                 return DB::_execute('result', $resourceid, $row);
  71.         }
  72.         /*返回结果集中的第一行*/
  73.         function result_first($sql) {
  74.                 DB::checkquery($sql);
  75.                 return DB::_execute('result_first', $sql);
  76.         }
  77.         /*执行查询*/
  78.         function query($sql, $type = '') {
  79.                 DB::checkquery($sql);//过滤sql语句
  80.                 return DB::_execute('query', $sql, $type);
  81.         }
  82.         /*select语句查询所影响的行数*/
  83.         function num_rows($resourceid) {
  84.                 return DB::_execute('num_rows', $resourceid);
  85.         }
  86.         /*update,insert,delete语句所影响的行数*/
  87.         function affected_rows() {
  88.                 return DB::_execute('affected_rows');
  89.         }
  90.         /*释放内存*/
  91.         function free_result($query) {
  92.                 return DB::_execute('free_result', $query);
  93.         }
  94.         /*输出错误信息*/
  95.         function error() {
  96.                 return DB::_execute('error');
  97.         }
  98.         /*获取错误编号*/
  99.         function errno() {
  100.                 return DB::_execute('errno');
  101.         }
  102.         //DB::_execute('table_name', $table)
  103.         //相当于$res = $db->table_name($table);
  104.         function _execute($cmd , $arg1 = '', $arg2 = '') {
  105.                 static $db;
  106.                 if(empty($db)) $db = & DB::object();//创建db_mysql对象
  107.                 $res = $db->$cmd($arg1, $arg2);
  108.                 return $res;
  109.         }
  110.         /*实例化db_mysql对象*/
  111.         function &object() {
  112.                 static $db;
  113.                 if(empty($db)) $db = new db_mysql();
  114.                 return $db;
  115.         }
  116.         /*检查sql语句*/
  117.         function checkquery($sql) {
  118.                 static $status = null, $checkcmd = array('SELECT', 'UPDATE', 'INSERT', 'REPLACE', 'DELETE');
  119.                 if($status === null) $status = getglobal('config/security/querysafe/status');
  120.                 if($status) {
  121.                         $cmd = trim(strtoupper(substr($sql, 0, strpos($sql, ' '))));
  122.                         if(in_array($cmd, $checkcmd)) {
  123.                                 $test = DB::_do_query_safe($sql);
  124.                                 if($test < 1) DB::_execute('halt', 'security_error', $sql);
  125.                         }
  126.                 }
  127.                 return true;
  128.         }
  129.         /*过滤sql语句*/
  130.         function _do_query_safe($sql) {
  131.                 static $_CONFIG = null;
  132.                 if($_CONFIG === null) {
  133.                         $_CONFIG = getglobal('config/security/querysafe');
  134.                 }

  135.                 $sql = str_replace(array('\\\\', '\\\'', '\\"', '\'\''), '', $sql);
  136.                 $mark = $clean = '';
  137.                 if(strpos($sql, '/') === false && strpos($sql, '#') === false && strpos($sql, '-- ') === false) {
  138.                         $clean = preg_replace("/'(.+?)'/s", '', $sql);
  139.                 } else {
  140.                         $len = strlen($sql);
  141.                         $mark = $clean = '';
  142.                         for ($i = 0; $i <$len; $i++) {
  143.                                 $str = $sql[$i];
  144.                                 switch ($str) {
  145.                                         case '\'':
  146.                                                 if(!$mark) {
  147.                                                         $mark = '\'';
  148.                                                         $clean .= $str;
  149.                                                 } elseif ($mark == '\'') {
  150.                                                         $mark = '';
  151.                                                 }
  152.                                                 break;
  153.                                         case '/':
  154.                                                 if(empty($mark) && $sql[$i+1] == '*') {
  155.                                                         $mark = '/*';
  156.                                                         $clean .= $mark;
  157.                                                         $i++;
  158.                                                 } elseif($mark == '/*' && $sql[$i -1] == '*') {
  159.                                                         $mark = '';
  160.                                                         $clean .= '*';
  161.                                                 }
  162.                                                 break;
  163.                                         case '#':
  164.                                                 if(empty($mark)) {
  165.                                                         $mark = $str;
  166.                                                         $clean .= $str;
  167.                                                 }
  168.                                                 break;
  169.                                         case "\n":
  170.                                                 if($mark == '#' || $mark == '--') {
  171.                                                         $mark = '';
  172.                                                 }
  173.                                                 break;
  174.                                         case '-':
  175.                                                 if(empty($mark)&& substr($sql, $i, 3) == '-- ') {
  176.                                                         $mark = '-- ';
  177.                                                         $clean .= $mark;
  178.                                                 }
  179.                                                 break;

  180.                                         default:

  181.                                                 break;
  182.                                 }
  183.                                 $clean .= $mark ? '' : $str;
  184.                         }
  185.                 }

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

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

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

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

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

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

  208.                 return 1;

  209.         }

  210. }
复制代码



上一篇:给触屏版发帖及回复时加入表情图片
下一篇:discuz X论坛 db_mysql类分析
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

快速回复 返回顶部 返回列表