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 の横にある [閉じる] をクリックすると、ページの最初のチケット (チケット 1 など) の横に AJAX 応答の「Ticket Succesfully Closed」が常に表示されます。

ここに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'");
}

そしてdelete.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' ... >してすべてのチケットを囲む必要があります。

ともかく。これらの変更が行われた後、クローズまたは削除されたチケットの ID を示すことができるように、close.phpおよびからの応答を変更する必要があります。次に、メイン ページの AJAX がこの応答を解析し、解析されたチケット ID を使用してメッセージを適切なチケットの横に配置する必要があります。delete.php

次のように変更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を送信します。次に、AJAX 関数がデータを受け取り、それを文字ごとに分割し、それに応じてさまざまな部分を使用します。delete.phpID|MESSAGE|

そして最後に、mysqli::real_escape_string()あなたのclose.phpファイルでの私の使用に注意してください。これにより、Jeff がコメントしたセキュリティ上の欠陥が修正されます。ユーザーから提供されたデータを直接データベース クエリに入れたくはありません。これにより、 SQL インジェクション攻撃に対して脆弱になります。

お役に立てれば!

于 2013-08-14T13:08:53.857 に答える