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 相关文章推荐
解析关于wamp启动是80端口被占用的问题
Jun 21 PHP
php操作mysqli(示例代码)
Oct 28 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
通过php删除xml文档内容的方法
Jan 23 PHP
php单一接口的实现方法
Jun 20 PHP
PHP数组操作类实例
Jul 11 PHP
深入浅析用PHP实现MVC
Mar 02 PHP
PHP生成可点击刷新的验证码简单示例
May 13 PHP
PHP并发多进程处理利器Gearman使用介绍
May 16 PHP
在IIS下安装PHP扩展的方法(超简单)
Apr 10 PHP
PHP 二维array转换json的实例讲解
Aug 21 PHP
laravel 框架配置404等异常页面
Jan 07 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/08/10 PHP
用正则获取指定路径文件的名称
2007/02/27 Javascript
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
详谈 Jquery Ajax异步处理Json数据.
2011/09/09 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
纯javascript实现四方向文本无缝滚动效果
2015/06/16 Javascript
jquery性能优化高级技巧
2015/08/24 Javascript
纯javascript响应式树形菜单效果
2015/11/10 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
JS仿QQ好友列表展开、收缩功能(第一篇)
2017/07/07 Javascript
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
javascript中UMD规范的代码推演
2018/08/29 Javascript
Vue.js中的extend绑定节点并显示的方法
2019/06/20 Javascript
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
js实现点赞效果
2020/03/16 Javascript
部署vue+Springboot前后端分离项目的步骤实现
2020/05/31 Javascript
在python环境下运用kafka对数据进行实时传输的方法
2018/12/27 Python
利用Python+阿里云实现DDNS动态域名解析的方法
2019/04/01 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
python3代码输出嵌套式对象实例详解
2020/12/03 Python
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
报关简历自我评价怎么写
2013/09/19 职场文书
军训学生自我鉴定
2014/02/12 职场文书
2015年少先队活动总结
2015/03/25 职场文书
2015年路政工作总结
2015/05/22 职场文书
2016年政治理论学习心得体会
2016/01/25 职场文书
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技