需求:站点是由两个系统组成的分别是基于TP的yourphp和discuz,yourphp作为一个新闻站,而discuz作为一个论坛模块,新闻站只提供用户新闻浏览得功能,用户不能注册,只能浏览新闻,论坛提供注册,在网站的首页提供了用户登陆的入口,
出现的问题:
discuz提供了一个用户登录的入口“bbs/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes”,用户在网站填写信息的时候其实是提交到论坛里面进行登陆,登陆过程是在论坛进行的。那么网站首页的那个登陆框因为没有判断用户是否登录,所以即使用户登陆之后还是会显示登陆框,这就出现了一个问题,怎么在不同 的系统判断用户是否登陆。
通过查资料,我找到了这两篇文章
discuz session机制流程图http://www.super-jin.com/?p=55
Discuz 的 session 机制 http://my.oschina.net/xieyunzi/blog/161756#OSC_h2_1 这两篇文章简述了discuz的session机制
这里值得注意的是,当用户退出的时候,会执行一个叫clearcookie的方法,这个方法是把用户的所有COOKIE清空,而SID是存在COOKIE里的,这时候要是清空了COOKIE则SID的值就会被改变了
为了保持当前这个用户的SID(不管登录、还是退出,SID的值都一样,模拟会话的基本原理),DX用了一个小技巧,即在退出的时候,调用了showmessage方法
showmessage方法是DX通用的提示跳转方法,调用这个方法会给用户一个很好的提示页面
但是在这个页面里,他会加载footer.htm模板,这个模板里执行了updatesession方法,而这个方法里会把SID再重新种到COOKIE里
即:
清除SID的COOKIE –> 调用showmessage –> 调用updatesession –>重新种上SID的COOKIE
这时SID就能从头到尾保持不变了。
这两篇文章讲了discuz的session原理
我查询pre_common_session表,的确是当用户登陆的时候,会把session信息保存在这个表里,这个表中有如下字段
当用户登陆的时候uid不为“0“ username不为空,所以我们可以根据此判断用户是否登录
下面会出现第二个问题,我根据什么条件查询用户的username是否为空呢?那个where条件后面该怎么写?
答案就是我们需要获取表中的sid的值。并根据这个值查询数据表,
下面给大家讲解一下怎么获得这个sid的值
- <?php
- require dirname(__FILE__). '/config/config_global.php'; //discuz 的配置文件
- $c_pre = $_config['cookie']['cookiepre'].substr(md5($_config['cookie']['cookiepath'].'|'.$_config['cookie']['cookiedomain']), 0, 4).'_';
- $sid = $_COOKIE[$c_pre.'sid'];
这段代码就是在网上找到的查询保存在本地cookie中的sid的值得代码,
引入的config_global.php就是需要导入的discuz的配置文件
在改配置文件中我们可以看到这样几行配置信息
- // -------------------------- CONFIG COOKIE --------------------------- //
- $_config['cookie']['cookiepre'] = '<span style="font-family:monospace;font-size:14px;color:#000000;font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">LXyb</span>_';
- $_config['cookie']['cookiedomain'] = '';
- $_config['cookie']['cookiepath'] = '/';
打印的cookie就是配置文件
LXyb_2132_sid"]=>string(6) "xYkv4g"
- <span style="font-family:monospace;font-size:14px;color:#000000;font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">LXyb</span>_
则$_COOKIE['"LXyb_2132_sid']就是我们想要的数据,就是那个seesion表中的sid
至此你就可以使用这个sid查询用户是否登陆的状态了。