第二天,仔细学习了下:common.inc.php(Discuz6.1.0核心文件)02

  1. 云栖社区>
  2. 博客>
  3. 正文

第二天,仔细学习了下:common.inc.php(Discuz6.1.0核心文件)02

技术小胖子 2017-11-09 21:41:00 浏览1040
展开阅读全文

  1. <?php 
  2.  
  3. /* 
  4. April 18,2012 
  5. discuz二次开发学习 
  6. author:xuqin 
  7. 不能为了完成任务去做一件事,要举一反三,融会贯通的去学习。 
  8. */   
  9.  
  10. if($_DSESSION = $db->fetch_array($query)) {//运行上面的sql语句,然后将结果存入$_DSESSION数组 
  11.         $sessionexists = 1;//将$sessionexists赋值为1 
  12.         if(!emptyempty($_DSESSION['sessionuid'])) { 
  13.             $_DSESSION = array_merge($_DSESSION$db->fetch_first("SELECT $membertablefields 
  14.                 FROM {$tablepre}members m WHERE uid='$_DSESSION[sessionuid]'")); 
  15.         } 
  16.     } else {//如果用上面的sql语句取不到值,则从sessions中取得部分数据 
  17.         if($_DSESSION = $db->fetch_first("SELECT sid, groupid, groupid='6' AS ipbanned, pageviews AS spageviews, styleid, lastolupdate, seccode 
  18.             FROM {$tablepre}sessions WHERE sid='$sid' AND CONCAT_WS('.',ip1,ip2,ip3,ip4)='$onlineip'")) { 
  19.             clearcookies(); 
  20.             $sessionexists = 1; 
  21.         } 
  22.     } 
  23.     /* 
  24.      * 如果当前用户状态信息中,$discuz_uid有效,对自定义的SESSION表cdb_sessions以及表cdb_members进行查询比较。 
  25.      * 如果$_DSESSION['sessionuid']非空,即表示$query是上面的第二种方式——仅仅从session表中取出相关信息(有"uid AS sessionuid") 
  26.      * 则利用此$_DSESSION['sessionuid']变量再到members表取数据,最后合并两个数组共同存为$_DSESSION 
  27.      * 接下来是判断是不是有sid,有的话就从cdb_session表中取来,然后连接一下cdb_members表取出一些更具体的东西,具体是哪些东西? 
  28.  
  29.      * 在$membertablefields这个变量里面已经全面写出来了,在这里Discuz标记了一个 sessionexist变量,表示这个会员是在线的。 
  30.      */ 
  31.  
  32. if(!$sessionexists) {//如果session不存在(根据上面那段 好像就表示$_DSESSION无法取到) 
  33.     if($discuz_uid) {//session不存在,且cookie中有用户id,则根据这个uid和pw取用户信息,如果取不到,就清空cookies,如果取得到,则更新$_DSESSION 
  34.         if(!($_DSESSION = $db->fetch_first("SELECT $membertablefields, m.styleid 
  35.             FROM {$tablepre}members m WHERE m.uid='$discuz_uid' AND m.password='$discuz_pw' AND m.secques='$discuz_secques'"))) { 
  36.             clearcookies(); 
  37.         } 
  38.     } 
  39.  
  40.     if(ipbanned($onlineip)) $_DSESSION['ipbanned'] = 1;//判断ip是否被禁止,同时更新DSESSION数组的ip禁止信息 
  41.     $_DSESSION['sid'] = random(6); 
  42.     $_DSESSION['seccode'] = random(6, 1); 
  43. /* 
  44.  *  要是不存在sid,不存在discuz_uid,那就肯定没有登陆了,清掉cookie,要是有$discuz_uid的话,还是从members表中取出信息存放到$_DSESSION数组中 
  45.  *  更新DSESSION中的sid和seccode(验证码)random函数见global.func.php仔细研究一下这个函数,了解随机验证码生成原理。 
  46.  */ 
  47.  
  48. $_DSESSION['dateformat'] = emptyempty($_DSESSION['dateformat']) || emptyempty($_DCACHE['settings']['userdateformat'][$_DSESSION['dateformat'] -1])? $_DCACHE['settings']['dateformat'] : $_DCACHE['settings']['userdateformat'][$_DSESSION['dateformat'] -1]; 
  49. $_DSESSION['timeformat'] = emptyempty($_DSESSION['timeformat']) ? $_DCACHE['settings']['timeformat'] : ($_DSESSION['timeformat'] == 1 ? 'h:i A' : 'H:i'); 
  50. $_DSESSION['timeoffset'] = isset($_DSESSION['timeoffset']) && $_DSESSION['timeoffset'] != 9999 ? $_DSESSION['timeoffset'] : $_DCACHE['settings']['timeoffset']; 
  51. /* 
  52.  * 时区的处理,日期,时间的格式化,写入$_DSESSION这个变量。 
  53.  */ 
  54.  
  55. $membertablefields = ''
  56. @extract($_DSESSION); 
  57. /* 
  58.  * 清空$membertablefields并将$_DSESSION数组变量导入符号表,生成了$discuz_uid,$discuz_user,$dateformat,等等很多有关用户信息的变量 
  59.  */ 
  60.  
  61. $lastvisit = emptyempty($lastvisit) ? $timestamp - 86400 : $lastvisit;//用户最后访问时间(上次访问时间) 
  62.  
  63. $timenow = array('time' => gmdate("$dateformat $timeformat"$timestamp + 3600 * $timeoffset), 
  64.     'offset' => ($timeoffset >= 0 ? ($timeoffset == 0 ? '' : '+'.$timeoffset) : $timeoffset)); 
  65. /* 
  66.  * 设置$timenow数组,包括time和offset元素 
  67.  * $timenow数组中,time元素表示格式化后的当前时间,offset元素表示当前服务器所在的时区序号 
  68.  */ 
  69.  
  70. if(PHP_VERSION > '5.1') {// 
  71.     @date_default_timezone_set('Etc/GMT'.($timeoffset > 0 ? '-' : '+').(abs($timeoffset))); 
  72. /* 
  73.  * date_default_timezone_set 设定用于一个脚本中所有日期时间函数的默认时区 
  74.  * PHP版本高于5.1时,根据$timeoffset的值设置默认时区。 
  75.  */ 
  76.  
  77. $accessadd1 = $accessadd2 = $modadd1 = $modadd2 = $metadescription = ''
  78. /* 
  79.  * 首 先初始化变量,然后看看$discuz_user$和$discuz_user这两个变量是不是存在,不存在的话一系列的变量全部置0(没登陆当然不存在 版主权限管理员什么的),存在的话就来两个赋值,这就是为什么在Discuz UserGuide里面说$discuz_userss是没有过滤的,而$discuz_user是过滤掉的,能直接进行数据库操作的。 
  80. 然后看看怎么样设置PHP 的出错级别,注意如果你的管理员的话,Discuz给的是一个更高的错误显示级别! 
  81.  */ 
  82. if(emptyempty($discuz_uid) || emptyempty($discuz_user)) { 
  83.     $discuz_user = $extgroupids = ''
  84.     $discuz_uid = $adminid = $posts = $digestposts = $pageviews = $oltime = $invisible 
  85.         = $credits = $extcredits1 = $extcredits2 = $extcredits3 = $extcredits4 
  86.         = $extcredits5 = $extcredits6 = $extcredits7 = $extcredits8 = 0; 
  87.     $groupid = emptyempty($groupid) || $groupid != 6 ? 7 : 6; 
  88.  
  89. else {//如果$discuz_uid或者$discuz_user不为空,则对用户名进行使用反斜线转义,然后存入变量$discuz_userss 
  90.     $discuz_userss = $discuz_user
  91.     $discuz_user = addslashes($discuz_user); 
  92.  
  93.     if($accessmasks) {//用户对版块的访问规则 
  94.         $accessadd1 = ', a.allowview, a.allowpost, a.allowreply, a.allowgetattach, a.allowpostattach'
  95.         $accessadd2 = "LEFT JOIN {$tablepre}access a ON a.uid='$discuz_uid' AND a.fid=f.fid"
  96.     } 
  97.  
  98.     if($adminid == 3) {//版主的操作规则,这里运行sql后会产生一个变量$ismoderator标识用户是否为版主 
  99.         $modadd1 = ', m.uid AS ismoderator'
  100.         $modadd2 = "LEFT JOIN {$tablepre}moderators m ON m.uid='$discuz_uid' AND m.fid=f.fid"
  101.     } 
  102.  
  103. if($errorreport == 2 || ($errorreport == 1 && $adminid > 0)) {//针对管理组用户单独设置错误报告级别 
  104.     error_reporting(E_ERROR | E_WARNING | E_PARSE); 
  105.  
  106. define('FORMHASH', formhash());//得到FORMHASH常量,见global.func 361行 
  107.  
  108. $statstatus && !$inajax && require_once DISCUZ_ROOT.'./include/counter.inc.php';//引用访问统计脚本文件(如果启用了),$statstatus变 量见DCACHE 
  109.  
  110. $extra = isset($extra) && @preg_match("/^[&=;a-z0-9]+$/i"$extra) ? $extra : '';//$extra 暂不知哪里需用到 
  111.  
  112. $rsshead = $navtitle = $navigation = '';//rss,导航信息 
  113.  
  114. $_DSESSION['groupid'] = $groupid = emptyempty($ipbanned) ? (emptyempty($groupid) ? 7 : intval($groupid)) : 6;//根据不同条件判断用户组 
  115.  
  116. if(!@include DISCUZ_ROOT.'./forumdata/cache/usergroup_'.$groupid.'.php') { 
  117.     $grouptype = $db->result_first("SELECT type FROM {$tablepre}usergroups WHERE groupid='$groupid'"); 
  118.     if(!emptyempty($grouptype)) { 
  119.         $cachelost .= ' usergroup_'.$groupid
  120.     } else { 
  121.         $grouptype = 'member'
  122.     } 
  123. /* 
  124.  * 从缓存读用户组配置信息,存入$grouptype数组,如果不能读到,则将$grouptype设置为字符串"member" 
  125.  * 用来得到用户组的,首先看看是不是缓存中有,没有的话就访问数据库了,有的话当然就用缓存的。。 
  126.  */ 
  127.  
  128. $link_login = 'logging.php?action=login';//登陆、退出、注册等链接的url地址,Discuz通行证用的,主要就是得到一些应用程序的地址。 
  129. $link_logout = 'logging.php?action=logout&amp;formhash='.FORMHASH; 
  130. $link_register = $regname
  131.  
  132. if($discuz_uid && $_DSESSION) { 
  133.     if(!emptyempty($groupexpiry) && $groupexpiry < $timestamp && !in_array(CURSCRIPT, array('wap''member'))) { 
  134.         dheader("Location: {$boardurl}member.php?action=groupexpiry"); 
  135.     } elseif($grouptype && $groupid != getgroupid($discuz_uidarray 
  136.         ( 
  137.         'type' => $grouptype,                                          //这个type为system或者member,表示系统组与用户组 
  138.         'creditshigher' => $groupcreditshigher,         //积分上限 
  139.         'creditslower' => $groupcreditslower            //积分下限 
  140.         ), $_DSESSION)) { 
  141.         @extract($_DSESSION); 
  142.         $cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/usergroup_'.intval($groupid).'.php') ? '' : ' usergroup_'.$groupid
  143.     } 
  144. /* 
  145.  * 用户过期时间的判断 
  146.  * $groupexpiry 来自 members表,如果用户过期,跳到member.php页面提示过期,否则更新用户所在组的相关信息(如更新等级,积分等)并 
  147.  
  148.  * extract($_DSESSION) 
  149.  * getgroupid函数见global.func.php 
  150.  * 这一段用来判断你的用户组是不是过期了的,如果过期了很不幸,就被告知用户组过期了。如果没有过期的话就再展开一下$_DSESSION,因为此时 
  151.  
  152.  * 的$_DSESSION包含了更多的东西了。 
  153.  */ 
  154.  
  155. $tpp = intval(emptyempty($_DSESSION['tpp']) ? $topicperpage : $_DSESSION['tpp']); 
  156. $ppp = intval(emptyempty($_DSESSION['ppp']) ? $postperpage : $_DSESSION['ppp']); 
  157. /* 
  158.  * 每页显示帖子数,每页显示回复数,如果用户没有指定,使用系统默认值 
  159.  */ 
  160.  
  161. if(!in_array($adminidarray(1, 2, 3))) { 
  162.     $alloweditpost = $alloweditpoll = $allowstickthread = $allowmodpost = $allowdelpost = $allowmassprune 
  163.         = $allowrefund = $allowcensorword = $allowviewip = $allowbanip = $allowedituser = $allowmoduser 
  164.         = $allowbanuser = $allowpostannounce = $allowviewlog = $disablepostctrl = 0; 
  165. elseif(isset($radminid) && $adminid != $radminid && $adminid != $groupid) { 
  166.     $cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/admingroup_'.intval($adminid).'.php') ? '' : ' admingroup_'.$groupid
  167. /* 
  168.  * 判断当前用户权限,分别对应admin, moderator, super moderator;如不是,则没有权限。 
  169.  * 如果用户不是管理组,则关闭相关权限(如编辑回复,删除回复,编辑用户等) 
  170.  * 如果是管理组用户,则引入管理组配置缓存文件。 $radminid表示"关联管理权" 
  171.  */ 
  172.  
  173. $auditstatuson = !emptyempty($mod) && $mod == 'edit' && in_array($adminidarray(1, 2, 3)) && $allowmodpost ? true : false; 
  174.  
  175. $page = isset($page) ? max(1, intval($page)) : 1;  //分页处理时,分页序号 
  176. $tid = isset($tid) && is_numeric($tid) ? $tid : 0;     //主题编号 
  177. $fid = isset($fid) && is_numeric($fid) ? $fid : 0;      //论坛版块编号 
  178. $typeid = isset($typeid) ? intval($typeid) : 0;            //主题所属主题分类编号 
  179. /* 
  180.  * 当前用户是否有权对论坛主题或帖子进行管理操作。 
  181.  * $auditstatuson变量(true或false),$mod非空且为edit,同时还要满足adminid属于123组,则允许对主题进行操作 
  182.  * url地址中的传递的一些值,如页数目,主题id,版块id,分类id,给个例子你看下就知道了,这个一个主题的链接和一个版块的链接 
  183.  * http://bbs.test.com/viewthread.php?tid=158&extra=page%3D1%26amp%3Bfilter%3Ddigest 
  184.  * http://bbs.test.com/forumdisplay.php?fid=18 
  185.  */ 
  186.  
  187. ?> 

(完)  记得多回过头来看看,温故而知新!



      本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/882315,如需转载请自行联系原作者



网友评论

登录后评论
0/500
评论
技术小胖子
+ 关注