Система комментариев: JavaScript не «возвращает» правильный comment_Id - PullRequest
0 голосов
/ 11 июня 2019

Я создаю базовую систему комментирования для веб-сайта: комментарии могут быть сделаны, и пользователи могут отвечать на каждый комментарий.Я использую Ajax для отправки и получения / отображения комментариев и ответов.Я успешно закодировал часть комментариев, но мне нужна помощь в части ответов.

Каждый комментарий, хранящийся в базе данных, имеет уникальный идентификатор (comment_id), связанный с ним.И я использую этот идентификатор, чтобы связать ответы на каждый соответствующий комментарий.

Форма для комментариев, которая находится в index.php :

<div id="showComments"></div> <!--div where comments are inserted by AJAX-->
<div style="text-align:center;">
    <form action="" method="post" id="commentForm">                             
        <textarea  name="comment" id="comment" rows="1"></textarea><BR>                                             
        <button type="submit" name="new_comment" onClick="submitComment()">Comment</button>                                                             
    </form>
    <div id="message"></div> <!--div where a status (comment submitted successfully or failed) is inserted by AJAX-->
</div>

JavaScript для отправки комментария и отображения комментариев, также в index.php .

<script>

$(document).ready(function() {
    showComments();
});

function submitComment(){
var commentText =  document.getElementById('comment').value;
var commentString = 'comment=' + commentText;

event.preventDefault();

$.ajax({
  url: "insert_com.php",
  method: "POST",
  data: commentString,
  dataType: "JSON",
  success: function(response) {
    if (!response.error) {
      $("#commentForm")[0].reset();   
      $("#message").html(response.message);
      showComments();
    } else if (response.error) {
      $("#message").html(response.message);
    }
  }
});
}

function showComments() {

  $.ajax({
    url: "get_com.php",
    method: "POST",
    success: function(response) {
      $("#showComments").html(response);
    }
  });
}

</script>

Файл insert_com.php , который отправляет комментарий в базу данных, куда AJAX отправляет сообщения в функции submitComment():

<?php 
if(!empty($_POST["comment"])){
    $new_com_date = date('Y-m-d H:i:s');
    $insertComment = "INSERT INTO comments (text, date) VALUES ('".$_POST["comment"]."', '".$new_com_date."')";
    mysqli_query($connect, $insertComment) or die("database error: ". mysqli_error($connect));  
    $message = '<label>Comment posted Successfully.</label>';
    $status = array(
        'error'  => 0,
        'message' => $message
    );  
} else {
    $message = '<label>Error: Comment not posted.</label>';
    $status = array(
        'error'  => 1,
        'message' => $message
    );  
}
echo json_encode($status);
?>

И файл get_com.php , который извлекает и отображает комментарии , но также извлекает ответы и содержит форму для отправки ответов

<?php 
    require 'php/connect.php';
    $comment =  mysqli_query($connect, "SELECT * FROM `comments` ORDER BY `date` DESC");
    $string ="";

    foreach($comment as $item) {
        $date = new dateTime($item['date']);
        $date = date_format($date, 'M j, Y | H:i:s');        
        $comment = $item['text'];
        $comment_id = $item['id'];       

        $string .= '<div style="text-align:center;">' 
                .'<div id="'.$comment_id.'" style="text-align:center;">'                        
                    .'<span><b>'.$comment.'</b></span>&nbsp'
                    .'<span><b>'.$date.'</b></span>&nbsp;'
                    .'<span><b>'.$comment_id.'</b></span>'
               .'</div>';

               $reply = mysqli_query($connect, "SELECT * FROM `replies` WHERE `comment_id`='$comment_id' ORDER BY `date` DESC");

                foreach($reply as $com) {
                    $reply_date = new dateTime($com['date']);
                    $reply_date = date_format($reply_date, 'M j, Y | H:i:s');                    
                    $reply_com = $com['text'];
                    $com_id = $com['comment_id'];                    

                    $string.= '<div>'                           
                                .'<span>'.$reply_com.'</span>&nbsp;'
                                .'<span class="time">'.$reply_date.'</span>&nbsp;'
                                .'<span><b>'.$com_id.'</b></span>' 
                            .'</div>';              
                }

                $string .= 

                '<div>'                   
                    .'<form action="" method="post" id="replyForm">'
                        .'<textarea name="new-reply" id="new-reply" rows="1"></textarea>'
                        .'<input type="hidden" id="com_id" name="com_id" value="'.$comment_id.'"/>'
                        .'<button type="submit" id="form-reply" name="new_reply" onClick="submitReply()">Reply</button>&nbsp;'
                        .'<span><b>'.$comment_id.'</b></span>'                      
                    .'</form>'
                    .'<span id="replymessage"></span>'
                .'</div>'

            .'</div>'
            .'<hr style="width:300px;">';


    }
    echo $string;
?>

Теперь вот в чем проблема. Я хочу использовать AJAX для отправки ответа на конкретный комментарий с идентификатором $comment_id.Я хочу получить этот идентификатор из скрытого ввода, содержащегося в форме ответа (форма с идентификатором replyForm.

. Я написал следующий код JavaScript для получения идентификатора, принадлежащего определенному комментарию:

<script>
function submitReply(){

var replyText =  document.getElementById('new-reply').value; console.log(replyText);
var commId = document.getElementById('com_id').value; console.log(commId);

event.preventDefault();
...
</script>

Как вы можете видеть, я записываю текст формы (ответ) и идентификатор комментария в консоль, чтобы увидеть, собираю ли я правильные данные, но он всегда возвращает идентификатор последнего отправленного комментария (т.е.Форма ответа работает для последнего комментария. JavaScript регистрирует правильный текст и идентификатор комментария для ответа на последний комментарий, но для всех остальных ответов он возвращает текст ответа на последний комментарий и идентификатор последнего комментария.

Я знаю, что это довольно много кода, поэтому, если кто-нибудь еще сможет мне помочь, это, безусловно, будет оценено.

1 Ответ

0 голосов
/ 11 июня 2019

У вас есть более одного элемента с id="com_id". id должно быть уникальным. Что вы можете сделать, это когда вы генерируете DOM в get_com.php вместо

'<input type="hidden" id="com_id" name="com_id" value="'.$comment_id.'"/>'
'<button type="submit" id="form-reply" name="new_reply" onClick="submitReply()">Reply</button>&nbsp;'

Вы можете позвонить submitReply() с правильным ID, например, так:

'<button type="submit" id="form-reply" name="new_reply" onClick="submitReply('.$comment_id.')">Reply</button>&nbsp;'

Тогда идентификатор комментария будет аргументом вашего submitReply метода, и вам не нужно будет читать его из поля ввода.

<script>
  function submitReply(commId){

    var replyText =  document.getElementById('new-reply').value; 
    console.log(replyText);
    console.log(commId);

    event.preventDefault();
  ...
</script>

У вашего <textarea> такая же проблема. Я предлагаю назначить уникальный идентификатор вашему <textarea>, например, "reply-'.$comment_id.'". Затем, когда вызывается submitReply(comment_id), вы знаете, какой идентификатор комментария является вызовом, поэтому вы можете создать уникальный идентификатор для точно такой же текстовой области и получить значение нужного элемента.

<script>
  function submitReply(commId){

    var replyText =  document.getElementById('reply-' + commId).value; 
    console.log(replyText);
    console.log(commId);

    event.preventDefault();
  ...
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...