javascript - 为什么每次重新加载页面时这个程序都会在消息表中插入值?
问题描述
这是一个使用 php、mysql、html、css 和 javascript 的简单聊天系统的代码。这段代码的问题是每次用户输入消息并按下发送按钮时,消息都会被发送并且值被插入到消息表中但是当我们刷新页面时,同样的消息再次被插入到消息表中数据库。我试图管理架构,但问题没有解决。这是我的代码。
<html>
<head>
<link rel="stylesheet" type="text/css" href="chat.css">
</link>
</head>
<body>
<?php
session_start();
include 'ConnectionPDO.php';
//include_once 'chat.html';
$_SESSION["person"]=$_GET["person"];
if(isset($_SESSION['username'])){
if(isset($_POST['btn'])){
$message=$_POST['msg'];
$person=$_GET['person'];
try {
$stmt = $dbh->prepare("INSERT INTO `messages` (`id`, `sendby`, `sento`, `date/time`, `seen`, `active`, `message`) VALUES (NULL, ?, ?, CURRENT_TIMESTAMP, 'No', 'No', ?)");
$stmt->bindParam(1,$_SESSION['username']);
$stmt->bindParam(2,$person);
$stmt->bindParam(3,$message);
$stmt->execute();
if($stmt) {
echo "<br>";
echo "Message sent!";
}
}
catch (PDOException $e) {
echo $e->getMessage();
}
}
}else{
}
?>
<div id="main">
<div id="inbox" style="height:400px;overflow:scroll">
<?php
$_SESSION["person"]=$_GET["person"];
try {
$stmt2 = $dbh->prepare("select * from `messages` where (`sendby`=? AND `sento`=?) OR (`sendby`=? AND `sento`=?)");
$stmt2->bindParam(1, $_SESSION['username']);
$stmt2->bindParam(2, $_SESSION["person"]);
$stmt2->bindParam(3, $_SESSION["person"]);
$stmt2->bindParam(4, $_SESSION['username']);
$stmt2->execute();
while($row=$stmt2->fetch()) {
$sento= $row['sendby'];
$message= $row['message'];
$time= $row['date/time'];
echo $sento;
echo "<br>";
echo $message;
echo "<br>";
echo $time;
echo "<br>";
echo "<hr>";
}
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>
</div>
<form method="post">
<input type="text" name="msg" placeholder="Enter your message here" id="msg"><br>
<input type="submit" value="Send" name="btn" id="btn">
</form>
</div>
<script>
setInterval(myFunction,1000);
function myFunction(){
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function()
{
if (this.readyState == 4 && this.status == 200) {
document.getElementById("inbox").innerHTML = this.responseText;
}
};
xhttp.open("POST","sendMsg.php", true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send();
}
</script>
</body>
</html>
解决方案
当您的前端(HTML、CSS)和后端(PHP 和 MySQL/PDO 查询)在同一页面上时,就会发生这种情况。更好的是,您可以使用前端插入详细信息并将其发送到其他 PHP 文件中的后端,并通过 ajax/header/cookies 等将结果状态重定向到前端文件。
推荐阅读
- c++ - 如何将矩阵写入csv C++
- android - 如何在不删除现有动态壁纸的情况下在 Android 中设置新的动态壁纸
- java - .p12 证书文件未附加到 Android Volley 请求,返回 400 No SSL Certificate was Sent
- python - 如何从拥抱脸的预训练模型中得到嵌入向量的单词?
- hadoop - 如何抑制 checkHadoopHome?
- node.js - 笑话 2 级深度
- jquery - 从另一个函数调用一个函数
- tensorflow - 为什么 Keras BatchNorm 产生的输出与 PyTorch 不同?
- sql - 如何在 SQL 中将数字转换为日期时间
- pine-script - 当收盘价突破之前的高点并且它们之间只有较低的高点时创建一个条件