<?php
session_start();
if(!$_SESSION['Admin']) {
header('Location: login.php'); exit();
}
?>
<!DOCTYPE HTML>
<html>
<head>
<title> ticketExpress | Admin </title>
<link rel='stylesheet' href='../assets/css/style.css'>
</head>
<body>
<div id='containerAdmin'>
<h1> <img class='logo' src='../assets/images/logo.png' width='200' height='43'> </h1> <a href='?logout' class='logout'> Logout </a>
<h3> Open Tickets </h3>
<hr />
<?php
require("../configuration/config.php");
$GetTickets = $con->query("SELECT * FROM tickets WHERE open='true'");
while($TicketInfo = $GetTickets->fetch_object()) {
$Subject = $TicketInfo->Subject;
echo "<div id='ticket'>".$Subject ."<a href='?delete=$TicketInfo->ID'><img style='float:right'src='../assets/images/delete.png' width='15px' height='15px'></a><a style='float:right; color:red; text-decoration:none; margin-right:10px;' href='?close=$TicketInfo->ID'> Close </a><font style='float:right; margin-right:10px; color:green;' id='responseMsg'> </font></div>";
}
if(isset($_GET['delete'])) {
$ID = $_GET['delete'];
echo "
<script type='text/javascript'>
var ajax = new XMLHttpRequest();
ajax.open('POST','delete.php', true);
ajax.setRequestHeader('Content-type','application/x-www-form-urlencoded');
ajax.onreadystatechange = function () {
if(ajax.readyState == 4 && ajax.status == 200) {
document.getElementById('responseMsg').innerHTML = ajax.responseText;
}
}
ajax.send('delete=$ID');
</script>
";
}
if(isset($_GET['logout'])) {
session_destroy();
header('Location: login.php');
}
if(isset($_GET['close'])) {
$ID = $_GET['close'];
echo "
<script type='text/javascript'>
var ajax = new XMLHttpRequest();
ajax.open('POST','close.php', true);
ajax.setRequestHeader('Content-type','application/x-www-form-urlencoded');
ajax.onreadystatechange = function () {
if(ajax.readyState == 4 && ajax.status == 200) {
document.getElementById('responseMsg').innerHTML = ajax.responseText;
}
}
ajax.send('close=$ID');
</script>
";
}
?>
<br />
</div>
</body>
</html>
我的问题是,每当我单击“删除”时,ajax 响应总是出现在页面上第一个票证旁边(顶部的票证)
例如,如果我单击票证 21 旁边的“关闭”,则 AJAX 响应“票证成功关闭”将始终出现在页面上第一个票证旁边(例如票证 1)
这里是 close.php
<?php
require('../configuration/config.php');
if(isset($_POST['close'])) {
echo "Ticket Successfully Closed";
$TID = $_POST['close'];
$con->query("UPDATE tickets SET open='false' WHERE ID='$TID'");
}
并删除.php
<?php
require('../configuration/config.php');
if(isset($_POST['delete'])) {
echo "Ticket Deleted";
$TID = $_POST['delete'];
$con->query("DELETE FROM tickets WHERE ID='$TID'");
}
一如既往,我们非常感谢所有答案!提前致谢
最佳答案
您的问题位于 while
您在主页上显示未处理票证的语句。
<font style='float:right; margin-right:10px; color:green;' id='responseMsg'> </font>
首先,<font>
标签已弃用。使用另一个<div>
反而。其次,这里发生的情况是,每张票证都有一个带有 id='responseMsg'
的元素。 当 JavaScript 被要求查找 ID 为 responseMsg
的元素时,由于存在多个,它总是求助于 DOM 中的第一个。
要解决此问题,您需要使用在数据库中为票证提供的 ID。尝试这样的事情:
while ($TicketInfo = $GetTickets->fetch_object()) {
$Subject = $TicketInfo->Subject;
$ID = $TicketInfo->ID;
echo "<div class='ticket' id='ticket" . $ID . "'>" . $Subject . "...";
// Later in the ticket...
echo "<div class='ticketResponse' id='responseMsg" . $ID . "'> </div>";
}
这样您就有了 <div id='ticket1' ... >
表示的票证,和<div id='ticket2' ... >
,等等。
我注意到您使用了 <div id='ticket'>
表示每个票据对象。再次强调,这不是有效的 HTML。您应该定义一个供票证使用的 CSS 类,然后使用 <div class='ticket' ... >
附上每张票。
无论如何。进行这些更改后,您需要更改 close.php
中的响应和delete.php
以便它们可以指示已关闭或删除的工单 ID。然后,主页上的 AJAX 需要解析此响应并使用解析后的工单 ID 来将消息放在相应的票证旁边。
更改close.php
到以下内容:
if(isset($_POST['close'])) {
$TID = $con->real_escape_string($_POST['close']);
$success = $con->query("UPDATE tickets SET open='false' WHERE ID='$TID'");
if ($success) {
echo $TID . "|Ticket Successfully Closed";
}
else {
echo $TID . "|Ticket could not be closed.";
}
}
并对 delete.php
执行类似的操作。请注意,您需要在执行查询之后发送响应,因为如果查询不起作用怎么办?
最后,对于您的 AJAX...
ajax.onreadystatechange = function () {
if(ajax.readyState == 4 && ajax.status == 200) {
var response = ajax.responseText.split('|'),
id = response[0],
text = response[1];
document.getElementById('responseMsg' + id).innerHTML = text;
}
}
ajax.send('delete=$ID');
所以基本上,你会有 close.php
和delete.php
以 ID|MESSAGE
格式发送响应。然后您的 AJAX 函数获取数据,将其按 |
分割。性格,并相应地使用不同的部分。
最后,请注意我使用 mysqli::real_escape_string()
在你的close.php
文件。这修复了杰夫评论的安全缺陷。 您永远不想将用户提供的数据直接放入数据库查询中。这使您容易受到 SQL injection attacks 的攻击。 .
希望这有帮助!
关于php - AJAX响应文本显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18232358/