Discuz教程网

史上第一强:Discuz 源代码分析系列(3)--./include/misc.func.php

[复制链接]
authicon rudsfwo 发表于 2013-1-22 10:53:19 | 显示全部楼层 |阅读模式
好像这个系列没多少人支持一样?呵呵,不过还是会继续下去的,毕竟我在Discuz当版主这么多年来也没有见过这种类型的帖子。

申明下版权:
1.这里面的每个中文字都是我打的,code部分是引用的,当然我也加了一点注释在里面了。
2.如果要转载的话请注明
  1. 转自[url]www.discuz.net[/url] 作者:郭鑫
复制代码

3.由于我个人的能力有限,写这篇文章没有参考一点资料,甚至连本地环境也没有搭建(遇到了白屏问题),所以难免会有错误的地方,大家发现了的话请跟帖或者联系我吧,我会尽快更正。


  1. //同样,防止非法引用用的。
  2. if(!defined('IN_DISCUZ')) {
  3. exit('Access Denied');
  4. }
复制代码
  1. /**
  2. * 这个函数看着很长,其实要实现的功能很少,就是通过ip地址返回一个对应的地理位置
  3. * @para string $ip //给定的ip,要符合点分十进制
  4. *
  5. * @return string
  6. */
  7. function convertip($ip) {
  8. if(!preg_match("/^d{1,3}.d{1,3}.d{1,3}.d{1,3}$/", $ip)) {
  9. return '';
  10. }
  11. if($fd = @fopen(DISCUZ_ROOT.'./ipdata/wry.dat', 'rb')) {
  12. $ip = explode('.', $ip);
  13. $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
  14. $DataBegin = fread($fd, 4);
  15. $DataEnd = fread($fd, 4);
  16. $ipbegin = implode('', unpack('L', $DataBegin));
  17. if($ipbegin < 0) $ipbegin += pow(2, 32);
  18. $ipend = implode('', unpack('L', $DataEnd));
  19. if($ipend < 0) $ipend += pow(2, 32);
  20. $ipAllNum = ($ipend - $ipbegin) / 7 + 1;
  21. $BeginNum = 0;
  22. $EndNum = $ipAllNum;
  23. while($ip1num > $ipNum || $ip2num < $ipNum) {
  24. $Middle= intval(($EndNum + $BeginNum) / 2);
  25. fseek($fd, $ipbegin + 7 * $Middle);
  26. $ipData1 = fread($fd, 4);
  27. if(strlen($ipData1) < 4) {
  28. fclose($fd);
  29. return '- System Error';
  30. }
  31. $ip1num = implode('', unpack('L', $ipData1));
  32. if($ip1num < 0) $ip1num += pow(2, 32);
  33. if($ip1num > $ipNum) {
  34. $EndNum = $Middle;
  35. continue;
  36. }
  37. $DataSeek = fread($fd, 3);
  38. if(strlen($DataSeek) < 3) {
  39. fclose($fd);
  40. return '- System Error';
  41. }
  42. $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
  43. fseek($fd, $DataSeek);
  44. $ipData2 = fread($fd, 4);
  45. if(strlen($ipData2) < 4) {
  46. fclose($fd);
  47. return '- System Error';
  48. }
  49. $ip2num = implode('', unpack('L', $ipData2));
  50. if($ip2num < 0) $ip2num += pow(2, 32);
  51. if($ip2num < $ipNum) {
  52. if($Middle == $BeginNum) {
  53. fclose($fd);
  54. return '- Unknown';
  55. }
  56. $BeginNum = $Middle;
  57. }
  58. }
  59. $ipFlag = fread($fd, 1);
  60. if($ipFlag == chr(1)) {
  61. $ipSeek = fread($fd, 3);
  62. if(strlen($ipSeek) < 3) {
  63. fclose($fd);
  64. return '- System Error';
  65. }
  66. $ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
  67. fseek($fd, $ipSeek);
  68. $ipFlag = fread($fd, 1);
  69. }
  70. if($ipFlag == chr(2)) {
  71. $AddrSeek = fread($fd, 3);
  72. if(strlen($AddrSeek) < 3) {
  73. fclose($fd);
  74. return '- System Error';
  75. }
  76. $ipFlag = fread($fd, 1);
  77. if($ipFlag == chr(2)) {
  78. $AddrSeek2 = fread($fd, 3);
  79. if(strlen($AddrSeek2) < 3) {
  80. fclose($fd);
  81. return '- System Error';
  82. }
  83. $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
  84. fseek($fd, $AddrSeek2);
  85. } else {
  86. fseek($fd, -1, SEEK_CUR);
  87. }
  88. while(($char = fread($fd, 1)) != chr(0))
  89. $ipAddr2 .= $char;
  90. $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
  91. fseek($fd, $AddrSeek);
  92. while(($char = fread($fd, 1)) != chr(0))
  93. $ipAddr1 .= $char;
  94. } else {
  95. fseek($fd, -1, SEEK_CUR);
  96. while(($char = fread($fd, 1)) != chr(0))
  97. $ipAddr1 .= $char;
  98. $ipFlag = fread($fd, 1);
  99. if($ipFlag == chr(2)) {
  100. $AddrSeek2 = fread($fd, 3);
  101. if(strlen($AddrSeek2) < 3) {
  102. fclose($fd);
  103. return '- System Error';
  104. }
  105. $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
  106. fseek($fd, $AddrSeek2);
  107. } else {
  108. fseek($fd, -1, SEEK_CUR);
  109. }
  110. while(($char = fread($fd, 1)) != chr(0))
  111. $ipAddr2 .= $char;
  112. }
  113. fclose($fd);
  114. if(preg_match('/http/i', $ipAddr2)) {
  115. $ipAddr2 = '';
  116. }
  117. $ipaddr = "$ipAddr1 $ipAddr2";
  118. $ipaddr = preg_replace('/CZ88.NET/is', '', $ipaddr);
  119. $ipaddr = preg_replace('/^s*/is', '', $ipaddr);
  120. $ipaddr = preg_replace('/s*$/is', '', $ipaddr);
  121. if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
  122. $ipaddr = '- Unknown';
  123. }
  124. return '- '.$ipaddr;
  125. } else {
  126. $datadir = DISCUZ_ROOT.'./ipdata/';
  127. $ip_detail = explode('.', $ip);
  128. if(file_exists($datadir.$ip_detail[0].'.txt')) {
  129. $ip_fdata = @fopen($datadir.$ip_detail[0].'.txt', 'r');
  130. } else {
  131. if(!($ip_fdata = @fopen($datadir.'0.txt', 'r'))) {
  132. return '- Invalid IP data file';
  133. }
  134. }
  135. for($i = 0; $i = $ip_data_detail[0] && $ip  $thread['views']) {
  136. $thread['views'] = $thread['replies'];
  137. }
  138. $postsnum = $thread['replies'] + 1;
  139. $pagelinks = '';
  140. if($postsnum > $ppp) {
  141. $posts = $postsnum;
  142. $topicpages = ceil($posts / $ppp);
  143. for($i = 1; $i  6) {
  144. $pagelinks .= ' .. '.$topicpages.' ';
  145. }
  146. $thread['multipage'] = ' (  '.$pagelinks.')';
  147. } else {
  148. $thread['multipage'] = '';
  149. }
  150. if($thread['highlight']) {
  151. $string = sprintf('%02d', $thread['highlight']);
  152. $stylestr = sprintf('%03b', $string[0]);
  153. $thread['highlight'] = 'style="';
  154. $thread['highlight'] .= $stylestr[0] ? 'font-weight: bold;' : '';
  155. $thread['highlight'] .= $stylestr[1] ? 'font-style: italic;' : '';
  156. $thread['highlight'] .= $stylestr[2] ? 'text-decoration: underline;' : '';
  157. $thread['highlight'] .= $string[1] ? 'color: '.$colorarray[$string[1]] : '';
  158. $thread['highlight'] .= '"';
  159. } else {
  160. $thread['highlight'] = '';
  161. }
  162. if($thread['attachment']) {
  163. require_once DISCUZ_ROOT.'./include/attachment.func.php';
  164. $thread['attachment'] = attachtype($thread['attachment']).' ';
  165. } else {
  166. $thread['attachment'] = '';
  167. }
  168. return $thread;
  169. }
