Как печатать каждый комментарий с Вашим post?

У меня есть маленькая система делания posts в моем сайте, который я создаю. Каждый posts я это печатаю с "echo" PHP.

Все функционирует чуда сначала (печатать это). Но проблема появляется, когда я пробую высказывать его этому post мнения.

Какова проблема?

Когда я пишу первый этот комментарий, он оставляет себе Ваш post, но когда я пишу второй комментарий в этом же самом post, случается, что, вместо того, чтобы второй комментарий выходит под первым, он клонирует меня или меня печатает другой post с этим комментарием (второй.) не, если они понимают.

Таблица Ты Являешься лично

   -------   -------    ----------    ---------    --------   --------
    ID      nombre      apellido     correo       password    Fotos
   ------    ------     ---------     --------     --------    ------

Таблица Posts

        -------   -------    ----------    ---------    
        Id_post    User_Id    Titulo        Contenido     
         ------    ------     ---------     --------     

Таблица комментарии

     -------   ---------    ----------   ---------     --------   
     id_com    contenido      fecha      id_usuario    id_post    
     ------    --------     ---------     --------     --------    

Таблица posts_votos

     -------   ---------    ----------   ---------     --------   
     Id        Id_post      id_usuario    puntos        fecha
     ------    --------     ---------     --------     --------    

Я помещу код:

