I recently needed to complete a comment function at work, and I searched online for several display styles of the comment system. Finally, with reference to comment systems such as "Duosuo" and "Changyan", I implemented a simple comment system using PHP language. The implementation process of the two methods (recursive and non-recursive) is recorded, and the advantages and disadvantages of the two methods are analyzed, but how the front-end is implemented is not shown.
First design the database as follows:
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 '文章评论表';
Create test data as follows:
The specific implementation plan is as follows (in Implemented on the ThinkPHP framework):
1. Recursive method
Advantages: The implementation code is simple, and if the level of comments is fixed at five levels or less, it is recommended to use this method, so that the front-end can easily implement this data result .
Disadvantages: If the level of comments is not fixed, the front end will not be able to display the comment information, and if there are too many levels, it will consume a lot of memory. What’s more terrible is that every recursion has to query the database, and the performance will be reduced. Greatly reduced.
/** * @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; }
Part of the data is displayed as follows:
#2. Non-recursive method (stack method implementation)
Advantages: only query A primary database has better performance. N-level comments can be realized, and the front-end can also display them well.
Disadvantages: The code is slightly complicated. For fixed-level comments, the front-end display of comments is more complicated.
/** * @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']; //标识评论id array_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']; //标识评论id array_push($stack,$_v); //入栈 unset($res[$_k]); } } } } return $dataList; }
The data display effect is as follows:
The above is the detailed content of PHP development article comment system. For more information, please follow other related articles on the PHP Chinese website!