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程序中的常见漏洞进行攻击(上)
Oct 09 PHP
基于pear auth实现登录验证
Feb 26 PHP
PHP 函数学习简单小结
Jul 08 PHP
PHP合并数组+与array_merge的区别分析
Aug 01 PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
Nov 07 PHP
PHP实现文件下载断点续传详解
Oct 15 PHP
php利用cookies实现购物车的方法
Dec 10 PHP
php继承中方法重载(覆盖)的应用场合
Feb 09 PHP
php实现xml与json之间的相互转换功能实例
Jul 07 PHP
如何使用PHP给图片加水印
Oct 12 PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 PHP
php时间戳转换代码详解
Aug 04 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
不错的JS中变量相关的细节分析
2007/08/13 Javascript
js中的string.format函数代码
2020/08/11 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
2014/03/28 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
利用vue.js实现被选中状态的改变方法
2018/02/08 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
JavaScript插入排序算法原理与实现方法示例
2018/08/06 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python FTP操作类代码分享
2014/05/13 Python
Python实现LRU算法的2种方法
2015/06/24 Python
Python实现提取谷歌音乐搜索结果的方法
2015/07/10 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
详解python的ORM中Pony用法
2018/02/09 Python
Python中的取模运算方法
2018/11/10 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
python递归函数用法详解
2020/10/26 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
基于CSS3特效之动画:animation的应用
2013/05/09 HTML / CSS
国际知名军事风格休闲装品牌:Alpha Industries(阿尔法工业)
2017/05/24 全球购物
为您搜罗全球潮流時尚品牌:HBX
2019/12/04 全球购物
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
留学自荐信
2013/10/10 职场文书
房地产开盘策划方案
2014/02/10 职场文书
化学系大学生自荐信范文
2014/03/01 职场文书
高中军训感言800字
2014/03/05 职场文书
2014年财务科工作总结
2014/11/11 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书
求职意向书范本
2015/05/11 职场文书
会计实训总结范文
2015/08/03 职场文书
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