Поскольку они могут видеть, я делаю консультацию 3 подмостков используя Join.

  $query_buscar_posts = mysqli_query($conn, " SELECT 
      posts.Id_post, 
      posts.Titulo, 
      posts.Contenido, 
      personas.Id,
      personas.Fotos,
      personas.nombre,
      personas.apellido,
      posts_votos.id_usuario,
      posts_votos.puntos,
      posts_votos.id_post,
      comentarios.contenido
 FROM posts
 LEFT JOIN  comentarios
   ON comentarios.id_post = posts.Id_post AND posts.User_Id = 
       comentarios.id_usuario


 LEFT JOIN  posts_votos
   ON posts_votos.id_post = posts.Id_post AND posts.User_Id = 
      posts_votos.id_usuario

LEFT JOIN personas
   ON posts.User_Id = personas.Id
     WHERE posts.User_Id = $my_id ORDER BY id DESC") or die('Error: ' . 
   mysqli_error($conn));




  while ($posts_filas = mysqli_fetch_array($query_buscar_posts)) {


       $id_user = $posts_filas['Id'];
       $code = $posts_filas['Id_post'];
       $title = $posts_filas['Titulo'];
       $contenido  = $posts_filas['Contenido'];
       # code...
       $contenido2  = $posts_filas['contenido'];
      $points  = $posts_filas['puntos'];

Отсюда печатается каждый post:

  echo '

'. $posts_filas['nombre'].' '.$posts_filas['apellido'].'

' . htmlentities($title) . '
' .'
' . htmlentities($contenido) .'
' . '
' .'
' .'
'.'

'.$posts_filas['contenido'].'

' .'
' .'
#
' .'
'; } $contar = mysqli_num_rows($query_buscar_posts); if($contar == 0) { echo "
Aun no has puesto nada aqui!

Editar mi perfil Ir a mi perfil
"; } ?>

Каждый post, который я печатаю, видит нечто похожее:

introducir la descripción de la imagen aquí

Но проблема находится в комментариях. Первый выходит согласно post, что я поместил это ему, и второй печатает мне другой равный post, вещь, которая не была бы должна быть такой.

3
задан 19.11.2016, 01:19
3 ответа

Хорошие, мы будем видеть, как ты просишь, чтобы я это собрал в двух консультациях, одной для posts и Вашего info, и другой для комментариев. Я присоединяю тебя полный код, возможно, что есть какая-то ошибка синтаксиса, так как я не php, и также не возможно пытаться без подмостков, так что он пытается, и ты комментируешь мне, чтобы видеть, что он выходит у тебя.

<?php
$query_buscar_posts = mysqli_query($conn, " SELECT posts.Id_post, posts.Titulo,  posts.Contenido, personas.Id, personas.Fotos,personas.nombre,personas.apellido,posts_votos.id_usuario, posts_votos.puntos,posts_votos.id_post
                                            FROM posts
                                            LEFT JOIN  posts_votos
                                                ON posts_votos.id_post = posts.Id_post AND posts.User_Id = posts_votos.id_usuario
                                            LEFT JOIN personas
                                                ON posts.User_Id = personas.Id
                                            WHERE posts.User_Id = $my_id ORDER BY id DESC"
 ) or die('Error: ' . mysqli_error($conn));



$query_buscar_comentarios = mysqli_query($conn, "SELECT comentarios.contenido
                                                 FROM posts
                                                 LEFT JOIN  comentarios
                                                    ON comentarios.id_post = posts.Id_post AND posts.User_Id = comentarios.id_usuario
                                                 WHERE posts.User_Id = $my_id 
                                                 ORDER BY id DESC"
) or die('Error: ' . mysqli_error($conn));

    $contar = mysqli_num_rows($query_buscar_posts);
    if($contar == 0) {
        echo "<div class='No_post'>
                <div class='message_empty_post'>Aun no has puesto nada aqui!</div><br>
                <div class='contenido_no_post'>
                    <i class='fa fa-frown-o' aria-hidden='true'></i>
                </div>
                <div class='footer_empty_post'>
                    <a href=''>Editar mi perfil</a>
                    <a href=''>Ir a mi perfil</a>
                </div>
              </div>";
    }else{
         while ($posts_filas = mysqli_fetch_array($query_buscar_posts)) {


               $id_user = $posts_filas['Id'];
               $code = $posts_filas['Id_post'];
               $title = $posts_filas['Titulo'];
               $points  = $posts_filas['puntos'];
               $contenido  = $posts_filas['Contenido'];
               $comentarios=array();
               while ($comentarios_filas = mysqli_fetch_array($query_buscar_comentarios)) {
                    array_push($comentarios,$comentarios_filas['contenido'];);
               }

              $post='<div style ="margin-bottom:20px;" class="POSTED">'. 
                  '<div class="post_p1">'.
                    '<div class="Header_post">'.
                        '<div class="orden_post">'.
                            '<div class="orden_post_content">'.
                                '<a href="#"><p class="aaaaa">'. $posts_filas['nombre'].' '.$posts_filas['apellido'].'</p></a>'.
                            '</div>'.
                            '<div class="orden_post_content_pic">'.
                                '<a href="perfil.php?=id"><img width="50px" height="50px" src="'. $posts_filas['Fotos'].'"> </img></a>'.
                            '</div>'.
                       '</div>'.
                       '<div class="boton_eliminar_post">'.
                           '<a href="javascript:void(0)"><i class="fa fa-minus" aria-hidden="true"></i></a>'.
                       '</div>'.
                    '</div>'.
                    '<div class="post_titulo">' . htmlentities($title) . '</div>'.
                    '<div class="post_contenido">'.
                        '<div class="post_contenido_content">' . htmlentities($contenido) .'</div>'.
                    '</div>'.
                    '<div class="points_post">'.
                        '<div class="content_points">'.
                            '<div class="orden_post">'.
                                '<div class="orden_post_content">'.
                                    '<a href="javascript:void(0)">'.
                                        '<span>'.
                                            '<i style="font-size:24px;" class="fa fa-sun-o" aria-hidden="true"></i>'.
                                        '</span>'.
                                    '</a>'.
                                '</div>'.
                                '<div id="share_link" class="orden_post_content">'.
                                    '<a href="javascript:void(0)" >'.
                                        '<i class="fa fa-share-square" aria-hidden="true"></i>Compartir'.
                                    '</a>'.
                                '</div>'.
                                '<div class="orden_post_content">'.
                                    '<a href="javascript:void(0)">'.
                                        '<span>'.$posts_filas['puntos']. '</span>globos'.
                                    '</a>'.
                                '</div>'.
                            '</div>'.
                       '</div>'.
                    '</div>'.
                    '<form id="form_comentarios" method="POST">'.
                        '<ul style="padding:0;">'.
                            '<li class="alinear_elementos_post">'.
                                '<input type="hidden" name="eid" value="'.$posts_filas['Id_post'].'">'.
                                '<img width="35px" height="35px" src="'.$posts_filas['Fotos'].'"> </img> '.
                            '</li>'.
                            '<li id="textbox-align" class="alinear_elementos_post">'.
                                '<input type="text" class="campo_comentario" name="comment_content" rows="2" cols="44" style="text-align:center;" placeholder="Escribe un comentario." required></input>'.
                            '</li>'.
                            '<li class="alinear_elementos_post">'.
                                '<input class="boton_campo_comentario" type="submit" name="comentar"></input>'.
                            '</li>'.
                        '</ul>'.
                    '</form>';

                    for($x = 0; $x < count($comentarios); $x++) {
                        $post=$post.'<p class="aaaaa"> '.$comentarios[$x].'</p><br>';
                    }

                    $post=$post.'</div>'.
                 '<div class="post_p2">'.
                    '<a onclick="('.$posts_filas['Id_post'].')" data-id='.$posts_filas['Id_post'].' href="javascript:void(0)" class="globes_post_giving">'.
                        '<div class="alinear_boton_balloons">'.
                            '<img class="img_style" src="img/globo-s.png"></img>'.
                        '</div>'.
                    '</a>'.
                    '<a href="#" class="globes_post_res">#</a>'.
                 '</div>'.
                '</div>';

                echo $post;
            }      
       }


?>
3
ответ дан 24.11.2019, 12:36
  • 1
    Я попробую тестировать этот có я говорю, хотя уже я считаю это осуществленным другой формы (называя комментарии к модальному, костлявому окну, комментариям segú n posts, который я выбрал).Pero, не больше тестирования этого có я говорю. Спасибо!!! – luis 23.11.2016, 21:53
  • 2
    Если оно ты функционирует и тебе нравится, помечает как получающий ответ ;) и если не, это всегда удовольствие помогать. – Hictus 25.11.2016, 11:51