复制代码
  1. /**
  2. * 用来更新点击数的
  3. * @para string $table //用来更新的数据表
  4. * @para string $idcol //用来更新的数据的id
  5. * @para string $viewscol //用来更新的列
  6. * @para string $logfile //日志文件,点击是写入日志的
  7. */
  8. function updateviews($table, $idcol, $viewscol, $logfile) {
  9. global $db, $tablepre;
  10. $viewlog = $viewarray = array();
  11. if(@$viewlog = file($logfile = DISCUZ_ROOT.$logfile)) {
  12. @unlink($logfile);
  13. $viewlog = array_count_values($viewlog);
  14. foreach($viewlog as $id => $views) {
  15. $viewarray[$views] .= ($id > 0) ? ','.intval($id) : '';
  16. }
  17. foreach($viewarray as $views => $ids) {
  18. $db->query("UPDATE $tablepre$table SET $viewscol=$viewscol+$views WHERE $idcol IN (0$ids)", 'UNBUFFERED');
  19. }
  20. }
  21. }
复制代码
  1. /**
  2. * 给版主的工作写入日志的
  3. * @para array $thread //对哪个帖子的操作
  4. * @para string $action //进行的什么操作
  5. *
  6. */
  7. function modlog($thread, $action) {
  8. global $discuz_user, $adminid, $onlineip, $timestamp, $forum, $reason;
  9. writelog('modslog', dhtmlspecialchars("$timestampt$discuz_usert$adminidt$onlineipt$forum[fid]t$forum[name]t$thread[tid]t$thread[subject]t$actiont$reason"));
  10. }
