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

  1. mysql评论表结构设计_文章评论嵌套显示mysql表结构如何设计(形式如网易新闻评论)...

    现在有一张post表 (结构不能改变) tid 主题pid pid 回复id 现在新增了评论嵌套显示功能,即tid=1 a评论了一条 pid为1 b回复了a的评论 pid为2 c回复了b的评论 pid ...

  2. 文章详情页文章评论功能

    文章详情页文章评论功能 一.文章评论功能实现流程 文章评论包含两种评论,根评论:对文章的评论:子评论:对评论的评论.两者的区别在于是否存在父评论. 实现流程:1.构建样式:2.提交根评论:3.显示根评 ...

  3. 【java毕业设计】基于java+SSH+jsp的文章发布系统设计与实现(毕业论文+程序源码)——文章发布系统

    基于java+SSH+jsp的文章发布系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+SSH+jsp的文章发布系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. ...

  4. 文章发布系统的设计与实现

    摘 要 随着计算机技术的迅速发展,网络正以一种前所未有的冲击力影响着人类的生产和生活.网络的快速发展,颠覆了传统的信息传播方式,冲破了传统的时间,空间的局限性,继而引发了人类阅读方式的变革.现如今,网 ...

  5. 魔众文章投稿系统 v1.3.0 菜单快捷搜索 模块市场升级

    魔众文章投稿系统是一个多用户文章管理系统,支持用户文章投稿.文章审核,通过评论.打赏等模块可以轻松支持多种用户营销功能. 魔众文章投稿系统发布v1.3.0版本,新功能和Bug修复累计7项,菜单快捷搜索 ...

  6. 文章编辑系统的设计与实现

    5.文章编辑系统的设计与实现 5.1问题的描述 输入一页文字,程序可以统计出文字.数字.空格的个数.静态存储一页文章,每行最多不超过80个字符,共N行: 5.2问题分析和任务定义 (1)分别统计出其中 ...

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

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

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

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

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

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

最新文章

  1. Java Arrays.Sort方法重写
  2. 数据结构面试的常客,一文带你深入了解堆
  3. Spring 更好地处理 Struts 动作
  4. Java获取指定日期的月初和月末日子
  5. CF思维联系–CodeForces - 223 C Partial Sums(组合数学的先线性递推)
  6. 零基础学python书籍-0基础学python,有什么教程或者书可以推荐吗?
  7. WPA3 标准被曝严重漏洞,WiFi 密码可遭窃取?
  8. 常用Windows快捷键大全
  9. 概率论的学习整理4:全概率公式
  10. luci编程 openwrt_【玩转开源】BananaPi R2 —— 第四篇 Openwrt Luci 初探
  11. android开发流程
  12. android 投屏 app 三星,两种支持三星Note10投屏到电脑的方法推荐
  13. Anaconda下载安装以及Tensorflow和Pytorch的安装
  14. app ui设计规范
  15. 推荐一个格式化json数据的谷歌插件JSONView:谷歌浏览器中JSONVue扩展程序插件jsonview的下载与安装
  16. VUE中使用http请求
  17. 超表面液晶空间光调制器
  18. 自己办理积分入户深圳—经验之谈
  19. CSS使图片变模糊,亲测非常好用
  20. 凯迪仕智能锁完成C轮6亿融资10亿综合授信,开启全球化战略新篇章

热门文章

  1. CCF201403-1 相反数(解法三)(100分)(废除!!!)
  2. 51Nod-1010 只包含因子2 3 5的数【打表+排序+二分搜索】
  3. 冷知识 —— 容易读错的发音(英文)
  4. numpy ndarray 多维数组的内存管理
  5. MCMC: Metropolis-Hastings, Gibbs and slice sampling
  6. theano 编程细节
  7. Python机器学习——如何shuffle一个数据集(ndarray类型)
  8. python学习-如何高效学 Python?
  9. python 入门基础-如何学习Python,以及新手如何入门?
  10. python画50个图-python 实现在一张图中绘制一个小的子图方法