Чтобы разделять query на две части, я сделал бы это таким:

Сначала я получаю все posts и Ваши связанные обеты:

// Obtienes todos los posts y sus campos
$query_posts = 
  "SELECT
    *
  FROM
    posts AS P
  JOIN
    posts_votos AS PV
  ON
    P.id_post = PV.id_post
  WHERE
    P.user_id = $_SESSION[user_id]"; 
// O de donde quiera que almacenes la identificación del ususario o.O

$result_posts = mysqli_query($conn, $query_posts);

Потом я пробегаю один в один с while. Из-за каждого повторения while, я делаю другую консультацию sql, чтобы получать комментарии и пользователей, связанных с post, который пробегает цикл:

while ($post_row = mysqli_fetch_array($result_posts)) {

  $query_comentarios = "
    SELECT
      *
    FROM
      comentarios AS C
    JOIN
      personas AS P
    ON
      C.id_usuario = P.id_personas
    WHERE
      C.id_post = $post_row[id_post]";

    $result_comentarios = mysqli_query($conn, $query_comentarios);

    // Este array almacenará todos los comentarios del post actual del primer while
    $array_comentarios = array();

    while ( $comentario_row = mysqli_fetch_array($result_comentarios) ) {
      array_push($array_comentarios, $comentario_row);
    }

  // Aquí imprimes el post y sus comentarios 

До сих пор уже ты получаешь информацию, сейчас только должен печатать ее. Я вижу, что у тебя есть много html, и там ты вводишь php. В этой точке, где я поместил комментарий "Здесь ты печатаешь" ты разместил бы твой html.

Правда состоит в том, что это spaguetti и не является эстетическим код, может быть считай делать вторую версию того же самого, где ты старался отделять самое возможное html и php.

Что-то, что ты мог бы осуществлять, состоит в том, чтобы отделять действия из-за функций. А именно, создавать функцию, чтобы получать все posts, другую, чтобы получать комментарии:

function get_all_posts(){
  $$query_posts = 
  "SELECT
    *
  FROM
    posts AS P
  JOIN
    posts_votos AS PV
  ON
    P.id_post = PV.id_post";

  $result_posts = mysqli_query($conn, $query_posts);

  return $result_posts;
}

function get_coments( $id_post){
  $query_comentarios = "
    SELECT
      *
    FROM
      comentarios AS C
    JOIN
      personas AS P
    ON
      C.id_usuario = P.id_personas
    WHERE
      C.id_post = $id_post";

    $result_comentarios = mysqli_query($conn, $query_comentarios);

    return $result_comentarios;
}

Здесь ты включаешь функции, если ты хочешь отделить их в отдельном файле.

$result_posts = get_all_posts();

while ($post_row = mysqli_fetch_array($result_posts)) {

  $result_comentarios = get_coments($post_row[id_post]);

  $array_comentarios = array();

  while ( $comentario_row = mysqli_fetch_array($result_comentarios) ) {
    array_push($array_comentarios, $comentario_row);
  }

  // Imprimes el post y sus comentarios 

}

И как я говорю тебе, уже только ты добавляешь html, который ты хочешь напечатать. Если у тебя есть сомнения, ты комментируешь. Привет.

Заметь: Для того, чтобы каждый комментарий был показан post, который соответствует, проверяет, что, введя это, он это делал с id post в вопросе, а он это напечатает, где он не, если он состоит в том, что он это печатает.

Я издал первый query ($ query_posts), чтобы получать обеты, связанные с post.

3
ответ дан 24.11.2019, 12:36
  • 1
    .Disculpa, но есть поля, которые не консультируют, из-за ejemplo:nombre, фамилию, Фотографии – luis 19.11.2016, 00:43
  • 2
    Кроме того забудьте поместить другую таблицу, но которая в консультацию SQL, которую я поместил сначала, помещены эти поля. Таблица называется Posts_votos – luis 19.11.2016, 00:58
  • 3
    Ok, на полях, в консультациях está звездочка (*), то есть будь должен возвращать все поля снабженных ссылками подмостков. Ты можешь делать тест с query в phpmyadmin, или в котором esté s используя, чтобы выполнять прямо query. И другой не упомянутой таблицы, уже я увидел ее, ¿ Có mo он harí схвати, если уже está s получая все posts и комментарии? Haré изменение в ответе. – J.Correa 19.11.2016, 01:05
  • 4
    я получаю все post, но пустоту. – luis 19.11.2016, 01:13
  • 5
    Я не увидел ее. Я реализовал có я говорю segú n то, что entendí в действительности он не difí cil то, что ты хочешь сделать, só ты это нуждаешься в беглом просмотре в SQL. Если у тебя есть все твои подмостки, связанные с ключами, получать informació n каждой он относительно fá cil. Однако, мое отсутствие comprensió n твоего petició n он не позволяет мне давать удовлетворительный ответ, как кажется :( Удача с этим, приветом. – J.Correa 19.11.2016, 01:40

Если ты не хочешь отделить твою консультацию SQL в двух консультациях различных SQL, ты должен осуществлять какой-то метод, чтобы обнаруживать "новые сообщения":

$anterior = false;
while ($posts_filas = mysqli_fetch_array($query_buscar_posts)) {
  $id_user = $posts_filas['Id'];
  $code = $posts_filas['Id_post'];
  $title = $posts_filas['Titulo'];
  $contenido  = $posts_filas['Contenido'];
  /* Resto de código de asignación de variables */
  if ($anterior !== $code) 
    $anterior = $code;
    /* Aquí enviamos al navegador el HTML sólo del mensaje */
    echo '<div style ="margin-bottom:20px;" class="POSTED">...'; /* etc */
  }
  /* Ahora enviamos el HTML sólo de una respuesta */
  echo '<p class="aaaaa"> ',
    htmlspecialchars($posts_filas['contenido']),
    '</p>'; /* etc */
}

В твоем случае просто осуществлять это, потому что нет "отца", который содержал бы как в сообщение, так и в комментарии, в противоположном случае было бы нужно создавать добавочный код, чтобы противостоять этому недостатку.

Все же есть альтернативный метод, который состоял бы в том, чтобы делать одну первой перемещенная данные, возвращенные твоей консультацией, чтобы сохранять их в ассоциативном массиве, где первый уровень был сообщением, и элемент его содержал комментарии:

$datos = [];
while ($posts_filas = mysqli_fetch_array($query_buscar_posts)) {
  $id_user = $posts_filas['Id'];
  if (!isset($datos[$id_user])) {
    $datos[$id_user]['code'] = $posts_filas['Id_post'];
    $datos[$id_user]['title'] = $posts_filas['Titulo'];
    /* etc ... */
  }
  $datos[$id_user]['contenido'][]  = $posts_filas['Contenido'];
}

Таким образом у тебя будет элемент в $datos из-за каждого сообщения и элемента в индексе contenido из-за каждого комментария. С двумя foreach (один для сообщений и другого для комментариев каждого сообщения) ты мог бы производить HTML твоего форума.

2
ответ дан 24.11.2019, 12:36
  • 1
    Тогда С первым mé все я будет функционировать? Он не повторит мне posts? – luis 15.11.2016, 14:29
  • 2
    С первым mé совсем не ты repetirá posts, так как в случае, если повторится тот же самый Id_post нарушает часть, в которой он возвращается в " pintar" HTML post и só это красит HTML комментария. – OscarGarcia 15.11.2016, 20:27
  • 3
    в этой линии:---------------------------------------------------------я начинаю ' < form пойдите =" form_comentarios" method =" POST" >...';/* и т.д. */---------он, где я печатаю неудар в лунку, чтобы высказывать мнения post и изюму, что каждый раз, когда esribo комментарий выходит новый неудар в лунку рядом с этим комментарием, как договоренность это? – luis 16.11.2016, 03:45
  • 4
    Друг я думаю делать это более легким (думаю), что.En раз способствования тому, чтобы комментарии вышли под каждым post, я включу кнопку, которую clicar откроет модальный с комментариями этого post. Я думаю, что он более организован, но не больше, чем мне muestresun пример с двумя консультациями SQL. – luis 16.11.2016, 04:53
  • 5
    Я, лично, предпочитаю работать со второй solució n, потому что я обычно использую Twig для " pintar" HTML, а следовательно внутри шаблона я осуществляю секции и подразделы (например бойся и Ваши комментарии) как два цикла foreach укрытых. Я издал мой ответ, чтобы исправлять тему формуляра, он смущен интерпретировать твой HTML и определять ясно Ваши блоки, потому что tabulació n использованная не я ayudó много. Я издаю: как только у него была пустота я помещаю тебе пример, осуществленный с двумя независимыми консультациями. – OscarGarcia 16.11.2016, 07:41