PHP+Mysql无刷新问答评论系统(源码)

自己写的一个评论系统源码分享给大家,包括有表情,还有评论机制。用户名是随机的

针对某一篇文章进行评论

function subcomment() {
  $data['uid'] = getUserid();
  $data['mtype'] = I("post.mtype", 0, 'int');
  if ($data['uid'] == '') {
    echo json_encode(array("code" => -1));
  } else {
    $content = addslashes(str_replace("\n", "<br />", $_POST['content']));
    $data['tid'] = I("post.id", 0, 'int'); //文章id
    if (strlen(preg_replace('/\[ [^\)]+? \]/x', '', $content)) < 10) {
      echo json_encode(array("code" => "short than 10", "error" => "评论的内容不能少于10个字符。"));
      exit;
    }
    if (C("DB_PWD") != '') {
      if (time() - session("comment_time") < 60 && session("comment_time") > 0) {//2分钟以后发布
        echo json_encode(array("code" => "fast", "error" => "您提交评论的速度太快了,请稍后再发表评论。"));
        exit;
      }
    }
    $data['pid'] = I("post.pid", 0, 'int');
    $data['pid_sub'] = I("post.pid_sub", 0, 'int');
    $lyid = $data['pid_sub'] > 0 ? $data['pid_sub'] : $data['pid'];
    if ($lyid > 0) {
      $lyinfo = M("comment")->field("uid")->where("id='" . $lyid . "'")->find();
      $data['touid'] = $lyinfo['uid'];
    } else {
      $data['touid'] = 2;
    }
    $data['addtime'] = time();
    $emots = getTableFile("emot");
    foreach ($emots as $v) {
      $content = str_replace("[" . $v['name'] . "]", "<img alt='" . $v['name'] . "' src='" . __APP__ . "/Public/emot/" . ($v['id'] - 1) . ".gif'>", $content);
    }
    $data['content'] = addslashes($content);
    $info = M("comment")->field("id")->where("content='" . $data['content'] . "'")->find();
    if ($info['id']) {
      echo json_encode(array("code" => "comment_repeat", "error" => "检测到重复评论,您似乎提交过这条评论了"));
      exit;
    }
    $lastid = M("comment")->add($data);
    $points_comment = 20;
    if ($lastid > 0) {
      $day_start = strtotime(date("Y-m-d"));
      $day_end = $day_start + 3600 * 24;
      $comment_num_day = M("comment")->where("uid = " . $data['uid'] . " AND addtime between " . $day_start . " AND " . $day_end . "")->count();
      if ($comment_num_day <= 5) { //少于5条每天,则添加积分
//          addPoints("comment", $points_comment, $data['uid'], "评论获得" . $points_comment . "积分", 5, 1);
      }
//        addMessage('comment', $data['tid'], $data['pid'], $data['mtype'], $data['touid'], $content);
    }
    session("comment_time", time());
    echo json_encode(array("code" => 200, "comment" => $content, "points" => $points_comment));
  }
}

根据分页参数获取对应评论列表

function comments() {
  $id = I("get.id", 0, 'int');
  $mtype = I("get.mtype", 1, 'int');
  $page = I("get.page", 1, "int");
  $totalnum = I("get.totalnum", 1, "int");
  $start = 10 * ($page - 1);
  $sql = "tid = " . $id . " AND pid = 0";
  $comments = M("comment")->field("id,uid,content,addtime")->where($sql)->order("id DESC")->limit($start . ",10")->select();
//    echo M("comment")->getlastsql();
  foreach ($comments as $k => $v) {
    $comments[$k]['sub'] = M("comment")->field("id,uid,content,pid_sub")->where("tid = " . $id . " AND pid = " . $v['id'] . "")->order("id ASC")->select();
  }
  $this->assign("id", $id);
  $this->assign("mtype", $mtype);
  $this->assign("comments", $comments);
  $this->assign("comments_num", $totalnum - ($page - 1) * 10);
  $this->display();
}

切换评论分页

