最近工作中需要完成一个评论的功能,上网查找了几个评论系统的展示样式。最后参考“多说”和“畅言”等评论系统,自己使用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;
}

数据展示效果如下:


PHP实现文章评论系统相关推荐

  1. php用户评论系统,php实现文章评论系统

    最近工作中需要完成一个评论的功能,上网查找了几个评论系统的展示样式.最后参考"多说"和"畅言"等评论系统,自己使用PHP语言实现了一个简单的评论系统.并记录了两 ...

  2. 河源微信分销系统开发日记:wordpress每篇文章评论人数统计

    // 每篇文章评论数量 function comments_users($postid=0,$which=0) {$comments = get_comments('status=approve&am ...

  3. java 微信文章评论点赞,基于SpringBoot的微信授权登录+仿微信朋友圈+文章查看(评论)系统...

    springboot技术内幕架构设计与实现 53.1元 包邮 (需用券) 去购买 > 本系统是基于Spring Boot 技术实现的文章发布系统,该系统是我和我朋友一起做的,本文仅介绍自己的这部 ...

  4. 带评论的php文章系统,启用Typecho原生评论系统替代多说

    2017年6月1日起,多说(duoshuo.com)社会化评论系统正式停止提供服务.拾肆自从转入Typecho以来一直未启用系统自带的评论系统,而使用了多说的评论系统. 采用多说可以不限于单独一个站点 ...

  5. iOS10.3 的评论系统

    作者 xuyafei86 关注 2017.03.30 12:39* 字数 428 阅读 265评论 4喜欢 11 iOS10.3 对 App 的评论系统进行了较大的升级.主要在三个方面. 支持 App ...

  6. Hexo博客NexT主题美化之评论系统

    前言 更多效果展示,请访问我的 个人博客. 效果图: Valine 诞生于2017年8月7日,是一款基于Leancloud的快速.简洁且高效的无后端评论系统. 教程: 登录 Leancloud 官网, ...

  7. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析...

    构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析 原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入 ...

  8. Nuxt.js开发中碰到的问题(二)引入gitment评论系统

    博客原文链接 概述 在初步完成功能之后就想着加上评论功能,最开始是想自己实现一个,但是综合考虑之后,还是决定引入 gitment 这个成熟的评论系统代替: 虽然之前在项目中有实现评论系统的相关经验,但 ...

  9. Hexo瞎折腾系列(8) - 添加评论系统

    前言 Hexo的NexT主题本身就集成了一些评论系统,多说啊之类的已经关闭服务的略过不提,目前比较多人用的有畅言.来必力livere.Gitment.Gitalk.Disqus等. 我刚用的评论系统的 ...

  10. 利用“多说”制作留言板、评论系统

    留言板和评论系统在网站建设中会经常用到,今天为大家介绍如何利用多说来为自己的网站制作留言板.评论系统!注意以下只是介绍一下简单的创建设置,更多功能大家可以自己去探索! 1.进入多说网站 http:// ...

最新文章

  1. ecmall开发记录(三)
  2. listview刷新,延迟加载,用单行刷新取代notifyDataSetChanged
  3. 三列布局-中间固定俩边自适应-和两边固定中间自适应布局
  4. spring容器bean的作用域 spring容器是否是单例的一些问题
  5. Anaconda3的安装
  6. Oracle11g x64使用Oracle SQL Developer报错:Unable to find a Java Virtual Machine
  7. IKM 线上测试JavaScript
  8. 耗时两周,纯手敲python入门级基础笔记
  9. 用CSS动画制作一个正方体
  10. M1 pod install CocoaPod 报错解决办法
  11. ACE库中ACE_Msg_Log日志对象浅论
  12. PRML勘误表2011
  13. 什么是AJAX?如何实现AJAX异步请求?
  14. 计算机技术在多晶体衍射中的应用,透射电镜电子衍射在晶体结构分析中的应用...
  15. 解决 git@gitlab.com: Permission denied (publickey,gssapi-with-mic,password)
  16. crash(crashed)
  17. 达梦数据库DM8安装ODBC驱动无法正常连接
  18. 【LabVIEW】入门-视觉
  19. 【云原生之Docker实战】使用docker部署IT资产管理系统GLPI
  20. 【常用html、bat、QQ、py代码】

热门文章

  1. Maya---捕捉命令
  2. 计算机科学箴言集 -- 编程珠玑续
  3. IDO-SBC3019-V1B:PX30 超强 CPU 搭载 Android/Linux 系统(Android8.1)
  4. Linux如何删除用户
  5. 天才在左,疯子在右,我们在哪?
  6. mysql 获取昨天日期、今天日期、明天日期以及前一个小时和后一个小时的时间
  7. ASP.NET 实现简单的注册界面(使用asp控件)
  8. linux计算与检查md5值
  9. 操作系统实验七(银行家算法)
  10. 计算机win7设置用户密码,怎么给win7电脑设置开机密码_w7电脑开机密码怎么设置...