- <?php
- /*
- April 18,2012
- discuz二次开发学习
- author:xuqin
- 不能为了完成任务去做一件事,要举一反三,融会贯通的去学习。
- */
- if($_DSESSION = $db->fetch_array($query)) {//运行上面的sql语句,然后将结果存入$_DSESSION数组
- $sessionexists = 1;//将$sessionexists赋值为1
- if(!emptyempty($_DSESSION['sessionuid'])) {
- $_DSESSION = array_merge($_DSESSION, $db->fetch_first("SELECT $membertablefields
- FROM {$tablepre}members m WHERE uid='$_DSESSION[sessionuid]'"));
- }
- } else {//如果用上面的sql语句取不到值,则从sessions中取得部分数据
- if($_DSESSION = $db->fetch_first("SELECT sid, groupid, groupid='6' AS ipbanned, pageviews AS spageviews, styleid, lastolupdate, seccode
- FROM {$tablepre}sessions WHERE sid='$sid' AND CONCAT_WS('.',ip1,ip2,ip3,ip4)='$onlineip'")) {
- clearcookies();
- $sessionexists = 1;
- }
- }
- }
- /*
- * 如果当前用户状态信息中,$discuz_uid有效,对自定义的SESSION表cdb_sessions以及表cdb_members进行查询比较。
- * 如果$_DSESSION['sessionuid']非空,即表示$query是上面的第二种方式——仅仅从session表中取出相关信息(有"uid AS sessionuid")
- * 则利用此$_DSESSION['sessionuid']变量再到members表取数据,最后合并两个数组共同存为$_DSESSION
- * 接下来是判断是不是有sid,有的话就从cdb_session表中取来,然后连接一下cdb_members表取出一些更具体的东西,具体是哪些东西?
- * 在$membertablefields这个变量里面已经全面写出来了,在这里Discuz标记了一个 sessionexist变量,表示这个会员是在线的。
- */
- if(!$sessionexists) {//如果session不存在(根据上面那段 好像就表示$_DSESSION无法取到)
- if($discuz_uid) {//session不存在,且cookie中有用户id,则根据这个uid和pw取用户信息,如果取不到,就清空cookies,如果取得到,则更新$_DSESSION
- if(!($_DSESSION = $db->fetch_first("SELECT $membertablefields, m.styleid
- FROM {$tablepre}members m WHERE m.uid='$discuz_uid' AND m.password='$discuz_pw' AND m.secques='$discuz_secques'"))) {
- clearcookies();
- }
- }
- if(ipbanned($onlineip)) $_DSESSION['ipbanned'] = 1;//判断ip是否被禁止,同时更新DSESSION数组的ip禁止信息
- $_DSESSION['sid'] = random(6);
- $_DSESSION['seccode'] = random(6, 1);
- }
- /*
- * 要是不存在sid,不存在discuz_uid,那就肯定没有登陆了,清掉cookie,要是有$discuz_uid的话,还是从members表中取出信息存放到$_DSESSION数组中
- * 更新DSESSION中的sid和seccode(验证码)random函数见global.func.php仔细研究一下这个函数,了解随机验证码生成原理。
- */
- $_DSESSION['dateformat'] = emptyempty($_DSESSION['dateformat']) || emptyempty($_DCACHE['settings']['userdateformat'][$_DSESSION['dateformat'] -1])? $_DCACHE['settings']['dateformat'] : $_DCACHE['settings']['userdateformat'][$_DSESSION['dateformat'] -1];
- $_DSESSION['timeformat'] = emptyempty($_DSESSION['timeformat']) ? $_DCACHE['settings']['timeformat'] : ($_DSESSION['timeformat'] == 1 ? 'h:i A' : 'H:i');
- $_DSESSION['timeoffset'] = isset($_DSESSION['timeoffset']) && $_DSESSION['timeoffset'] != 9999 ? $_DSESSION['timeoffset'] : $_DCACHE['settings']['timeoffset'];
- /*
- * 时区的处理,日期,时间的格式化,写入$_DSESSION这个变量。
- */
- $membertablefields = '';
- @extract($_DSESSION);
- /*
- * 清空$membertablefields并将$_DSESSION数组变量导入符号表,生成了$discuz_uid,$discuz_user,$dateformat,等等很多有关用户信息的变量
- */
- $lastvisit = emptyempty($lastvisit) ? $timestamp - 86400 : $lastvisit;//用户最后访问时间(上次访问时间)
- $timenow = array('time' => gmdate("$dateformat $timeformat", $timestamp + 3600 * $timeoffset),
- 'offset' => ($timeoffset >= 0 ? ($timeoffset == 0 ? '' : '+'.$timeoffset) : $timeoffset));
- /*
- * 设置$timenow数组,包括time和offset元素
- * $timenow数组中,time元素表示格式化后的当前时间,offset元素表示当前服务器所在的时区序号
- */
- if(PHP_VERSION > '5.1') {//
- @date_default_timezone_set('Etc/GMT'.($timeoffset > 0 ? '-' : '+').(abs($timeoffset)));
- }
- /*
- * date_default_timezone_set 设定用于一个脚本中所有日期时间函数的默认时区
- * PHP版本高于5.1时,根据$timeoffset的值设置默认时区。
- */
- $accessadd1 = $accessadd2 = $modadd1 = $modadd2 = $metadescription = '';
- /*
- * 首 先初始化变量,然后看看$discuz_user$和$discuz_user这两个变量是不是存在,不存在的话一系列的变量全部置0(没登陆当然不存在 版主权限管理员什么的),存在的话就来两个赋值,这就是为什么在Discuz UserGuide里面说$discuz_userss是没有过滤的,而$discuz_user是过滤掉的,能直接进行数据库操作的。
- 然后看看怎么样设置PHP 的出错级别,注意如果你的管理员的话,Discuz给的是一个更高的错误显示级别!
- */
- if(emptyempty($discuz_uid) || emptyempty($discuz_user)) {
- $discuz_user = $extgroupids = '';
- $discuz_uid = $adminid = $posts = $digestposts = $pageviews = $oltime = $invisible
- = $credits = $extcredits1 = $extcredits2 = $extcredits3 = $extcredits4
- = $extcredits5 = $extcredits6 = $extcredits7 = $extcredits8 = 0;
- $groupid = emptyempty($groupid) || $groupid != 6 ? 7 : 6;
- } else {//如果$discuz_uid或者$discuz_user不为空,则对用户名进行使用反斜线转义,然后存入变量$discuz_userss
- $discuz_userss = $discuz_user;
- $discuz_user = addslashes($discuz_user);
- if($accessmasks) {//用户对版块的访问规则
- $accessadd1 = ', a.allowview, a.allowpost, a.allowreply, a.allowgetattach, a.allowpostattach';
- $accessadd2 = "LEFT JOIN {$tablepre}access a ON a.uid='$discuz_uid' AND a.fid=f.fid";
- }
- if($adminid == 3) {//版主的操作规则,这里运行sql后会产生一个变量$ismoderator标识用户是否为版主
- $modadd1 = ', m.uid AS ismoderator';
- $modadd2 = "LEFT JOIN {$tablepre}moderators m ON m.uid='$discuz_uid' AND m.fid=f.fid";
- }
- }
- if($errorreport == 2 || ($errorreport == 1 && $adminid > 0)) {//针对管理组用户单独设置错误报告级别
- error_reporting(E_ERROR | E_WARNING | E_PARSE);
- }
- define('FORMHASH', formhash());//得到FORMHASH常量,见global.func 361行
- $statstatus && !$inajax && require_once DISCUZ_ROOT.'./include/counter.inc.php';//引用访问统计脚本文件(如果启用了),$statstatus变 量见DCACHE
- $extra = isset($extra) && @preg_match("/^[&=;a-z0-9]+$/i", $extra) ? $extra : '';//$extra 暂不知哪里需用到
- $rsshead = $navtitle = $navigation = '';//rss,导航信息
- $_DSESSION['groupid'] = $groupid = emptyempty($ipbanned) ? (emptyempty($groupid) ? 7 : intval($groupid)) : 6;//根据不同条件判断用户组
- if(!@include DISCUZ_ROOT.'./forumdata/cache/usergroup_'.$groupid.'.php') {
- $grouptype = $db->result_first("SELECT type FROM {$tablepre}usergroups WHERE groupid='$groupid'");
- if(!emptyempty($grouptype)) {
- $cachelost .= ' usergroup_'.$groupid;
- } else {
- $grouptype = 'member';
- }
- }
- /*
- * 从缓存读用户组配置信息,存入$grouptype数组,如果不能读到,则将$grouptype设置为字符串"member"
- * 用来得到用户组的,首先看看是不是缓存中有,没有的话就访问数据库了,有的话当然就用缓存的。。
- */
- $link_login = 'logging.php?action=login';//登陆、退出、注册等链接的url地址,Discuz通行证用的,主要就是得到一些应用程序的地址。
- $link_logout = 'logging.php?action=logout&formhash='.FORMHASH;
- $link_register = $regname;
- if($discuz_uid && $_DSESSION) {
- if(!emptyempty($groupexpiry) && $groupexpiry < $timestamp && !in_array(CURSCRIPT, array('wap', 'member'))) {
- dheader("Location: {$boardurl}member.php?action=groupexpiry");
- } elseif($grouptype && $groupid != getgroupid($discuz_uid, array
- (
- 'type' => $grouptype, //这个type为system或者member,表示系统组与用户组
- 'creditshigher' => $groupcreditshigher, //积分上限
- 'creditslower' => $groupcreditslower //积分下限
- ), $_DSESSION)) {
- @extract($_DSESSION);
- $cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/usergroup_'.intval($groupid).'.php') ? '' : ' usergroup_'.$groupid;
- }
- }
- /*
- * 用户过期时间的判断
- * $groupexpiry 来自 members表,如果用户过期,跳到member.php页面提示过期,否则更新用户所在组的相关信息(如更新等级,积分等)并
- * extract($_DSESSION)
- * getgroupid函数见global.func.php
- * 这一段用来判断你的用户组是不是过期了的,如果过期了很不幸,就被告知用户组过期了。如果没有过期的话就再展开一下$_DSESSION,因为此时
- * 的$_DSESSION包含了更多的东西了。
- */
- $tpp = intval(emptyempty($_DSESSION['tpp']) ? $topicperpage : $_DSESSION['tpp']);
- $ppp = intval(emptyempty($_DSESSION['ppp']) ? $postperpage : $_DSESSION['ppp']);
- /*
- * 每页显示帖子数,每页显示回复数,如果用户没有指定,使用系统默认值
- */
- if(!in_array($adminid, array(1, 2, 3))) {
- $alloweditpost = $alloweditpoll = $allowstickthread = $allowmodpost = $allowdelpost = $allowmassprune
- = $allowrefund = $allowcensorword = $allowviewip = $allowbanip = $allowedituser = $allowmoduser
- = $allowbanuser = $allowpostannounce = $allowviewlog = $disablepostctrl = 0;
- } elseif(isset($radminid) && $adminid != $radminid && $adminid != $groupid) {
- $cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/admingroup_'.intval($adminid).'.php') ? '' : ' admingroup_'.$groupid;
- }
- /*
- * 判断当前用户权限,分别对应admin, moderator, super moderator;如不是,则没有权限。
- * 如果用户不是管理组,则关闭相关权限(如编辑回复,删除回复,编辑用户等)
- * 如果是管理组用户,则引入管理组配置缓存文件。 $radminid表示"关联管理权"
- */
- $auditstatuson = !emptyempty($mod) && $mod == 'edit' && in_array($adminid, array(1, 2, 3)) && $allowmodpost ? true : false;
- $page = isset($page) ? max(1, intval($page)) : 1; //分页处理时,分页序号
- $tid = isset($tid) && is_numeric($tid) ? $tid : 0; //主题编号
- $fid = isset($fid) && is_numeric($fid) ? $fid : 0; //论坛版块编号
- $typeid = isset($typeid) ? intval($typeid) : 0; //主题所属主题分类编号
- /*
- * 当前用户是否有权对论坛主题或帖子进行管理操作。
- * $auditstatuson变量(true或false),$mod非空且为edit,同时还要满足adminid属于123组,则允许对主题进行操作
- * url地址中的传递的一些值,如页数目,主题id,版块id,分类id,给个例子你看下就知道了,这个一个主题的链接和一个版块的链接
- * http://bbs.test.com/viewthread.php?tid=158&extra=page%3D1%26amp%3Bfilter%3Ddigest
- * http://bbs.test.com/forumdisplay.php?fid=18
- */
- ?>
(完) 记得多回过头来看看,温故而知新!
本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/882315,如需转载请自行联系原作者