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 ADODB使用方法集锦
Mar 25 PHP
php中使用临时表查询数据的一个例子
Feb 03 PHP
PHP常用正则表达式集锦
Aug 17 PHP
php中session与cookie的比较
Jan 27 PHP
PHP利用APC模块实现大文件上传进度条的方法
Oct 29 PHP
PHP-FPM实现性能优化
Mar 31 PHP
php数据访问之增删改查操作
May 09 PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
Feb 15 PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 PHP
php fread函数使用方法总结
May 28 PHP
php实例化一个类的具体方法
Sep 19 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 危险函数全解析
2009/09/09 PHP
php画图实例
2014/11/05 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
判断对象是否Window的实现代码
2012/01/10 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
2015/08/07 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
JS经典正则表达式笔试题汇总
2016/12/15 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
2017/01/11 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
JS实现碰撞检测的方法分析
2018/01/19 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
详解vue中router-link标签所必备了解的属性
2019/04/15 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
Python装饰器的函数式编程详解
2015/02/27 Python
在Python中使用SQLite的简单教程
2015/04/29 Python
基于Python如何使用AIML搭建聊天机器人
2016/01/27 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
python Flask 装饰器顺序问题解决
2018/08/08 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
python文件选择对话框的操作方法
2019/06/27 Python
详解Python IO编程
2020/07/24 Python
Python3爬虫中pyspider的安装步骤
2020/07/29 Python
CSS3样式linear-gradient的使用实例
2017/01/16 HTML / CSS
HTML5 canvas 瀑布流文字效果的示例代码
2018/01/31 HTML / CSS
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
《宋庆龄故居的樟树》教学反思
2014/04/07 职场文书
厨房领班竞聘演讲稿
2014/04/23 职场文书
爱护公共设施倡议书
2014/08/29 职场文书
原告离婚代理词
2015/05/23 职场文书
2015最新婚礼主持词
2015/06/30 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
简单介绍Python的第三方库yaml
2021/06/18 Python