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
第十节--抽象方法和抽象类
Nov 16 PHP
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
Dec 13 PHP
PHP 在线翻译函数代码
May 07 PHP
PHP 数据结构 算法 三元组 Triplet
Jul 02 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
Jun 21 PHP
百度地图API应用之获取用户的具体位置
Jun 10 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
Jun 19 PHP
PHP将回调函数作用到给定数组单元的方法
Aug 19 PHP
php开发时容易忘记的一些技术细节
Feb 03 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
May 05 PHP
php 字符串中是否包含指定字符串的多种方法
Apr 12 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不用递归遍历目录下所有文件的代码
2014/07/04 PHP
php进程间通讯实例分析
2016/07/11 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
jQuery 核心函数以及jQuery对象
2010/03/23 Javascript
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
2010/07/26 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
jQuery插件开发汇总
2016/05/15 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
bootstrap网格系统使用方法解析
2017/01/13 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
vue学习之mintui picker选择器实现省市二级联动示例
2017/10/12 Javascript
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
详解vue父子组件状态同步的最佳方式
2020/09/10 Javascript
python中二维阵列的变换实例
2014/10/09 Python
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
Python兔子毒药问题实例分析
2015/03/05 Python
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
python实现画圆功能
2018/01/25 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
python里 super类的工作原理详解
2019/06/19 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
Python 识别12306图片验证码物品的实现示例
2020/01/20 Python
pycharm sciview的图片另存为操作
2020/06/01 Python
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
资源环境与城市管理专业推荐信
2013/11/30 职场文书
小学敬老月活动方案
2014/02/11 职场文书
财产公证书样本
2014/04/04 职场文书
护林员个人总结
2015/03/04 职场文书