【问题标题】:How does the logic of a reply section work with PHP and MySQL?回复部分的逻辑如何与 PHP 和 MySQL 一起使用?
【发布时间】:2018-08-18 09:47:02
【问题描述】:

我正在尝试在我的网站上的消息论坛中创建一个回复部分。下面是我的代码,将被分段引用,以让读者充分了解我在哪里以及我的问题是什么(我意识到这篇文章对观众来说很长,但我尽力做到准确和详细可能)。`

<?
   $sqlMessage = "SELECT * FROM messages GROUP BY message_number";
    $resultMessage = mysqli_query($conn, $sqlMessage);
     if(mysqli_num_rows($resultMessage) > 0) {
      while($rowMessagesDetails=mysqli_fetch_assoc($resultMessage)) {
        $messageUsername = $rowMessagesDetails['username'];
        $messageMessage = $rowMessagesDetails['message'];
        $message_number = $rowMessagesDetails['message_number']; // using this number for the next part to find the replies
        $messageDate = $rowMessagesDetails['date'];

        //Getting ALL replies that match the message_number in the MESSAGES table
        $sqlReply = "SELECT * FROM replies WHERE message_number='$message_number' ORDER BY date DESC";
        $resultReply = mysqli_query($conn, $sqlReply);
            if(mysqli_num_rows($resultReply) > 0) {
            while($rowReplyDetails=mysqli_fetch_assoc($resultReply)) {
                $replyUsername = $rowReplyDetails['username'];
                $replyMessage = $rowReplyDetails['message'];
                $replyDate = $rowReplyDetails['date'];

                echo '<div class="user-details-box">
                            <div class="user-username">'.$messageUsername.'</div> 
                            <div class="user-date">'.$messageDate.'</div>
                        </div>
                        <div class="user-message">'.$messageMessage.'</div> 
                        <div class="reply-section"> 
                            <div class="replies">
                                <p class="reply-link-button left-replies">Reply&nbsp;</p>
                                <p class="bullet left-replies">&bull;</p>
                                <p class="show-replies-link left-replies">&nbsp;Show All Replies</p>
                            </div> 
                            <div class="reply-details-box"> 
                                <div class="user-replies-box">
                                    <div class="reply-username">'.$replyUsername.'</div> 
                                    <div class="reply-date">'.$replyDate.'</div> 
                                </div>
                                <div class="reply-message">'.$replyMessage.'</div>
                            </div>
                            <form class="open-textbox" id="reply-form" action="reply.php" method="post">
                                <input type="hidden" class="message_number" name="message_number" value="'.$message_number.'">
                                <div class="right-reply">
                                    <textarea id="getReply" class="insert-reply" name="reply" placeholder="Reply."></textarea>
                                    <div class="right-reply-btn">
                                        <button id="reply-link" class="reply-link" type="submit" name="submit">Reply</button>
                                    </div>
                                </div>
                            </form>
                        </div>';
                    } 
                }
            }
        }
?>`

问题是,我正试图弄清楚我需要做什么来专门针对发布评论的用户查询回复;并将回复堆栈放在下面。我制作了一个 REPLIESMESSAGES 表,每个表都有一个执行此操作的 message_number(使用 example 输入进行解释) :

MESSAGES TABLE 
message_number: 1 //useful primary that we'll use in the REPLIES table
username: BuzzLightyear2018
message: Star Command do you read me?
date: 3/9/2018

REPLIES TABLE
reply_id: 1 //random primary to keep rows unique
message_number: 1 //foreign key from MESSAGES that connect the message with the reply 
username: CowboyWoody2018
reply: No, but I've got a stick in my boot!
date: 3/9/2018

如何REPLIES 表中的 message_numberMESSAGES 中的 message_number 匹配 表格并在此处显示所有回复下方消息:

<div class="reply-details-box"> 
  <div class="user-replies-box">
    <div class="reply-username">**username from REPLIES here**</div> 
      <div class="reply-date">**date from REPLIES here**</div> 
  </div>
  <div class="reply-message">**message from REPLIES here**</div>
</div>

重申一下: 我希望所有 回复 堆叠在来自 MESSAGES 的消息下方;尝试查询 $sqlMessage = "SELECT * FROM messages GROUP BY message_number"$sqlReply = "SELECT * FROM replies WHERE message_number='$message_number' ORDER BY date DESC " 如下图所示:

This shows the same message twice because it's querying each reply to each message 有什么建议?提前谢谢你。

【问题讨论】:

  • SELECT * FROM messages GROUP BY message_number ??如果message_number 是主键,它将是唯一的,所以这对于 GROUP BY 来说是没有必要的。 ...但无论如何,您得到主消息的欺骗的原因是主消息 html 位于回复的 while 循环内。需要把它移到上面。
  • @IncredibleHat 我同意。它不会通过分组来改变任何东西。我想我前几天在尝试分组时把它留在那里了。无论如何,如果我要取出主要消息并将其放在循环之上,那么它如何生成循环中的所有消息?我必须在循环中使用它才能用 MESSAGE 详细信息吐出每个单独的 div 对吗?
  • @IncredibleHat 哦,我现在明白了!感谢您的快速回复!
  • 我在写一个例子,但 mtr.web 先写了。你将它移到嵌套的while 之外,但仍然在第一个while 内。
  • 是的。你的第一行代码是荒谬的。这不是好兆头。

标签: php mysql mysqli messages forum


【解决方案1】:

@IncredibleHat 在这两点上都是正确的。您应该能够删除GROUP BY 并获得相同的结果。此外,代码的 PHP 部分如下所示:

<?
   $sqlMessage = "SELECT * FROM messages GROUP BY message_number";
    $resultMessage = mysqli_query($conn, $sqlMessage);
     if(mysqli_num_rows($resultMessage) > 0) {
      while($rowMessagesDetails=mysqli_fetch_assoc($resultMessage)) {
        $messageUsername = $rowMessagesDetails['username'];
        $messageMessage = $rowMessagesDetails['message'];
        $message_number = $rowMessagesDetails['message_number']; // using this number for the next part to find the replies
        $messageDate = $rowMessagesDetails['date'];

        echo '<div class="user-details-box">
                            <div class="user-username">'.$messageUsername.'</div> 
                            <div class="user-date">'.$messageDate.'</div>
                        </div>
                        <div class="user-message">'.$messageMessage.'</div>'
                    '<div class="reply-section"> 
                            <div class="replies">
                                <p class="reply-link-button left-replies">Reply&nbsp;</p>
                                <p class="bullet left-replies">&bull;</p>
                                <p class="show-replies-link left-replies">&nbsp;Show All Replies</p>
                            </div>';


        //Getting ALL replies that match the message_number in the MESSAGES table
        $sqlReply = "SELECT * FROM replies WHERE message_number='$message_number' ORDER BY date DESC";
        $resultReply = mysqli_query($conn, $sqlReply);
            if(mysqli_num_rows($resultReply) > 0) {
            while($rowReplyDetails=mysqli_fetch_assoc($resultReply)) {
                $replyUsername = $rowReplyDetails['username'];
                $replyMessage = $rowReplyDetails['message'];
                $replyDate = $rowReplyDetails['date'];

                echo      '<div class="reply-details-box"> 
                                <div class="user-replies-box">
                                    <div class="reply-username">'.$replyUsername.'</div> 
                                    <div class="reply-date">'.$replyDate.'</div> 
                                </div>
                                <div class="reply-message">'.$replyMessage.'</div>
                            </div>';
                    }
                }

                          echo '<form class="open-textbox" id="reply-form" action="reply.php" method="post">
                                <input type="hidden" class="message_number" name="message_number" value="'.$message_number.'">
                                <div class="right-reply">
                                    <textarea id="getReply" class="insert-reply" name="reply" placeholder="Reply."></textarea>
                                    <div class="right-reply-btn">
                                        <button id="reply-link" class="reply-link" type="submit" name="submit">Reply</button>
                                    </div>
                                </div>
                            </form>
                        </div>';
            }
        }
?>

【讨论】:

  • 我的声望低于 15,否则我会通过我的上限对您的回复进行投票。谢谢你们!
  • 我不知道您是否可以回答这个相关问题(我不知道相关主题的所有规则 - 附加问题,而不是创建新问题),但是 DOM 现在是如何工作的我们在查询之间拆分了代码?我所有消息上的“显示回复”和“回复”按钮现在只会触发打开最后一个查询。 DOM 路径不再起作用。 $('.reply-link-button').click(function() { $('form').toggle('slow'); $(this).parent().next().next('form' ).toggle('slow'); });
  • 我只添加了一个功能,因为帖子越来越长了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 2019-10-14
相关资源
最近更新 更多