php - AJAX响应文本显示

标签 php javascript mysql ajax

<?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.phpdelete.phpID|MESSAGE 格式发送响应。然后您的 AJAX 函数获取数据,将其按 | 分割。性格,并相应地使用不同的部分。

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

希望这有帮助!

关于php - AJAX响应文本显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18232358/

相关文章:

javascript - Node.js Socket.io mysql 返回重复项

python - Django - 将 ForeignKey 关系更改为 OneToOne

Android:将 mysql(XAMPP) 连接到模拟器上的 android 应用程序

php - 使用ajax post请求发送两个数组

php - AFNetworking 将 UIImage 上传为 NSData -> PHP 脚本移动文件

javascript - jquery:使用字符串作为函数(错误:字符串不是函数)

javascript - map JavaScript API : How to determine the screen position of markers/objects

php - Android JSON 与 Volley 和 PHP 输入结束于字符 0

php - CakePHP 2.4 - 数据库更新不保存所有传递的数据一个字段永远不会持久化

php - 无法从 MySQL 数据库获取行