织梦网站会员登录类构造函数源码分析教程
所在文件:include/MemberLogin.class.php
织梦基地提示:如果不做织梦二次开发或不想深入研究织梦系统的,可以不用看本教程!
网站会员登录也就是织梦会员中心:http://www.dedebase.com/member/ 这地方登录时用到的,在这个类中,这个构造函数明显是那种,头重脚轻,也就是构造函数代码比较复杂,而除了构造函数外,其它方法比较简单。这个构造函数确实有点复杂,而且,使用到了我们大家不熟悉的cookie ,所以,要研究明白这个构造函数就需要对cookie有一个至少是知道什么是cookie才能读懂这段代码,因为,在织梦基地已经把cookie,session作了非常详细的讲解了,这里我就直接用织梦封装好的cookie功能了,不再对cookie具体代码分析了。
构造函数名: __construct($kptime = -1, $cache=FALSE) ,这里面二个默认参数值,大家要明白是什么东西,第一个是网站登录后cookie保存时间,第二个是否要缓存。
声明全局变量:global $dsql;这个点非常重要,因为,在一个函数里面要使用全局变量就要重新声明一下,否则,就无法使用$dsql这个对象里面的方法,这一点非常重要,这个在本教程中再强调一下,如果你在开发中提示缺少对象的话,你就要向这方面思考一下,是不是因为这个问题。
若我们在实例化一个对像时,第一个参数值为-1,那么,下面就开始判断了,若为-1,则把会员登录的时间保持7天,也就是说如果我们使用这个会员登录类,实例化这个类时,参数是默认或我们设置为-1,那么,会员登录的这个用户名就会保持7天时间,也就是你只要不退出,当我们进行会员中心时,不用登录仍然是我们的登录时的用户名。
否则,就把登录时间设置为我们实例会员登录类的时间,从这里我们可以看出第一个参数$kptime 是一个设置会员登录时间保持天数的参数,具体代码如下:
if($kptime==-1){ //7天 $this->M_KeepTime = 3600 * 24 * 7; }else{ $this->M_KeepTime = $kptime; }
设置缓存格式:$formcache = FALSE,这种方法经常用到,在必要时随时设置,用完就仍掉,非常方便。
下面二行代码:
$this->M_ID = $this->GetNum(GetCookie("DedeUserID")); $this->M_LoginTime = GetCookie("DedeLoginTime");
这二行代码不好理解,这里详细解释一下,首先第一个调用的函数GetNum()是获取整数,这个好理解,里面的还有一个函数GetCooke("DedeUserID") 这个函数在include/helpers/cookie.helper.php 里面,它是获取变量DedeUserID的cookie值,而这个DedeUserID又是从哪里来的呢?这就不好理解了,要把个弄明白就要弄明白用户登录时,织梦系统都做了哪些事,只有把这个弄明白了你才能把DedeUserID弄明白,也只有把这个变量弄明白了,你才能理解上面二行代码,虽然,我可以直接解释说上面二行代码就是获取这二个变量的值的,但是,这样对于一般的人来说,还是不理解的,除非你对织梦cookie设计系统有一个相当的了解,否则,这二行看似简单代码不好理解。
例如,我在网站注册了一个用户test123,然后,到www.dedebase.com/member/ 会员中心登录,如下图所示这是登录后的用户名:
当我一点击登录那一刻,织梦程序就会实例化“网站会员登录类”,这个可以在member/config.php里面找到如下代码:
$cfg_ml = new MemberLogin($keeptime);
也就是程序先实例化这个类,得到这个会员登录类的对象$cfg_ml ,然后,程序会执行文件member/index_do.php里面的的如下代码:
$cfg_ml->PutLoginInfo($row['mid']);
也就是对象$cfg_ml 调用了方法PutLoginInfo()这个函数,我们再看一下这个函数,如下图所示:
重点看绿色方框里面的内容,通过PutCookie('DedeUserID',$uid,$this->M_KeepTime);函数,把当前登录的用户赋给变量DedeUserID,然后,设置用户登录保持时间,然后,保存到data/cache/memberlogin/里面(具体如何保存这里不再进一步分析,这个牵涉太多了,等分析这个保存cookie函数putcookie()时再详细分析)。
我找到保存的这个cookie文件c51ce410c124a10e0db5e4b97fc2af39.php,咱们看一下,这个文件时里面的代码:
<?php exit('dedecms');?> a:2:{s:4:"data";a:23:{s:3:"mid";s:2:"12";s:5:"mtype";s:4:"个人";s:6:"userid";s:8 :"keke1233";s:3:"pwd";s:32:"d9f6e636e369552839e7bb8057aeb8da";s:5:"uname";s:7: "test123";s:3:"sex";s:0:"";s:4:"rank";s:2:"10";s:6:"uptime";s:1:"0";s:7:"expti me";s:1:"0";s:5:"money";s:1:"0";s:5:"email";s:13:"sdfsd@163.com";s:6:"scores"; s:3:"102";s:4:"matt";s:1:"0";s:8:"spacesta";s:3:"-10";s:4:"face";s:0:"";s:12:" safequestion";s:1:"0";s:10:"safeanswer";s:0:"";s:8:"jointime";s:10:"1437708378 ";s:6:"joinip";s:9:"127.0.0.1";s:9:"logintime";s:10:"1437717359";s:7:"loginip" ;s:9:"127.0.0.1";s:9:"checkmail";s:2:"-1";s:5:"honor";s:4:"列兵";}s:7:"timeout"; i:1437721037;}
这看上去好像很乱的样子,其实,一点也不乱,而且,很有规律性,这里面存放的就是用户登录后的所有用户信息,这个要等织梦基地把个构造函数分析完再把它反序列化后的结果打印出来,进行对比一下,你会发现这些代码是什么了。
接着看上面代码中的GetCookie("DedeUserID") 就是获得mid的值,也就是12,这个12就是上面提到的
PutCookie('DedeUserID',$uid,$this->M_KeepTime)
函数里面的$uid的值,现在明白了这二行代码取得的是什么了吧。就是获取用户id和登录时间。
看这二行代码包含的内容可真多,这还没有全部分析完,如果把所涉及的全分析一次的话,那这个是相当复杂的。
接着看代码,判断$this-M_ID是否为空,若为空表示没有登录,则调用函数$this->ResetUser() 这个函数的功能就是把用户信息重值,例如把DedeUserID等这些设置的变量删除掉。
若用户id存在,说明已经例如了。若登录了,再判断一下$cache也就是实例化时的参数值,若为true则调用函数GetCache($this->memberCache, $this->M_ID)读缓存,这个函数在include/helpers/cache.helper.php 里面。
这个函数读取c51ce410c124a10e0db5e4b97fc2af39.php里面的数据,也就是用户的所有信息。经过这个函数读取后,得到的是$this->fields 数组,这是一个包含登录用户所有信息的数组。然后,判断这个数组是否为空,若为空,则直接读取数据库表#@__member 作为数组$this->fields 从这里我们可以看出,在实例化这个会员登录类时,是先从cookie里面读取用户信息,若这个cookie里面没有这个用户的信息,那么,再从数据库里面读取,若不为空则设置$formcahce=ture。
如果我们在实例时设置的$cache的值为flase,也就是不让读取cookie里面的用户信息,若是这个则直接读取数据库表#@__member 里面的会员信息。
下面这段api处理,我们作分析,因为,这个用的极少,等以后遇到再一起讲解一下。
间隔一小时更新一次用户登录时间:下面的代码就是做这一件事,试想一下你登录后,过了一小时,如果一天后你登录后,系统提示你说你一天前登录了,但是,若你登录后时间保持了一天,结果程序还提示你是一天前的,这是不是就是错误,而且,在系统里面还要用到你登录时间在有的地方。
不只是这种情况,我们就是要求用户登录时间最新的,如果一分钟更新一次,这样太快了,也没有必要,所以,织梦官方是一小时更新一次。
判断一下登录时间,若大于1小时,则更新一下表#@__member里面的登录时间和id。
设置积分级别:
$sql = "Select titles From #@__scores where integral<={$this->fields['scores']} order by integral desc";
设置是否是会员:
if($this->fields['matt']==10) $this->isAdmin = TRUE;
其它代码都比较简单,我们直接看下面的代码:
if( !$formcache ) { SetCache($this->memberCache, $this->M_ID, $this->fields, 1800); }
若获取的用户信息数组为空时,也就是$formcache=flase时,那么,就写缓存,把这个用户的信息到写到c51ce410c124a10e0db5e4b97fc2af39.php文件里同,之所以,我们在data/cache/memberlogin/里面有这个文件,就是通过这个函数SetCache()来生成的。
最后,我打印一下实例化的这个会员登录类:
new MemberLogin(2);
得到的结果是:
MemberLogin Object ( [M_ID] => 12 [M_LoginID] => keke1233 [M_MbType] => 个人 [M_Money] => 0 [M_Scores] => 102 [M_UserName] => test123 [M_Rank] => 10 [M_Face] => [M_LoginTime] => 1437717359 [M_KeepTime] => 2 [M_Spacesta] => -10 [fields] => Array ( [mid] => 12 [mtype] => 个人 [userid] => keke1233 [pwd] => d9f6e636e369552839e7bb8057aeb8da [uname] => test123 [sex] => [rank] => 10 [uptime] => 0 [exptime] => 0 [money] => 0 [email] => sdfsd@163.com [scores] => 102 [matt] => 0 [spacesta] => -10 [face] => [safequestion] => 0 [safeanswer] => [jointime] => 1437708378 [joinip] => 127.0.0.1 [logintime] => 1437717359 [loginip] => 127.0.0.1 [checkmail] => -1 [honor] => 列兵 ) //www.dedebase.com [isAdmin] => [M_UpTime] => 0 [M_ExpTime] => 0 [M_HasDay] => [M_JoinTime] => 2015-07-24 [M_Honor] => 列兵 [memberCache] => memberlogin )
请与文件c51ce410c124a10e0db5e4b97fc2af39.php里面的内容对比一下,你会发现什么?原来这个数组与这个文件里面的内容完全一样。
若为织梦二次开发人员,能把这里面的所有内容弄明白,那么你对会员登录以及会员cookie就会有相当深刻理解,这对于以后做织梦二次开发有很大帮助,试想一个连织梦系统最底层的代码都了如指掌,去做二次开发就非常非常简单了,因为织梦二次开发根本不用去研究这些代码,织梦已经帮我们封装,好了一个一个的功能我们直接拿来用即可。