使用JSON刷新数据

I am attempting to refresh comments I have on a page every three seconds. However, the code I have isn't refreshing the comments, it is basically outputting the same set of comments I have every three seconds, but it isn't using the classes or img tag I have. It is outputting this every three seconds, over and over again.

enter image description here

Does anyone have any idea why the method I am using is outputting the same set of comments instead of checking for if there is a new one?

AJAX

function commentRetrieve(){

    $.ajax({ 
            url: "ajax-php/comment-retrieve.php",
            type: "get",
            success: function (data) {
            //  console.log(data);
                if (data == "Error!") {
                    alert("Unable to retrieve comment!");
                    alert(data);
                } else {
                    var array = JSON.parse(data);
                    $(array).each(function($value) {
                        if($('#comment-container').find('#comment-' + $value.id).length == 0) {
                            $('#comment-container').prepend($value.html);
                        }
                    });
                }
            },
            error: function (xhr, textStatus, errorThrown) {
                alert(textStatus + " | " + errorThrown);
                console.log("error"); //otherwise error if status code is other than 200.
            }
        });


}
setInterval(commentRetrieve, 3000);

PHP

if ($select_comments_stmt = $con->prepare($select_comments_sql)) {
            //$select_comments_stmt->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $select_comments_stmt->execute();
            $rows = $select_comments_stmt->fetchAll(PDO::FETCH_ASSOC);
            foreach ($rows as $row) {
                $comment_id = $row['id'];
                $comment_user_id = $row['user_id'];
                $comment_username = $row['username'];
                $home_comments = $row['comment'];
                $comment_date = $row['date'];
                $commenter_user_id = $row['user_id'];
                $commenter_img = $row['img'];
                $commenter_img = '<img class="home-comment-profile-pic" src=" '.$commenter_img.'">';
                if ($home_comments === NULL) {
                    echo 'No comments found.';
                } else {
                    $html = "";
                    $html .= '<div class="comment-post-box">';
                    $html .= $commenter_img;
                    $html .= '<div class="comment-post-username">'.$comment_username. '</div>';
                    $html .= '<div>'.$comment_date. '</div>';
                    $html .= '<div class="comment-post-text">'.$home_comments. '</div>';
                    $html .= '</div>';
                    $data = array('id' => $comment_id, 'html' => $html);
                    echo json_encode($data);
                }
            }
        } else {
            echo "Error!";
        }

Comment page, with initial SELECT query to load comments on page load.

<form action="" method="POST" id="comment-form">
            <textarea id="home_comment" name="comment" placeholder="Write a comment..." maxlength="1000" required></textarea><br>
            <input type="hidden" name="token" value="<?php echo Token::generate(); ?>">
            <input id="comment-button" name="submit" type="submit" value="Post">
        </form>
        <div id="comment-container">
<?php
$select_comments_sql = "
    SELECT c. *, p.user_id, p.img
    FROM home_comments AS c
    INNER JOIN (SELECT max(id) as id, user_id 
                FROM profile_img 
                GROUP BY user_id) PI
      on PI.user_id = c.user_id
    INNER JOIN profile_img p
      on PI.user_id = p.user_id
     and PI.id = p.id
    ORDER BY c.id DESC
";

  if ($select_comments_stmt = $con->prepare($select_comments_sql)) {
        $select_comments_stmt->execute();
        if (!$select_comments_stmt->errno) {
            //echo "error";
        }
        $select_comments_stmt->bind_result($comment_id, $comment_user_id, $comment_username, $home_comments, $comment_date, $commenter_user_id, $commenter_img);
    //var_dump($select_comments_stmt);  
        $comment_array = array();
        while ($select_comments_stmt->fetch()) {
            $comment_array[] = $comment_user_id;
            $comment_array[] = $comment_username;
            $comment_array[] = $home_comments;
            $comment_array[] = $comment_date;
            $comment_array[] = $commenter_user_id;
            $comment_array[] = $commenter_img;
            $commenter_img = '<img class="home-comment-profile-pic" src=" '.$commenter_img.'">';
            if ($home_comments === NULL) {
                echo 'No comments found.';
            } else {
                echo '<div class="comment-post-box">';
                echo $commenter_img;
                echo '<div class="comment-post-username">'.$comment_username. '</div>';
                echo '<div>'.$comment_date. '</div>';
                echo '<div class="comment-post-text">'.$home_comments. '</div>';
                echo '</div>';
            }
        }
  }
?>
        </div>

You need to change the following thing in your php code:

echo '<div class="comment-post-box">'; 

with the following:

echo '<div class="comment-post-box" id="comment-'. $comment_id .'">';

Also change this following in your ajax:

if($('#comment-container').find('#comment-' + $value.id).length == 0) {

To this:

if($('#comment-' + $value.id).length == 0) {

Since a id can be just used once on a page we don't care where it is set.

Update 1

Your json code is invalid, so we need to change your php code some bit:

So change this:

foreach ($rows as $row) {
            $comment_id = $row['id'];
            $comment_user_id = $row['user_id'];
            $comment_username = $row['username'];
            $home_comments = $row['comment'];
            $comment_date = $row['date'];
            $commenter_user_id = $row['user_id'];
            $commenter_img = $row['img'];
            $commenter_img = '<img class="home-comment-profile-pic" src=" '.$commenter_img.'">';
            if ($home_comments === NULL) {
                echo 'No comments found.';
            } else {
                $html = "";
                $html .= '<div class="comment-post-box">';
                $html .= $commenter_img;
                $html .= '<div class="comment-post-username">'.$comment_username. '</div>';
                $html .= '<div>'.$comment_date. '</div>';
                $html .= '<div class="comment-post-text">'.$home_comments. '</div>';
                $html .= '</div>';
                $data = array('id' => $comment_id, 'html' => $html);
                echo json_encode($data);
            }
        }

To this:

foreach ($rows as $row) {
            $comment_id = $row['id'];
            $comment_user_id = $row['user_id'];
            $comment_username = $row['username'];
            $home_comments = $row['comment'];
            $comment_date = $row['date'];
            $commenter_user_id = $row['user_id'];
            $commenter_img = $row['img'];
            $commenter_img = '<img class="home-comment-profile-pic" src=" '.$commenter_img.'">';
            if ($home_comments === NULL) {
                echo 'No comments found.';
            } else {
                $html = "";
                $html .= '<div class="comment-post-box">';
                $html .= $commenter_img;
                $html .= '<div class="comment-post-username">'.$comment_username. '</div>';
                $html .= '<div>'.$comment_date. '</div>';
                $html .= '<div class="comment-post-text">'.$home_comments. '</div>';
                $html .= '</div>';
                $data[] = array('id' => $comment_id, 'html' => $html);
            }
        }
                echo json_encode($data);

So we make just first a array with all comments so the output will be a correct json response to the client.

Update 2:

I have changed your each function some bit:

$(array).each(function(key, value) {
                        if($('#comment-' + value.id).length == 0) {
                            $('#comment-container').prepend(value.html);
                        }
                    });

Notice the key,value in the function.

After that it was working correctly, I noticed you have to change you comment-retrieve.php since the comments where appending multiple times. You create here your comment div, but without a id. So also change in this file you comment box to echo '<div class="comment-post-box" id="comment-'. $comment_id .'">'; Then it should be working.

You can test it by inserting a new record on your database, or delete a comment in your browser by using web developer tools from your browser or a plugin like firebug.