if ($("#detail-page").length > 0) {
  var id = $("#detail-page").attr("data-id");
  var mtype = $("#detail-page").attr("data-mtype");
  var totalnum = $("#detail-page").attr("data-totalnum");
  $("#detail-page").children("a").click(function() {
    var page = parseInt($(this).attr("data-page"));
    $("#detail-page").children("a").removeClass("current");
    $("#detail-page").children("a").eq(page - 1).addClass("current");
    $("#comment_list").html("<div style='padding:20px 0;text-align:center;'><img src='" + site_url + "Public/images/loading.gif'></div>");
    $.get(getUrl("Box/comments"), {
      page: page,
      id: id,
      totalnum: totalnum,
      mtype: mtype
    },
    function(data) {
      $("#comment_list").html(data)
    })
  })
}

评论表和表情表已放在压缩包里

CREATE TABLE IF NOT EXISTS `sucai_comment` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `uid` int(11) NOT NULL,
 `touid` int(11) DEFAULT '0',
 `pid_sub` int(11) DEFAULT '0',
 `tid` int(11) NOT NULL,
 `pid` int(11) DEFAULT '0',
 `mtype` tinyint(1) NOT NULL,
 `content` text NOT NULL,
 `addtime` int(10) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5560 ;

功能实现和demo原址:www.erdangjiade.com/js/816.html

(0)

