php实现文章评论系统


Posted in PHP onFebruary 18, 2019

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

创建测试数据如下:

php实现文章评论系统

具体实现方案如下(在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;
}

部分数据展示如下:

php实现文章评论系统

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 相关文章推荐
PHP环境搭建最新方法
Sep 05 PHP
剖析 PHP 中的输出缓冲
Dec 21 PHP
php 获得汉字拼音首字母的函数
Aug 01 PHP
php中读写文件与读写数据库的效率比较分享
Oct 19 PHP
php设置允许大文件上传示例代码
Mar 10 PHP
php实现过滤表单提交中html标签的方法
Oct 17 PHP
PHP统计目录大小的自定义函数分享
Nov 18 PHP
php实现字符串反转输出的方法
Mar 14 PHP
PHP中把有符号整型转换为无符号整型方法
May 27 PHP
PHP实现通过正则表达式替换回调的内容标签
Jun 15 PHP
PHP排序算法类实例
Jun 17 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
Mar 05 PHP
php无限级分类实现评论及回复功能
Feb 18 #PHP
PHP-FPM 的管理和配置详解
Feb 17 #PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 #PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 #PHP
PHP封装的mysqli数据库操作类示例
Feb 16 #PHP
PHP fprintf()函数用法讲解
Feb 16 #PHP
PHP explode()函数用法讲解
Feb 15 #PHP
You might like
深入理解PHP原理之错误抑制与内嵌HTML分析
2011/05/02 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
js 3种归并操作的实例代码
2013/10/30 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
2016/02/19 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
javascript完美实现给定日期返回上月日期的方法
2017/06/15 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
理解Koa2中的async&await的用法
2018/02/05 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
bootstrap table列和表头对不齐的解决方法
2019/07/19 Javascript
[32:47]完美世界DOTA2联赛 GXR vs IO 第二场 11.07
2020/11/09 DOTA
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
Python-OpenCV基本操作方法详解
2018/04/02 Python
Django通过json格式收集主机信息
2020/05/29 Python
Python turtle库的画笔控制说明
2020/06/28 Python
Python 实现进度条的六种方式
2021/01/06 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
网易微博Web App用HTML5开发的过程介绍
2012/06/13 HTML / CSS
MATCHESFASHION澳大利亚/亚太地区:英国时尚奢侈品电商
2020/01/14 全球购物
保安员岗位职责
2013/11/17 职场文书
暑期实践思想汇报
2014/01/06 职场文书
JAVA程序员自荐书
2014/01/30 职场文书
关于环保的建议书
2014/05/12 职场文书
应聘教师自荐书
2014/06/16 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书
催款函范本大全
2015/06/24 职场文书
高中历史教学反思
2016/02/19 职场文书
2022年四月新番
2022/03/15 日漫
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL