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与MySQL开发中页面乱码的产生与解决
Mar 27 PHP
zend optimizer在wamp的基础上安装图文教程
Oct 26 PHP
ThinkPHP处理Ajax返回的方法
Nov 22 PHP
php写入数据到CSV文件的方法
Mar 14 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
Sep 25 PHP
PHP简单的MVC框架实现方法
Dec 01 PHP
如何使用微信公众平台开发模式实现多客服
Jan 06 PHP
Smarty保留变量用法分析
May 23 PHP
微信支付开发告警通知实例
Jul 12 PHP
浅谈PHP的数据库接口和技术
Dec 09 PHP
浅谈Laravel中的一个后期静态绑定
Aug 11 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
Apr 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
各种战术和打法的原创者
2020/03/04 星际争霸
ajax返回值中有回车换行、空格的解决方法分享
2013/10/24 PHP
如何运行/调试你的PHP代码
2020/10/23 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
JQuery打造PHP的AJAX表单提交实例
2009/11/03 Javascript
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
基于Jquery的动态添加控件并取值的实现代码
2010/09/24 Javascript
javascript数组的使用
2013/03/28 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
一个简单的node.js界面实现方法
2018/06/01 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
2020/07/31 Javascript
vue-路由精讲 二级路由和三级路由的作用
2020/08/06 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
[40:50]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第四场
2014/05/24 DOTA
在Python的Django框架中编写编译函数
2015/07/20 Python
python统计多维数组的行数和列数实例
2018/06/23 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
python温度转换华氏温度实现代码
2020/12/06 Python
Python Selenium库的基本使用教程
2021/01/04 Python
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
Ray-Ban雷朋西班牙官网:全球领先的太阳眼镜品牌
2018/11/28 全球购物
英国IT硬件供应商,定制游戏PC:Mesh Computers
2019/03/28 全球购物
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang