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 相关文章推荐
apache rewrite_module模块使用教程
Jan 10 PHP
php下intval()和(int)转换使用与区别
Jul 18 PHP
JS与PHP向函数传递可变参数的区别实例代码
May 18 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
Jun 18 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
Jun 18 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
ThinkPHP3.1数据CURD操作快速入门
Jun 19 PHP
基于PHP给大家讲解防刷票的一些技巧
Nov 18 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 PHP
php实现三级级联下拉框
Apr 17 PHP
Smarty简单生成表单元素的方法示例
May 23 PHP
PHP快速排序quicksort实例详解
Sep 28 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
PHP计划任务之关闭浏览器后仍然继续执行的函数
2010/07/22 PHP
php中模拟POST传递数据的两种方法分享
2011/09/16 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
JQuery事件e参数的方法preventDefault()取消默认行为
2013/09/26 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
基于Vue全局组件与局部组件的区别说明
2020/08/11 Javascript
[32:36]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第二场 12.12
2020/12/16 DOTA
写了个监控nginx进程的Python脚本
2012/05/10 Python
Python对List中的元素排序的方法
2018/04/01 Python
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
python如何查看微信消息撤回
2018/11/27 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
2019/11/15 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
基于Python绘制个人足迹地图
2020/06/01 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
How to spawning asynchronous work in J2EE
2016/08/29 面试题
市场营销专业个人自荐信格式
2013/09/21 职场文书
一名女生的自荐信
2013/12/08 职场文书
教师应聘个人求职信
2013/12/10 职场文书
自荐信写法介绍
2014/01/25 职场文书
信息专业毕业生五年职业规划参考
2014/02/06 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
2015年基层党建工作汇报材料
2015/06/25 职场文书
大学开学感言
2015/08/01 职场文书
2019军训心得体会
2019/06/27 职场文书