>  기사  >  백엔드 개발  >  PHP 개발 기사 댓글 시스템

PHP 개발 기사 댓글 시스템

小云云
小云云원래의
2018-03-27 10:28:235630검색

최근 직장에서 댓글 기능을 완성해야 해서 온라인에서 댓글 시스템의 여러 표시 스타일을 검색했습니다. 마지막으로 "Duosuo", "Changyan"과 같은 댓글 시스템을 참조하여 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'];   //标识评论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;
}

데이터 표시 효과는 다음과 같습니다.


위 내용은 PHP 개발 기사 댓글 시스템의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.