PHP開發文章評論系統

來源:互聯網
上載者:User
最近工作中需要完成一個評論的功能,上網尋找了幾個評論系統的展示樣式。最後參考“多說”和“暢言”等評論系統,自己使用PHP語言實現了一個簡單的評論系統。並記錄了兩種方式(遞迴方式和非遞迴方式)的實現過程,以及分析兩種方式的優缺點,但前端如何?就沒有展現了。

首先設計資料庫如下:

create table `comments`(`id` bigint unsigned not null AUTO_INCREMENT,`arc_id` bigint unsigned not null COMMENT '文章id',`user_id` bigint unsigned not null COMMENT '使用者id',`comment_id` bigint unsigned not null DEFAULT '0' COMMENT '回複某個評論的id',`content` varchar(255) not null DEFAULT '' COMMENT '評論或回複的內容',`add_time` timestamp not null DEFAULT CURRENT_TIMESTAMP COMMENT '添加時間',PRIMARY KEY (`id`),KEY `arc_id` (`arc_id`))ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '文章評論表';

建立測試資料如下:


具體實現方案如下(在ThinkPHP架構上實現):
1、遞迴方式
優點:實現代碼簡單,而且如果評論的層級固定在5個層次一下的話,建議使用該種方法,這樣前端通過這種資料結果實現簡單。
缺點:如果評論的層級沒有固定的話,前端將無法展示評論資訊了,而且如果層級太多的話,將會極大的消耗記憶體,更要命的是每次遞迴都得查詢資料庫,效能將大大的降低。

/** * @param $arc_id   文章id * @param int $comm_id   評論id * @param array $result * @return array */function getCommlist($arc_id, $comm_id = 0, &$result = array()){   //擷取評論列表if(empty($arc_id)){return array();}$_where = "arc_id = {$arc_id} AND comment_id = {$comm_id}";$res = M('comments')->where($_where)->order('add_time DESC')->select();if(empty($res)){return array();}foreach ($res as $cm) {$thisArr = &$result[];$cm["_child"] = getCommlist($arc_id,$cm['id'],$thisArr);$thisArr = $cm;}return $result;}

部分資料展示如下:



2、非遞迴方式(堆棧方式實現)
優點:只查詢一次資料庫,效能較好。可以實現n層級的評論,前端也能很好的展示
缺點:代碼稍微複雜,對於固定的層級評論,前端展示評論較為複雜。

/** * @param $arc_id  文章id * @return array */public function getCommlist($arc_id){if(empty($arc_id)){return array();}$res = M('comments')->where(array('arc_id'=>$arc_id))->order('add_time ASC')->select();$dataList = $stack = array();if($res){foreach($res AS $k=>$v){   //先將評論的資料進行入庫(即comment_id=0)if($v['comment_id'] == 0){$v['_level'] = 0;   //設定層級數$v['_root'] = $v['id'];   //標識評論idarray_push($stack,$v);   //入棧unset($res[$k]);}}while(!empty($stack)){$node = array_pop($stack);   //出棧$dataList[] = $node;foreach($res as $_k=>$_v){if($_v['comment_id'] == $node['id']){$_v['_level'] = $node['_level']+1;   //設定層級數$_v['_root'] = $node['_root'];   //標識評論idarray_push($stack,$_v);   //入棧unset($res[$_k]);}}}}return $dataList;}

資料展示效果如下:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.