Discuz用户分表后怎么通过uid获取用户信息的方法

2018-08-10 11:25 栏目:技术学堂 查看()

在前段时间湖南红网有一个需求,大概就是调用用户被置顶的帖子数排名的top10,测试的基本效果就是首先查询到top10的uid集合(由于功能模块原来的的数据结构中仅在置顶表中查询得到uid的信息),最终效果如下(由于测试网站只有少部分数据,因此下面只显示5个):

 

得到uid之后还需要得到用户相关的几个数据,包括头像、个人主页的url以及用户名;头像在discuz中可以使用avatar方法获取,个人主页的url通过uid直接拼装即可。而用户名则需要另外获取,可能有人会说直接使用DB类的fetch_first方法查询common_member表即可查到用户对应的用户名。

但一开始就有个前提,那就是网站的用户分表了,比如一般分表后会产生两个用户表,分别是common_member和common_member_archive,所以光查询前者肯定是不行的。其实阅读discuz的本身的源代码就可以发现,在很多地方他的做法都是通过判断用户是否在common_member中,如果存在则直接调用该值,否则需查询common_member_archive。如下是discuz本身的某个模块的源代码:

 

这样显然是可行的,但是通过C类发现并没有通过uid来查username的,只有通过username来查uid的,以上就是这样的。如果要用这种思路则需要这么来写:

 

然而,实际上有更加简便的方式的

那就是通过uc来做处理,因为要的是用户名等uc中也保存了的信息,而且对于普通网站用户而言uc中保存的用户信息和dz中保存的用户信息是一致的。比如在discuz源代码中可以看到如下这样的方法:

 

只要熟悉discuz开发的朋友都知道,看命名就可以顾名思义的,该方法是用于调取uc中的用户信息的。我们可以在uc_client/client.php找到该方法:

 

然后可以在uc_client/control/user.php中找到该方法所调用的方法:

 

也就是我们只需要在一开始的时候第二个参数传入1即可,也就是在该方法中会调用get_user_by_uid(),其中的参数其实是uid。然后我们可以在uc_client/model/user.php找到该方法:

 

这样就已经调取uc中的用户信息,需要注意的是,在上一步的onget_user方法中返回的时候并没有返回用户的所有信息,也不是返回带有uid、username、email等这些键值的数组。所以如果返回的是$user,如果需要取username的值,不能够写成$user['username']的。

至此,采用调用uc用户的方式通过discuz的用户uid获取的了用户的用户名。

扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流

郑重申明:某某网络以外的任何单位或个人,不得使用该案例作为工作成功展示!