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 相关文章推荐
rephactor 优秀的PHP的重构工具
Jun 09 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
Jan 03 PHP
php生成短网址示例
May 05 PHP
php中mt_rand()随机数函数用法
Nov 24 PHP
thinkphp的URL路由规则与配置实例
Nov 26 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
Apr 17 PHP
PHP实现根据银行卡号判断银行
Apr 29 PHP
CodeIgniter读写分离实现方法详解
Jan 20 PHP
微信小程序 消息推送php服务器验证实例详解
Mar 30 PHP
PHP实现的ID混淆算法类与用法示例
Aug 10 PHP
PHP如何搭建百度Ueditor富文本编辑器
Sep 21 PHP
PHP抽象类基本用法示例
Dec 28 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
咖啡的传说和历史
2021/03/03 新手入门
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
php获取图片信息的方法详解
2015/12/10 PHP
jQuery select操作控制方法小结
2010/05/26 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
2014/02/21 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
2014/12/15 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
基于javascript如何传递特殊字符
2015/11/30 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
Node爬取大批量文件的方法示例
2019/06/28 Javascript
javascript实现摄像头拍照预览
2019/09/30 Javascript
vue 实现强制类型转换 数字类型转为字符串
2019/11/07 Javascript
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
Python中用altzone()方法处理时区的教程
2015/05/22 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
Python文本相似性计算之编辑距离详解
2016/11/28 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
Python修改DBF文件指定列
2020/12/19 Python
CSS3 2D模拟实现摩天轮旋转效果
2016/11/16 HTML / CSS
1688平价精选商城:阿里集团旗下,工厂出厂价格直销
2017/04/24 全球购物
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
精伦电子Java笔试题
2013/01/16 面试题
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
如果Session Bean得Remove方法一直都不被调用会怎么样
2012/07/14 面试题
师德建设实施方案
2014/03/21 职场文书
老公给老婆的检讨书(精华篇)
2014/10/18 职场文书
自主招生英文自荐信
2015/03/25 职场文书
党支部综合考察意见
2015/06/01 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书