ホームページ  >  記事  >  バックエンド開発  >  PHP開発記事コメントシステム

PHP開発記事コメントシステム

小云云
小云云オリジナル
2018-03-27 10:28:235624ブラウズ

最近仕事でコメント機能を完成させる必要があり、コメント システムのいくつかの表示スタイルをオンラインで検索しました。最後に、「Duosuo」や「Changyan」などのコメントシステムを参考に、PHP言語を使った簡単なコメントシステムを実装しました。 2 つのメソッド (再帰的および非再帰的) の実装プロセスが記録され、2 つのメソッドの長所と短所が分析されますが、フロントエンドがどのように実装されるかは示されていません。

最初に次のようにデータベースを設計します:

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. 非再帰メソッド (スタックメソッドの実装)
利点: データベースのクエリは 1 回のみで、パフォーマンスが良好です。 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。