时间:2021-07-01 10:21:17 帮助过:2人阅读
大家可能都看过网易评论的那种盖楼式的引用,这边文章就用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+MySQL实现模糊查询员工信息功能
PHP+MySQL实现输入页码跳转到指定页面功能示例
PHP+mysql+ajax实现轻量级聊天室的方法
以上就是仿网易评论盖楼PHP+Mysql实现的详细内容,更多请关注Gxl网其它相关文章!