首页 > 数据库 >PHP+sql3实现评论区功能

PHP+sql3实现评论区功能

时间:2023-08-01 09:22:22浏览次数:42  
标签:replywho target sql3 xhr 评论 landid time var PHP

首先,在这之前,先知道,我是把这个评论区分为,“提问”以及“回答”两部分。

 

难点一、事件委托!使得按钮生效

我遇到一个问题就是,每次通过PHP,拿到数据库的数据,我把它的HTML拼接好,拼接成字符串再返回到xhr.responseText时,循环输出的这些“提问”,最右边的“回复”按钮 用不了,

这里我最终使用——事件委托 来解决。通过e.target来获取节点。

如果用户点击了“回复”按钮,就弹出“回复输入框”,再次点击“回复”按钮,则隐藏“回复输入框”。

 

事件委托代码如下:

<script>
var jiazai=document.getElementById('jiazai');
jiazai.onclick=function(ev){
// alert('fdffff');
var e =ev|| window.event;
var target = e.target || window.event.srcElement;
if(e.target.innerHTML=="回复"){
// alert(e.target.getAttribute('btnid'));
// var ra=e.target.nextElementSibling.getAttribute('id');
if(e.target.nextElementSibling.style.display=="none"){
e.target.nextElementSibling.style.display="block";
}else{
e.target.nextElementSibling.style.display="none";
}

}

if(e.target.innerHTML=="发表"){
// 事件委托中最好通过节点之间的关系来获取节点!
// alert(e.target.previousElementSibling.value);
var isuser=0<?php echo $uid; ?>;

// alert(isuser);
if(!isuser){
alert('请先登录!');
}else{
var content=e.target.previousElementSibling.value;
var replywho=e.target.getAttribute('replywho');

var xhr=null;
xhr=new XMLHttpRequest();
xhr.open("get","landscape_reply.php?content="+content+"&landid="+landid+"&replywho="+replywho,true);
xhr.send();

xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
// console.log(xhr.responseText);
// alert(xhr.responseText);
jiazai.innerHTML=xhr.responseText;
// myquestion.value="";
}
}

}

}

}
</script>

用户点击“发表”按钮,则先判断用户是否登录,登录了才可以进行发表操作。

难点二、数据库的表怎么设计?提问与回答是否放在一张表里?


我是放在一张表里的,如何用户发表的是“提问”,则replywho为0.

否则,用户发表的是“回答”,那么在通过ajax传回答的内容时,记得也要传一个replywho,用户回答的是哪条问题,这里的replywho就等于问题的id。

所以前提是!记得提前存好问题id。

我的存法是:

1 <div class="r_area" style="display:none;" replyid="'.$res2['id'].'">
2 <input type="text" name="question" class="replyarea" placeholder="请写下您的回答!" value="">
3 <button class="publish" replywho="'.$res2['id'].'">发表</button>
4 </div>

 

在循环输出这个页面的时候,把该条问题的id赋值给“发表回答”的那个按钮。

这样用户发表回答时,就可以通过var replywho=e.target.getAttribute('replywho');拿到replywho,

难点三、分开操作
我把加载页面时,渲染页面单独写在一个<script>中,点击按钮发表之后,需要局部刷新重新渲染页面有单独写在一个<script>中。

 1 <script>
 2 // 加载!初始化
 3 
 4 window.onload=function(){
 5 var surepublish=document.getElementById('surepublish');
 6 var landid = surepublish.getAttribute('landid');
 7 var xhr=null;
 8 xhr=new XMLHttpRequest();
 9 xhr.open("get","get_qa.php?landid="+landid,true);
10 xhr.send();
11 
12 xhr.onreadystatechange = function(){
13 if(xhr.readyState == 4){
14 // alert(xhr.responseText);
15 jiazai.innerHTML=xhr.responseText;
16 }
17 }
18 
19 }
20 
21 </script>

 

上述代码是在初始化页面。

