Home  >  Article  >  Backend Development  >  PHP development article comment system

PHP development article comment system

小云云
小云云Original
2018-03-27 10:28:235579browse

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn