2

我正在尝试创建一个类似于 facebooks 墙的 PHP 评论系统,但每个帖子只有 1 级回复。

我想要这种格式:

Post 1

Response 1
Response 2
Response 3

Add comment box

----------

Post 2
Response 1
Response 2
Response 3

Add comment box

但是,我目前的代码会产生以下结果:

Post 1
Response 1

Add comment box

Post 1
Response 2

Add comment box
----------------
Post 2
Response 1

Add comment box

---------------

Post 2
Response 1

Add comment box

---------------

我想循环遍历结果,以便每次循环时,帖子消息都不会与与该帖子相关的行中的下一条评论一起打印。所以它应该循环一次主消息,打印它,然后通过循环在下面发布所有相应的评论。

表结构

帖子
  • p_id=该帖子的编号
  • user_id=他们发布的用户
  • poster_user_id= 发帖人
  • post
评论
  • comment_id=该评论的数量
  • post_id=评论相关的帖子编号
  • commenter_user_id= 发表评论的人
  • comment

代码

$query = "SELECT posts.p_id, comments.post_id, posts.poster_id,
      posts.user_id, message, `comments.commenter_user_id, comments.comment`
    FROM posts, comments
    WHERE posts.p_id = comments.post_id";
$query_run = mysql_query($query) or die(mysql_error());

while ($query_row = mysql_fetch_assoc($query_run)) {
    $pid = $query_row['p_id'];
    $post_id = $query_row['post_id'];
    $poster_id = $query_row['poster_id'];
    $user_id= $query_row['user_id'];
    $message = $query_row['message'];
    $commenter_user_id = $query_row['commenter_user_id'];
    $comment = $query_row['comment'];

    echo "
      <div id=\"post\">
        Post $pid $post_id Poster: $poster_id  Mentions: $user_id 
        <br><br> $message <br><br> 

        <ul class=\"comment\">
            $commenter_user_id 
            <li> $comment </li>
        </ul>

        <form name=\"message\" method=\"post\" action=\"sendmessage.php\">
        <textarea name=\"message\"></textarea> <br>
        <input type=\"submit\" value=\"Send\" /></form>
      </div>
      <br>";
}

关于如何产生预期结果的任何建议?我知道通过改变我的逻辑可能很容易解决这个问题,但我刚刚开始学习。您对此的帮助将不胜感激!

更新

谢谢大家的帮助。我已经合并了您的代码示例的各个方面,并且效果很好。

还有一个问题:

上面提到的每一个都包含一个评论。发表评论后,我希望评论表使用新帖子进行更新。当我发表评论时,如何获取每个特定帖子的 post_id 和 commenter_user_id 变量,以便我可以使用该数据对评论表执行插入查询,如下所示:

INSERT INTO `comments`SET
    `post_id` = $post_id
    'commenter_user_id = $_SESSION['commenter_user_id'] " (I was thinking sessions?)

我正在考虑通过将变量通过 url 传递到脚本页面来获取数据:

    while ($query_row = mysql_fetch_assoc($query_run)){

// more variable definitions
$post_id = $query_row['post_id']



echo " <form method=\"post\" action=\"add_comment.php?post_id='.$post_id.'>
                <textarea name=\"comment\"></textarea> <br>
                <input type=\"submit\" value=\"Send\" /></form> "

但我尝试将变量传递给其他页面,如下所示:action=\"add_comment.php?post_id='.$post_id.' 但是当我尝试这样做时,我得到了一个未定义的索引:变量。

关于我如何做到这一点的任何想法?

4

3 回答 3

4
于 2012-06-18T09:17:53.970 回答
1

这就是我期望发生的事情,因为您的 SQL 查询是从两个表中选择的,这是一个内部连接 ​​- 所以您会得到重复的行。

直接在查询窗口中尝试mysql查询以查看结果。

我建议存储当前帖子的值,仅在帖子没有更改时输出评论;类似于以下内容:

此外,您没有在表单中记录帖子 ID(作为隐藏变量或在 URL 中),所以我添加了一个隐藏变量,因为没有 post_id 我怀疑这将是您的下一个错误。

    $last_post_id = null;

    while ($query_row = mysql_fetch_assoc($query_run)){

       $post_id = $query_row['post_id'];
       if ($last_post_id == $post_id)
       {
?>
                    <ul class=\"comment\">
                    $commenter_user_id 
                    <li> $comment </li>
                </ul>    
<?php
       }
       else
       {
          if ($last_post_id !== null)
          {
?>
                <form name=\"message\" method=\"post\" action=\"sendmessage.php\">
                <textarea name=\"message\"></textarea> <br>
                <input type=\"hidden\" name="\post_id\" value=\"$last_post_id\" />       </form>
                <input type=\"submit\" value=\"Send\" /></form>
<?php
              $last_post_id = $post_id;
          }
?>
           <div id=\"post\">
                Post $pid $post_id Poster: $poster_id  Mentions: $user_id 
                <br><br> $message <br><br> 
                <ul class=\"comment\">
                    $commenter_user_id 
                    <li> $comment </li>
                </ul>
            </div>
<?php
   }
?>

更新的答案

sendmessage.php(使用我上面的表格,输入类型=隐藏)见下文。您是正确的,您需要使用会话来获取当前用户 ID 以用于发布目的。

我建议使用 POST 方法提交任何导致数据修改的表单。

<?php

if (isset($_POST['post_id']))
{
    $post_id = mysql_real_escape_string($_POST['post_id']);
    $user_id = $_SESSION['current_user_id'];
    $sql = "INSERT INTO `comments`SET
            `post_id` = $post_id
            'commenter_user_id = $user_id";

    if (!mysql_query($sql))
        echo "MySQL error during insert ". mysql_error();
}
else
{
    echo "Invalid form posting";
}
于 2012-06-18T09:21:06.153 回答
0

递归呢?它符合您的需求吗?如果是,那么您只需要每条消息的父消息 ID(如果不是响应,则为 NULL)。然后加载所有消息并仅使用 NULL 消息调用函数,同时提供整个消息数组。

于 2012-06-18T09:07:57.167 回答