surepublish.onclick=function(){
// alert(myquestion.value);
// alert(landid);
// var isuser = 0;

var isuser=0<?php echo $uid; ?>;
if(!isuser){
alert('请先登录!');
}else{
var xhr=null;
xhr=new XMLHttpRequest();
xhr.open("get","landscape_qa.php?content="+myquestion.value+"&landid="+landid,true);
xhr.send();

xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
// alert(xhr.responseText);
jiazai.innerHTML=xhr.responseText;
myquestion.value="";
}
}
}


}

上述代码是,用户在发表 新问题的时候,会触发函数,将发表内容传入数据库的同时,会局部更新(更新评论区),用户发表的问题会立即显示出来。

 

难点四、如何将问题和回答一一对应渲染在页面上?每一问题怎么找到属于自己的回答?

 1 $sql="INSERT INTO question_reply(landid,userid,replywho,content,time) VALUES('{$landid}','{$uid}','0','{$content}','{$time}')";
 2 // echo $sql;
 3 $res = mysqli_query($link,$sql);
 4 // echo $res;
 5 if (!$res) {
 6 printf("Error: %s\n", mysqli_error($link));
 7 exit();
 8 }
 9 
10 $output="";
11 $sql2="SELECT * FROM question_reply LEFT JOIN user_form ON question_reply.userid=user_form.userid where landid=".$landid;
12 $row2 = mysqli_query($link,$sql2);
13 while($res2=mysqli_fetch_assoc($row2)){
14 if($res2['replywho']==0){
15 $datetime=$res2['time'];
16 $outputtime=date("Y-m-d H:i:s",$datetime);
17 if($res2['replywho']==0){
18 $output .='<div class="qacontainer">
19 <img id="userimg" src="'.$res2['portrait'].'" alt="">
20 <div class="qa">
21 <span class="qaname">'.$res2['username'].'</span> <span class="qatime">'.$outputtime.'</span>
22 <p class="qaquestion">'.$res2['content'].'</p>
23 <button class="publish">回复</button>
24 
25 <div class="r_area" style="display:none;" replyid="'.$res2['id'].'">
26 <input type="text" name="question" class="replyarea" placeholder="请写下您的回答!" value="">
27 <button class="publish" replywho="'.$res2['id'].'">发表</button>
28 </div>
29 </div>
30 </div>';

 


             

 1 // 重要!!!!!!!!!!!!!!!!以下就是在为“问题”寻找“回答”
 2 
 3 $sql3="SELECT * FROM question_reply LEFT JOIN user_form ON question_reply.userid=user_form.userid where replywho=".$res2['id']." AND landid=".$landid;
 4 // echo $sql3;
 5 $row3 = mysqli_query($link,$sql3);
 6 while($res3=mysqli_fetch_assoc($row3)){
 7 $datetime=$res3['time'];
 8 $outputtime=date("Y-m-d H:i:s",$datetime);
 9 $output .='<div class="reply_box">
10 <img id="replyimg" src="'.$res3['portrait'].'" alt="">
11 <div>
12 <span class="replyname">'.$res3['username'].'</span>
13 <span class="qatime">'.$outputtime.'</span>
14 <p>'.$res3['content'].'</p>
15 
16 </div>
17 
18 </div>';
19 
20 }
21 
22 }
23 }
24 
25 }
26 
27 echo $output;
28 
29 $sql3="SELECT * FROM question_reply LEFT JOIN user_form ON question_reply.userid=user_form.userid where replywho=".$res2['id']." AND landid=".$landid;

 

我是每渲染出一条问题,就利用$sql3语句去寻找回答,看看数据库的表中,哪一行的replywho等于目前的这个问题的id,如果找到了,就让 该HTML语句 拼接在$output中。

没有回答的话,就继续渲染下一条问题。

难点五、时间戳转换成 年月日

$time=time();
$sql="INSERT INTO question_reply(landid,userid,replywho,content,time) VALUES('{$landid}','{$uid}','0','{$content}','{$time}')";
$time=time();中的time()就可以获取当前时间的时间戳,再将时间戳存入到表中。

$datetime=$res2['time'];
$outputtime=date("Y-m-d H:i:s",$datetime);

 

如何转换成年月日:

取出时间戳后,通过date()函数即可。

date("Y-m-d H:i:s",时间戳);