相关推荐

  • 使用AngularJS和PHP的Laravel实现单页评论的方法

    完整代码:https://github.com/scotch-io/laravel-angular-comment-app 目前,Laravel和Angular均已经成为了Web发展世界里非常著名的工具.Laravel以给PHP社区引入的伟大内容著称,Angular以其惊人的前端工具及简单著称.组合这两大框架似乎是合乎逻辑的下一步. 在我们的使用环境下,我们将使用Laravel作为后端的RESTful API,Angular作为前端,以创建一个简单的单页的评论应用. 下面是一个简单的例子,展示了

  • 详解WordPress中调用评论模板和循环输出评论的PHP函数

    comments_template comments_template 函数是一个调用评论模板的函数,使用起来很简单,与get_header()等函数一样,是一个include文件类函数,今天来讲一下他的使用. 描述 上面已经讲过了,就是调用评论模板的一个函数. 使用 <?php comments_template( $file, $separate_comments ); ?> 其中 $file 需要调用的文件名 默认值: /comments.php $separate_comments 是

  • ThinkPHP上使用多说评论插件的方法

    本文实例讲述了ThinkPHP上使用多说评论插件的方法.分享给大家供大家参考.具体实现方法如下: 先前访问网友的一些网站,他们好些的局部都发生了变化,如文章的评论模块设计得和谐美观,集表情和分享工具于一体,而且可以盖楼式评论,当时我真是称赞不已,真牛啊,能开发出这样的评论模块!后来聊天我才知道,原来他们是使用了多说评论插件. 什么是多说? 多说是一款追求极致体验的社会化评论框,可以用微博.QQ.人人.豆瓣等帐号登录并评论,用社交账号登录,进行评论,同时转发到社交平台(可选),进行回复.标记喜欢.

  • 回答PHPCHINA上的几个问题:URL映射

    PHPCHINA服务器搬迁后,我就基本上上不去了,只能用代理,郁闷.但用代理居然不能发帖,回帖.做为版主,深感遗憾,今天用代理上去看到了几个帖子,顺便在这里回答下. 1.大家来说说URL映射吧    一般url映射有两种方式,一种是通过mod_rewrite实现,这种网上教材很多我也不多说了.另外一种是在程序中模拟,比如类似zend Framework中的那种方式/index.php/controller/action/var1/value1/var2/value2/.这里方式其实最主要是通过一

  • PHP Ajax实现页面无刷新发表评论

    大家都有在网站发表评论的经历,传统的发表过程无非是:发表->提交页面表单->等待刷新页面,这样在网络比较拥挤的时候,往往需要漫长的等待,今天介绍用PHP+Ajax实现页面无刷新发表评论,希望对初学ajax的PHPer有所帮助. 那么首先,我们需要一个基本的ajax开发框架,文件ajax.js就包含了这个框架,代码如下: var http_request=false;  function send_request(url){//初始化,指定处理函数,发送请求的函数    http_request

  • PHP+Mysql无刷新问答评论系统(源码)

    自己写的一个评论系统源码分享给大家,包括有表情,还有评论机制.用户名是随机的 针对某一篇文章进行评论 function subcomment() { $data['uid'] = getUserid(); $data['mtype'] = I("post.mtype", 0, 'int'); if ($data['uid'] == '') { echo json_encode(array("code" => -1)); } else { $content =

  • Java Swing实现餐厅点餐系统源码(收藏版)

    本文适合Java初级选手,主要技术是Java和MySQL.主要功能如下: (1)注册功能 (2)管理员可以新增套餐 (3)管理员可以管理套餐 (4)管理员可以处理订单 (5)管理员可以修改密码 (6)顾客可以点餐 (7)顾客可以查看订单信息 (8)顾客可以修改个人信息 下面是项目目录 源码有点多,不太好贴,如果需要源码,可以关注公众号[Java技术迷]回复[2021]编号03即是该系统的源码. 即可获取整套源码,也可以直接扫码关注 下面是系统运行图 如果需要源码,可以关注公众号回复[2021]即

  • 详解MySQL多版本并发控制机制(MVCC)源码

    目录 一.前言 二.MVCC(多版本并发控制机制) 2.1.Repeatable Read 2.2.Read Commit 2.3.MVCC的优势 三.MVCC(实现机制) 3.1.select运行栈 3.2.read_view的创建过程 3.3.行版本可见性 3.4.undolog搜索可见版本的过程 3.5.read_view创建时机再讨论 四.MVCC和锁的同时作用导致的一些现象 五.总结 一.前言 作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾.<<

  • C语言银行储蓄系统源码

    本文为大家分享了C语言银行储蓄系统源码,实现银行的各项功能,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> void openaccount();//开户 void save();//存款 void withdraw();//取款 void showAccount();//查询 void transferAccounts();

  • nodejs模块系统源码分析

    概述 Node.js的出现使得前端工程师可以跨端工作在服务器上,当然,一个新的运行环境的诞生亦会带来新的模块.功能.抑或是思想上的革新,本文将带领读者领略 Node.js(以下简称 Node) 的模块设计思想以及剖析部分核心源码实现. CommonJS 规范 Node 最初遵循 CommonJS 规范来实现自己的模块系统,同时做了一部分区别于规范的定制.CommonJS 规范是为了解决JavaScript的作用域问题而定义的模块形式,它可以使每个模块在它自身的命名空间中执行. 该规范强调模块必须

  • 关于androidstuio导入系统源码的问题

    最近公司需要做一些将系统源码导出来,然后加入一些功能,在导入androidstudio过程中遇到过一些问题,这里记录下,方便以后需要. 一般导入成功的都是系统比较相对独立的app,比如计算器.Schedule power on off等,网上查阅一些资料后,最终解决. 这里以Schedule power on off为例. 1.导出Schedule power on off源码,路径为/package/apps/ 如图: 新建androidstudio项目,导入相关代码以及相关资源文件,rebu

  • 在Android系统源码中预置APK的方法

    如何将无源码的google play APK预置进系统(有源码和无源码有一点区别,网上下载的google play.apk解压之后里面没有源码)? (注意下文中的Test就是我们要预置到源码中的googleplay.apk的名字!!网上下载的Google Play Store 4.6.17.apk,名字中含有空格,将空格去掉或者自直接将它重新命名) 1.在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预制一个名为Test的APK为例  2.将 Test.apk 放到

  • 简单的php+mysql聊天室实现方法(附源码)

    本文实例讲述了简单的php+mysql聊天室实现方法.分享给大家供大家参考,具体如下: 这里介绍的程序分为 8 个文件: frameset框架页面:index.php 显示聊天室内容页:show.php 用户登陆页面:login.php 用户发言页面:speak.php 数据库配置文件:config.php 页面美化样式:style.css 数据库文件:chat.sql 发言表情包:face/ 分别介绍如下: 一.数据库文件chat.sql如下: SET FOREIGN_KEY_CHECKS=0

  • Android下拉刷新控件SwipeRefreshLayout源码解析

    SwipeRefreshLayout是Android官方的下拉刷新控件,使用简单,界面美观,不熟悉的朋友可以随便搜索了解一下,这里就不废话了,直接进入正题. 首先给张流程图吧,标出了几个主要方法的作用,可以结合着看一下哈. 这种下拉刷新控件的原理不难,基本就是监听手指的运动,获取手指的坐标,通过计算判断出是哪种操作,然后就是回调相应的接口了.SwipeRefreshLayout是继承自ViewGroup的,根据Android的事件分发机制,触摸事件应该是先传递到ViewGroup,根据onInt

随机推荐