复制代码
  1. /**
  2. * 检查是不是写了理由
  3. *
  4. */
  5. function checkreasonpm() {
  6. global $reason;
  7. $reason = trim(strip_tags($reason));
  8. if(($GLOBALS['reasonpm'] == 1 || $GLOBALS['reasonpm'] == 3) && !$reason) {
  9. showmessage('admin_reason_invalid');
  10. }
  11. }
复制代码

  1. /**
  2. * 发送操作理由报告给帖子作者
  3. * @para array $var
  4. * @para string $item
  5. */
  6. function sendreasonpm($var, $item) {
  7. global $$var;
  8. ${$var}['subject'] = strtr(${$var}['subject'], array_flip(get_html_translation_table(HTML_ENTITIES)));
  9. ${$var}['dateline'] = gmdate($GLOBALS['_DCACHE']['settings']['dateformat'].' '.$GLOBALS['_DCACHE']['settings']['timeformat'], ${$var}['dateline'] + ($GLOBALS['timeoffset'] * 3600));
  10. sendpm(${$var}['authorid'], $item.'_subject', $item.'_message');
  11. }
复制代码
  1. /**
  2. * 得到一个下拉列表,这个列表是版主操作理由选择
  3. *
  4. * @return string $select
  5. */
  6. function modreasonselect() {
  7. global $_DCACHE;
  8. if(!isset($_DCACHE['modreasons']) || !is_array($_DCACHE['modreasons'])) {
  9. @include DISCUZ_ROOT.'./forumdata/cache/cache_topicadmin.php';
  10. }
  11. $select = '';
  12. foreach($_DCACHE['modreasons'] as $reason) {
  13. $select .= $reason ? ''.$reason.'' : '--------';
  14. }
  15. return $select;
  16. }
复制代码
  1. /**
  2. * 登陆检查,看看是不是在十五分钟已经登陆五次了
  3. *
  4. * @return int
  5. */
  6. function logincheck() {
  7. global $db, $tablepre, $onlineip, $timestamp;
  8. $query = $db->query("SELECT count, lastupdate FROM {$tablepre}failedlogins WHERE ip='$onlineip'");
  9. if($login = $db->fetch_array($query)) {
  10. if($timestamp - $login['lastupdate'] > 900) {
  11. return 3;
  12. } elseif($login['count'] < 5) {
  13. return 2;
  14. } else {
  15. return 0;
  16. }
  17. } else {
  18. return 1;
  19. }
  20. }
复制代码
[code]<div id="code_Aym">
/**
* 和上面的那个函数(logincheck)是配对的,看是哪种方式登陆的
* @para int $permission
*
*/
function loginfailed($permission) {
global $db, $tablepre, $onlineip, $timestamp;
switch($permission) {
case 1: $db->query("REPLACE INTO {$tablepre}failedlogins (ip, count, lastupdate) VALUES ('$onlineip', '1', '$timestamp')");
break;
case 2: $db->query("UPDATE {$tablepre}failedlogins SET count=count+1, lastupdate='$timestamp' WHERE ip='$onlineip'");
break;
case 3: $db->query("UPDATE {$tablepre}failedlogins SET count='1', lastupdate='$timestamp' WHERE ip='$onlineip'");
$db->query("DELETE FROM {$tablepre}failedlogins WHERE lastupdate



上一篇:史上第一强:Discuz 源代码分析系列(2)--./include/global.func.php(2)
下一篇:在后台并没有开启标签功能,为什么前台会自动出现?(已解决)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-4 11:06

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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