标签:replywho,target,sql3,xhr,评论,landid,time,var,PHP
From: https://www.cnblogs.com/YaoZhouyi/p/17595591.html

相关文章

  • php随机图片源码
    <?php//设置图片文件夹路径$dir='images/';//获取文件夹中所有图片文件名$files=glob($dir.'*.{jpg,jpeg,png,gif}',GLOB_BRACE);//随机选择一张图片$random_file=$files[array_rand($files)];//设置响应头为图片类型header('Content-Type:image/jpeg');//输出......
  • php跳转到指定网页
    1、php如何实现登录成功后跳转页面2、php如何跳转新窗口3、PHP如何登录完成跳转上一访问页面php如何实现登录成功后跳转页面php如何实现登录成功跳转页面跳转首先将判断用户是否登录成功php跳转到指定网页,如果登录成功则使用“header()”函数,将http请求头的“Location”设......
  • 浅谈php伪协议的运用
    浅谈php伪协议的运用(133条消息)PHPFilter伪协议Trick总结_php伪协议rot13的用法_swtre33的博客-CSDN博客php死亡exit()绕过-xiaolong'sblog(xiaolong22333.top)0x00ctf中常见的伪协议种类在CTF比赛中,常常会使用PHP伪协议来进行一些有趣的挑战。PHP伪协议是一种特殊的U......
  • PHP调用API接口的方法及实现
    随着互联网、云计算和大数据时代的到来,越来越多的应用程序需要调用第三方的API接口来获取数据,实现数据互通和协同工作。PHP作为一种常用的服务器端语言,也可以通过调用API接口来实现不同系统的数据交互和整合。本文将介绍PHP调用API接口的方法及实现过程。一、API接口简介API(Applica......
  • PHP调用API接口的方法及实现
    随着互联网、云计算和大数据时代的到来,越来越多的应用程序需要调用第三方的API接口来获取数据,实现数据互通和协同工作。PHP作为一种常用的服务器端语言,也可以通过调用API接口来实现不同系统的数据交互和整合。本文将介绍PHP调用API接口的方法及实现过程。一、API接口简介API(Appl......
  • PHP8的数据类型-PHP8知识详解
    在PHP8中,变量不需要事先声明,赋值即声明。不同的数据类型其实就是所储存数据的不同种类。在PHP8.0、8.1中都有所增加。以下是PHP8的15种数据类型:1、字符串(String):用于存储文本数据,可以使用单引号或双引号来定义字符串。2、整数(Integer):用于存储整数值,可以是正数、负数或零。3、浮点数(F......
  • PHP8的标记风格-PHP8知识详解
    欢迎来到PHP服务网学习PHP8的知识详解系列教程,本文学习的是PHP8的标记风格,本文教程纠正了很多网站的错误知识,补充了很多教程网站的遗漏之处,虽然很多网站的文章标题也是PHP标记风格。但是很多教程却不适合PHP8的版本了。当PHP8解析一个文件时,PHP8会寻找起始标记和结束标记,也就是<?......
  • PHP8的注释-PHP8知识详解
    欢迎你来到PHP服务网,学习《PHP8知识详解》系列教程,本文学习的是《PHP8的注释》。什么是注释?注释是在程序代码中添加的文本,用于解释和说明代码的功能、逻辑或其他相关信息。注释通常不会被编译器或解释器处理,而是用于帮助程序员理解代码。在大多数编程语言中,注释以特定的语法结构或......
  • WEB漏洞—反序列化之php&java(上)
    PHP反序列化原理:---未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。---其实跟文件解析差不多,都是由于传递的恶意参数被执行(序列化和反序列化相当于加解密过程)---在反序列化的过程中自动触发了某些魔术方......
  • PHP8开发工具VS Code的安装-PHP8知识详解
    作为PHP8的开发工具有很多,具有IDE功能的有phpstorm、VisualStudioCode、SublimeText、NetBeans、Eclipse、Codelobster、PHPDesigner等,当然还有很多轻量的工具,比如Notepad、Editplus等。本文给你介绍的是万能编辑器VisualStudioCode,简称VSCode。我为什么选择VisualStudioC......