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 相关文章推荐
动态新闻发布的实现及其技巧
Oct 09 PHP
php代码把全角数字转为半角数字
Dec 10 PHP
Linux下CoreSeek及PHP扩展模块的安装
Sep 23 PHP
php使用sql数据库 获取字段问题介绍
Aug 12 PHP
php绘图中显示不出图片的原因及解决
Mar 05 PHP
避免Smarty与CSS语法冲突的方法
Mar 02 PHP
php关键字仅替换一次的实现函数
Oct 29 PHP
非常经典的PHP文件上传类分享
May 15 PHP
24条货真价实的PHP代码优化技巧
Jul 28 PHP
WHOOPS PHP调试库的使用
Sep 29 PHP
PhpStorm连接服务器并实现自动上传功能
Dec 09 PHP
PHP7 list() 函数修改
Mar 09 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引用效率问题分析
2012/03/23 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
php中yii框架实例用法
2020/12/22 PHP
关于document.cookie的使用javascript
2008/04/11 Javascript
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
浅析Node.js的Stream模块中的Readable对象
2015/07/29 Javascript
jQuery入门基础知识学习指南
2015/08/14 Javascript
js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
2015/09/05 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
Three.js利用顶点绘制立方体的方法详解
2017/09/27 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
2019/06/10 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
详解Element-UI中上传的文件前端处理
2019/08/07 Javascript
vue实现点击追加选中样式效果
2019/11/01 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
ES6字符串的扩展实例
2020/12/21 Javascript
Tensorflow累加的实现案例
2020/02/05 Python
Python @property及getter setter原理详解
2020/03/31 Python
Python多线程正确用法实例解析
2020/05/30 Python
python怎么对数字进行过滤
2020/07/05 Python
如何提高JDBC的性能
2013/04/30 面试题
大学生工作求职信
2014/06/23 职场文书
我的中国梦演讲稿小学篇
2014/08/19 职场文书
基于Python实现一个春节倒计时脚本
2022/01/22 Python
python双向链表实例详解
2022/05/25 Python
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技