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模板,主要想体现一下思路
Dec 25 PHP
PHP 金额数字转换成英文
May 06 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
May 17 PHP
PHP静态调用非静态方法的应用分析
May 02 PHP
Chrome Web App开发小结
Sep 04 PHP
ThinkPHP实现二级循环读取的方法
Nov 03 PHP
php中解析带中文字符的url函数分享
Jan 20 PHP
PHP中实现Bloom Filter算法
Mar 30 PHP
php简单实现查询数据库返回json数据
Apr 16 PHP
yii2 上传图片的示例代码
Nov 02 PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 PHP
Laravel 修改验证异常的响应格式实例代码详解
May 25 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 根据IP地址控制访问的代码
2010/04/22 PHP
javascript 读取xml,写入xml 实现代码
2009/07/10 Javascript
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
js chrome浏览器判断代码
2010/03/28 Javascript
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
js实现图片旋转的三种方法
2014/04/10 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
JavaScript中的console.time()函数详细介绍
2014/12/29 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
超全面的javascript中变量命名规则
2017/02/09 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
微信小程序自动客服功能
2017/11/02 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
在小程序中使用腾讯视频插件播放教程视频的方法
2018/07/10 Javascript
Vue中 key keep-alive的实现原理
2018/09/18 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
vue+iview实现分页及查询功能
2020/11/17 Vue.js
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2017/05/11 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
Python中flatten( )函数及函数用法详解
2018/11/02 Python
python 多线程中子线程和主线程相互通信方法
2018/11/09 Python
python隐藏终端执行cmd命令的方法
2019/06/24 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
解决pytorch报错:AssertionError: Invalid device id的问题
2020/01/10 Python
用 Python 制作地球仪的方法
2020/04/24 Python
keras 获取某层输出 获取复用层的多次输出实例
2020/05/23 Python
营销专业应届生求职信
2013/11/26 职场文书
结婚周年感言
2014/02/24 职场文书
财务会计大学生自我评价
2014/04/09 职场文书
简洁的英文求职信范文
2014/05/03 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python