请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

一起开发

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

discuz X1.5 DB数据库类详细说明

发表于 2012-12-22 17:55 作者:phper
php结合memcache实现访问统计文章点击的计数
随着访问量的增大,点击数直接更新数据库已经不太可能了,数据库中点击的更新 ...
Web开发利器,简版开发手册助您快速开发(图
web开发,帮助手册是我们经常查询的,查函数、查属性等等,下面图片里综合了各开发手册 ...
本帖最后由 phper 于 2012-12-22 18:06 编辑

discuzX 系列的db数据库类写的已经非常好了,从性能、安全性和易用性上都做的非常优秀了,下面我们来分析讲解一下db数据类:
  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(emptyempty($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(emptyempty($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(emptyempty($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(emptyempty($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(emptyempty($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(emptyempty($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(emptyempty($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. }
复制代码
discuzX 系列的db数据库类,大家在熟练掌握的情况下可以用于自己其他项目的开发。
相关: 独立分解出来的Discuz数据库DB类,非常实用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|一起开发   

GMT+8, 2017-9-23 20:46 , Processed in 0.130946 second(s), 28 queries .

Powered by Discuz! X2.5 Licensed

© 2001-2012 Comsenz Inc.

回顶部