目錄
資料庫設計
評論的結構分析
首頁 後端開發 php教程 PHP:打造一個無限極評論模組

PHP:打造一個無限極評論模組

Apr 04, 2017 pm 03:18 PM

我的畢設專案的評論模組原來是採用多說外掛程式完成的,但是我現在希望能夠自己管理評論內容,所以我自己開始寫評論模組。具體準備採用與下評論類似的結構,即一級評論直接顯示在文章下方,而二三級評論顯示在一級評論的下方,如下圖所示:

PHP:打造一個無限極評論模組

評論結構

我覺得這可以說是無限極分類的一種運用,準確的說是子孫樹的運用,進行子孫樹分類後,循環輸出內容,形成評論(不懂無限極分類的朋友可以去看看我的文章無限極分類原理與實現)。

當然,真正完成無限極回評論的功能還有其他的要點,以下就來說說我是怎麼完成無限極評論的。

資料庫設計

首先,就是資料表的設計。如果是論壇系統,可以將評論的資料分割成兩個表,一個表格儲存評論的訊息,包括發佈貼文的使用者id或回覆的使用者id回覆的貼文id回覆的時間等;另一個表,儲存評論的內容,包括貼文的主題和回覆的內容。

我完成的是文章的評論模組,就沒分成兩個表了,直接將評論的內容與資訊放在一起,如下面結構:

comm_idINTUNSIGNED PRIMARY AUTO_INCREMENT#user_idINTUNSIGNED NOT DEFAULT 0#使用者idparent_id#INTUNSIGNED NOT NULL DEFAULT 0評論的父級artcile_idINT#UNSIGNED NOT NULL DEFAULT 0 comm_cont評論的內容INT
列名 列型別 屬性 #說明
KEY主鍵
NULL

評論的文章id
#TEXT comm_time
####UNSIGNED NOT NULL DEFAULT 0#########評論發布###的時間#############

SQL語句:

CREATE TABLE comment (
    comm_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    user_id INT UNSIGNED NOT NULL DEFAULT 0 ,
    parent_id INT UNSIGNED NOT NULL DEFAULT 0 ,
    article_id INT UNSIGNED NOT NULL DEFAULT 0 ,
    comm_cont TEXT,
    comm_time INT UNSIGNED NOT NULL DEFAULT 0 
) ENGINE=MYISAM CHARSET=UTF8 ;
登入後複製

這種結構是完成無限極回復的基礎,也能夠很明顯的看出取出的資料能很好的進行無限極分類。

評論的結構分析

完成一個評論模組是很容易的,評論放入資料庫,然後取回放置在html中,同樣能完成評論模組。但是,這種結構是很雜亂,而且無序的。要完成如評論一樣的評論模組,就得採用特殊的方式。

那麼,就要好好觀察一下評論的結構了。

PHP:打造一個無限極評論模組

評論結構

結合上面的資料表結構,可以推論一下,從資料表中取出且無限極分類後的數據,它的結構應該是這樣的:

array (
    array(一级评论,
        child=>array(
            二级评论,
            三级评论
            )
        ),
    array (
        一级评论 ,
        child=>array(
            )
    ……
登入後複製

為什麼這麼說?你可以很明顯的看出,二級、三級評論被包裹在一級評論中,而二級、三級評論是平行關係;因此,二級、三級評論是一級評論的子孫節點,而二級、三級評論是平行節點,不存在父子關係。

因此,可以得出,分類後的數據有且只有一個子孫節點,多級評論無論是不是對一級評論進行回复,只要是處於一級評論的範圍,那麼它的父節點必然是一級評論。

那麼,二級、三級回覆中的@某某某又是怎麼實現的?其實,我在這裡困擾了很久。我期望用對錶的自身連接來完成,但是不行,破壞了上面所述的結構。最後,我從請求的json資料中得到了答案,請看評論的json資料:

PHP:打造一個無限極評論模組

##JSON資料

上傳後面有點模糊,各位同學可以藉助火狐或谷歌瀏覽器上面的插件觀察JSON資料。

重點觀察

compiled_content字段,可以推斷它是將@某某某直接儲存到資料庫中的。這樣問題就解決了,同時觀察json數據,也能夠驗證我上面所述的結構是正確的。

具體實作

分析完結構就來說說具體怎麼來完成無限極回應。第一步,一級評論形成,這個簡單,直接將評論存儲即可

PHP:打造一個無限極評論模組

#一級評論

#而二級評論要利用到js,點擊評論時,獲取一級評論的用戶名,並保存,在發布回复時注意將其和評論的內容結合在一起發送到後台:

PHP:打造一個無限極評論模組

二級評論

// replyUser 即 被回复的用户名 @xxxx
var content = $('#reply').val.split(replyUser)[1];
var userlink = '<a href="#" class="xxx" target="_blank" >' + replyUser + '</a>';
var comm_cont = encodeURIComponent(userlink+content);
登入後複製
那麼在資料庫中表現如下:

PHP:打造一個無限極評論模組

資料表內容

#之後就是一個關鍵點,利用子孫樹進行分類,分類

函數如下:

/**
 * @param $data array  数据
 * @param $parent  string 父级元素的名称 如 parent_id
 * @param $son     string 子级元素的名称 如 comm_id
 * @param $pid     int    父级元素的id 实际上传递元素的主键
 * @return array 
 */
function getSubTree($data , $parent , $son , $pid = 0) {
    $tmp = array();
    foreach ($data as $key => $value) {
        if($value[$parent] == $pid) {
            $value['child'] =  getSubTree($data , $parent , $son , $value[$son]);
            $tmp[] = $value;            
        }
    }
    return $tmp;
}
登入後複製
如此分類後,資料結構發生變化,大致如下:

PHP:打造一個無限極評論模組

分類後資料

有這個結構就能很好去完成評論了,如下

<?php foreach($tree as $key=>$val) ?>
<p class="comm_list" >
    <h2><?php echo $val[&#39;user_name&#39;];?></h2>
    <p><?php echo $val[&#39;comm_cont&#39;] ?></p>
    <!-- 其他信息 -->
    <p class="comm_reply">
        <?php if(!empty($val[&#39;child&#39;])) { ?>
        <?php foreach($val[&#39;child&#39;] as $k=>$v) ?>
        <p class="reply_list" >
            <h2><?php echo $v[&#39;user_name&#39;];?></h2>
            <p><?php echo $v[&#39;comm_cont&#39;] ?></p>
            <!-- 其他信息 -->
        </p>
        <?php }}?>
    </p>
</p>
<?php } ?>
登入後複製
同時,形成的回應樣式如下所示:

PHP:打造一個無限極評論模組

snipaste20170105_204906.png

這樣類別評論結構的無限極回應就完成了。

PS

這只是評論的一種形式,如還有一種類別樓梯式的結構,這種實作則更為簡單一點,如下圖:

PHP:打造一個無限極評論模組

樓梯式評論結構

這個結構就很容易完成,只要儲存資料庫中的parent_id完全等於你回覆的comm_id,經過如下無限極分類,就能夠完成。

/**
 * 子孙树
 */
function getSubTree($data , $parent , $son , $pid = 0, $lev = 0) {
    $tmp = array();
    foreach ($data as $key => $value) {
        if($value[$parent] == $pid) {
            $value['lev'] = $lev;
            $tmp[] = $value;
            $tmp = array_merge($tmp , getSonTree($data , $parent , $son , $value[$son] , $lev+1));
        }
    }
    return $tmp;
}
登入後複製
這種無限極子孫樹分類和前面給出的子孫樹分類不同,分類後不會將子類包裹在child中,而是形成等級,最高級為0,依次往下。

例如:一級評論的comm_id=1,parent_id=0,那麼二級評論的comm_id=2,parent_id=1;三級評論的comm_id=3,parent_id=2;

#分類最後形成如下結構

array(
array('comm_id'=>1,parent_id=>0,art_id=>1,'lev'=>0) ,
array('comm_id'=>2,parent_id=>1,art_id=>1,'lev'=>1),
array('comm_id'=>3,parent_id=>2,art_id=>1,'lev'=>2),
array('comm_id'=>4,parent_id=>3,art_id=>1,'lev'=>3),
array('comm_id'=>5,parent_id=>2,art_id=>1,'lev'=>2)
);
登入後複製

然后直接循环输出,并将lev作为属性打印在html中,最后利用js读取lev,并根据不同的等级分配不同的margin-left即可,它会随着margin的不同而排列在不同的位置,如下:

// html中
<?php foreach($tree as $key=>$val) {?>
<p class="comm_list" lev="<?php echo $val[&#39;lev&#39;]?>">
……
</p>
<?php } ?>

// js中
$('p.comm_list').css('margin-left' , 20 * lev);
登入後複製


以上是PHP:打造一個無限極評論模組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

解釋PHP中晚期靜態結合的概念。 解釋PHP中晚期靜態結合的概念。 Mar 21, 2025 pm 01:33 PM

文章討論了PHP 5.3中介紹的PHP中的晚期靜態結合(LSB),允許靜態方法的運行時間分辨率調用以更靈活的繼承。 LSB的實用應用和潛在的觸摸

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

框架安全功能:防止漏洞。 框架安全功能:防止漏洞。 Mar 28, 2025 pm 05:11 PM

文章討論了框架中的基本安全功能,以防止漏洞,包括輸入驗證,身份驗證和常規更新。

自定義/擴展框架:如何添加自定義功能。 自定義/擴展框架:如何添加自定義功能。 Mar 28, 2025 pm 05:12 PM

本文討論了將自定義功能添加到框架上,專注於理解體系結構,識別擴展點以及集成和調試的最佳實踐。

如何在系統重啟後自動設置unixsocket的權限? 如何在系統重啟後自動設置unixsocket的權限? Mar 31, 2025 pm 11:54 PM

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

如何用PHP的cURL庫發送包含JSON數據的POST請求? 如何用PHP的cURL庫發送包含JSON數據的POST請求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL庫發送JSON數據在PHP開發中,經常需要與外部API進行交互,其中一種常見的方式是使用cURL庫發送POST�...

See all articles