0
<?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'");
}

一如既往地感谢所有答案!提前致谢

4

1 回答 1

0

您的问题出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.phpdelete.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.phpdelete.php发送格式为ID|MESSAGE. 然后您的 AJAX 函数获取数据,按|字符拆分,并相应地使用不同的部分。

最后,请注意我mysqli::real_escape_string()在您的close.php文件中的使用。这修复了 Jeff 评论的安全漏洞。您永远不想将用户提供的数据直接放入数据库查询中。这使您容易受到SQL 注入攻击

希望这可以帮助!

于 2013-08-14T13:08:53.857 回答