91五月天婷婷|99re这里|狠狠噜噜噜噜|亚洲自慰喷水一区二区

Discuz用戶分表后怎么通過(guò)uid獲取用戶信息的方法

2018-08-02 17:55 欄目: 技術(shù)學(xué)堂 查看()

在前段時(shí)間湖南紅網(wǎng)有一個(gè)需求,大概就是調(diào)用用戶被置頂?shù)奶訑?shù)排名的top10,測(cè)試的基本效果就是首先查詢到top10的uid集合(由于功能模塊原來(lái)的的數(shù)據(jù)結(jié)構(gòu)中僅在置頂表中查詢得到uid的信息),最終效果如下(由于測(cè)試網(wǎng)站只有少部分?jǐn)?shù)據(jù),因此下面只顯示5個(gè)):

 

得到uid之后還需要得到用戶相關(guān)的幾個(gè)數(shù)據(jù),包括頭像、個(gè)人主頁(yè)的url以及用戶名;頭像在discuz中可以使用avatar方法獲取,個(gè)人主頁(yè)的url通過(guò)uid直接拼裝即可。而用戶名則需要另外獲取,可能有人會(huì)說(shuō)直接使用DB類的fetch_first方法查詢common_member表即可查到用戶對(duì)應(yīng)的用戶名。

但一開(kāi)始就有個(gè)前提,那就是網(wǎng)站的用戶分表了,比如一般分表后會(huì)產(chǎn)生兩個(gè)用戶表,分別是common_member和common_member_archive,所以光查詢前者肯定是不行的。其實(shí)閱讀discuz的本身的源代碼就可以發(fā)現(xiàn),在很多地方他的做法都是通過(guò)判斷用戶是否在common_member中,如果存在則直接調(diào)用該值,否則需查詢common_member_archive。如下是discuz本身的某個(gè)模塊的源代碼:

 

這樣顯然是可行的,但是通過(guò)C類發(fā)現(xiàn)并沒(méi)有通過(guò)uid來(lái)查username的,只有通過(guò)username來(lái)查uid的,以上就是這樣的。如果要用這種思路則需要這么來(lái)寫(xiě):

 

然而,實(shí)際上有更加簡(jiǎn)便的方式的

那就是通過(guò)uc來(lái)做處理,因?yàn)橐氖怯脩裘萿c中也保存了的信息,而且對(duì)于普通網(wǎng)站用戶而言u(píng)c中保存的用戶信息和dz中保存的用戶信息是一致的。比如在discuz源代碼中可以看到如下這樣的方法:

 

只要熟悉discuz開(kāi)發(fā)的朋友都知道,看命名就可以顧名思義的,該方法是用于調(diào)取uc中的用戶信息的。我們可以在uc_client/client.php找到該方法:

 

然后可以在uc_client/control/user.php中找到該方法所調(diào)用的方法:

 

也就是我們只需要在一開(kāi)始的時(shí)候第二個(gè)參數(shù)傳入1即可,也就是在該方法中會(huì)調(diào)用get_user_by_uid(),其中的參數(shù)其實(shí)是uid。然后我們可以在uc_client/model/user.php找到該方法:

 

這樣就已經(jīng)調(diào)取uc中的用戶信息,需要注意的是,在上一步的onget_user方法中返回的時(shí)候并沒(méi)有返回用戶的所有信息,也不是返回帶有uid、username、email等這些鍵值的數(shù)組。所以如果返回的是$user,如果需要取username的值,不能夠?qū)懗?user['username']的。

至此,采用調(diào)用uc用戶的方式通過(guò)discuz的用戶uid獲取的了用戶的用戶名。

掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流

鄭重申明:某某網(wǎng)絡(luò)以外的任何單位或個(gè)人,不得使用該案例作為工作成功展示!