这篇文章主要介绍了关于仿网易评论盖楼PHP+Mysql实现,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
大家可能都看过网易评论的那种盖楼式的引用,这边文章就用php和mysql来实现这种效果。
先设计数据表来存放评论数据:
DROP TABLE IF EXISTS `comment`; CREATE TABLE `comment` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL, `site` varchar(128) DEFAULT NULL, `content` varchar(1000) NOT NULL, `time` datetime NOT NULL, `pid` int(10) NOT NULL, `articleid` int(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
其中的关键字段就是pid,保存的是引用评论的id,如果没有引用那么设为0即可。
具体的实现主要是通过递归算法来找出所有引用的评论(和无限分类菜单类似),代码如下:
<?php
require_once"sqlHelper.class.php";
//连接数据库
$sqlHelper= new SqlHelper('localhost','root', 'root','test', 3306);
//插入评论数据
if(isset($_POST) && !empty($_POST)){
$comment= array();
$comment['username'] =$_POST['name']?$_POST['name']:'匿名';
$comment['site'] =$_POST['site']?$_POST['site']:'
';
$comment['pid'] =$_POST['commentid']?$_POST['commentid']:'0';
if($comment['pid']
== $comment['id']){
$comment['pid'] ='0';
}
$comment['content'] =$_POST['content']?$_POST['content']:'...';
$comment['articleid'] =$_POST['articleid']?$_POST['articleid']:'1';
$comment['time'] = date ( 'Y-m-d H:i:s', time () );
$sql_str= $sqlHelper->get_replace_db_sql("comment",$comment);
//echo $sql_str;
$sqlHelper->insert_db($sql_str);
}
?>
<!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"xml:lang="en">
<head>
<meta http-equiv="Content-Type"content="text/html;charset=UTF-8"/>
<title>文章评论的无限引用实现</title>
<style type="text/css">
*{margin:0;padding:0;}
body{margin:10px;font-size:14px;font-family:宋体}
h1{font-size:26px;margin:10px 0 15px;}
#commentHolder{width:540px;border-bottom:1px solid #aaa;}
.comment{padding:5px 8px;background:#f8fcff;border:1px solid #aaa;font-size:14px;border-bottom:none;}
.comment p{padding:5px 0;}
.comment p.title{color:#1f3a87;font-size:12px;}
.comment p span{float:right;color:#666}
.comment p{background:#ffe;padding:3px;border:1px solid #aaa;line-height:140%;margin-bottom:5px;}
.comment p span{color:#1f3a87;font-size:12px;}
</style>
</head>
<body>
<?php
functionp($str){
echo"<pre>";
if(is_array($str))
print_r($str);
else
echo$str;
echo"</pre>";
}
/*
获取文章id对应的所有评论,以数组的形式返回结果
*/
functiongetCommentByArticleId($articleid=1){
$result= array();
if(empty($articleid)
|| !is_numeric($articleid)){
return$result;
}
$sql= 'select * from comment where articleid = '. $articleid;
global$sqlHelper;
$result= $sqlHelper->get_all($sql);
//p($result);
return$result;
}
/*
把评论数组数据转换为html格式
*/
functioncommentArr2Html($comment_arr) {
$str= '';
if(is_array($comment_arr)
&& !empty($comment_arr)){
$str.= '<p id="commentHolder">';
foreach($comment_arr as $key => $value) {
$str.= '<p class="comment">';
$str.= '<p class="title"><a href="#">'.$value['username'] .'</a>';
$str.= '<span>' . $value['time'] .' 发表</span>';
$str.= '</p>';
global$temp_arr;
$temp_arr= array();
//这里去查找当前评论下的所有引用的评论,并格式化为html字符串
$tmpStr= '';
addCommentNode($comment_arr,$value);
krsort($temp_arr);//根据key倒叙排序数组
$tmpStr= getChildComment($temp_arr);//添加所有的引用评论
$str.= $tmpStr;
$str.= "<p>" . $value['content'] ."</p>";
$str.= '</p>';
}
$str.='</p>';
}
return$str;
}
/*
把temp_arr数组中保存的引用评论信息转换为html形式
*/
functiongetChildComment($temp_arr){
$htmlStr= '';
if(!is_array($temp_arr)
|| empty($temp_arr)){
return'';
}
foreach($temp_arras $value){
$tmp= '<p>';
$tmp.= $htmlStr;
$tmp.= '<span>' . $value['username'] .' 原贴:</span><br />' . $value['content'];
$tmp.= '</p>';
$htmlStr= $tmp;
}
return$htmlStr;
}
/*
list代表某一文章下的全部评论列表
cmt代表当前要显示的评论
*/
functionaddCommentNode($list,$cmt){
if(isset($cmt['pid'])
&& $cmt['pid'] !='0'){
$find= findParentCmt($list,$cmt['pid']);//找寻id等于当前评论的pid的评论,返回数组。
// 递归调用,只要pid不为零,就加入到引用评论列表
addCommentNode($list,$find);
}else{
return;
}
}
/**
* 查找list中找寻id等于pid的数组项,并返回
* @param [type] $list [description]
* @param [type] $cmtpid [description]
* @return [type] [description]
*/
functionfindParentCmt($list,$cmtpid){
foreach($list as $key => $value) {
if($value['id']
== $cmtpid){
/* 用数组的方式来保存所有引用的评论 */
global$temp_arr;
$temp_arr[] =$list[$key];
//p($list[$key]);echo "<hr>";
return$list[$key];
}
}
returnfalse;
}
$temp_arr= array();//设一个全局的数组变量来保存引用评论的信息
$list= getCommentByArticleId();//通过文章id获取所有的文章评论
$htmlStr= commentArr2Html($list);//把获取到的评论格式化转换为html形式
?>
<form method="post"action="comment.php"name="comment_form"id="comment_form">
<h1>文章评论的无限引用PHP+Mysql实现</h1><br /><br />
<!-- 这个是页面的结构 -->
<!--<p id="commentHolder">
<pclass='comment'>
<pclass='title'><a href="#">内蒙古网友</a>
<span>2008-3-24 16:33:49 发表</span>
</p>
<p>//第四层引用
<p>//第三层引用
<p>//次顶层引用
<p>//最顶层引用
<span>1 <a href="#">广州网友</a> 原贴:</span><br />
向马XX同志荣升台湾省省长表示祝贺!
</p>
<span>2 <a href="#">四川网友</a> 原贴:</span><br />
四川人民发来贺电!
</p>
<span>1 <a href="#">广州网友</a> 原贴:</span><br />
向马XX同志荣升台湾省省长表示祝贺!
</p>
<span>3 <a href="#">陕西西安网友</a> 原贴:</span><br />
陕西网友发来贺电
</p>
<p>内蒙网友发来贺电</p>
</p>
</p>-->
<!-- 直接echo输出拼好的html串 -->
<?php echo $htmlStr; ?>
<br />
你的名字:<input type="text"id="" name="name"/><br />
联系方式或个人网站:<input type="text"id="" name="site"/><br />
选择引用的评论:
<select id=""name="commentid">
<!-- 这个可以查数据库获取 也可以写到上边的评论下加一个引用的链接 -->
<option value=""selected="selected">选择引用</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
</select><br />
评论内容酷站网软:<br />
<textarea id=""rows="" cols="" name="content"></textarea>
<input type="hidden"id="" name="articleid" value="1"/>
<input type="submit"value="提交"/><br />
</form>
</body>
</html>相关推荐:
立即学习“PHP免费学习笔记(深入)”;
以上就是仿网易评论盖楼PHP+Mysql实现的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号