如何显示每篇文章的所有评论(PHP &SQL)


How to display all comments per article (PHP & SQL)?

所以我有两个表,文章和评论(有一对多的关系(1篇文章-许多评论))。表的结构是这样的:

文章- id (prikey), title, publicationDate, content

Comments - com_id (prikey), author, comment, id(外键)

我用它来查询两个表:

SELECT * FROM articles as a INNER JOIN comments as c ON a.id = c.id

之前,我只使用以下命令显示文章表:

<?php 
while($row = mysqli_fetch_array($query)) {
echo "
<div id='article'> 
<header>
    <hgroup>
         <h2>".$row['title']."</h2>
         <h4>Posted on ".$row['publicationDate']."</h4>
    </hgroup>
</header><p>".$row['content']."</p></div>";
}
?>

显示所有文章(包括日期、标题、内容等)。现在有评论了。我如何编辑php代码(或者如果我的查询是不正确的,如何编写查询),以便它显示所有文章和每篇文章的所有评论,如:

Article One
 -- Comment 1
 -- Comment 2, etc.
Article Two
 -- Comment 1
 -- Comment 2, etc.

另一种选择是将查询拆分为两个。

第一个会带回来你想要的文章…

SELECT * FROM article;

一旦你有了这些,你可以得到所有的id,并使用下面的东西

SELECT * FROM comments WHERE article_id IN (".$list.");

这将MySQL查询限制为2,同时获得所需的所有数据。在这个循环之后,循环文章数据,在那个循环中,循环评论数据。

这也意味着,与使用GROUP_CONCAT不同,您还可以使用作者数据。

这不是一个非常雄辩的解决方案,但应该有效。

查询:

    SELECT c.author, c.comment, 
           a.id article_id, a.title, a.publicationDate, a.content
      FROM comments c
RIGHT JOIN articles a
        ON c.id = a.id
PHP:

<?php
$lastArticleId  = 0;
$isNewArticle   = false;
while($row = mysqli_fetch_array($query)) {
    $isNewArticle = ($lastArticleId != $row['article_id']) ? true : false;
    if($isNewArticle) {
        $lastArticleId = $row['article_id']; ?>
        <div class="article">
            <header>
                <hgroup>
                    <h2><?php echo $row['title']; ?></h2>
                    <h4>Posted on <?php echo $row['publicationDate']; ?></h4>
                </hgroup>
            </header>
            <p><?php echo $row['content']; ?></p>
        </div>
<?php
    }
    if($row['comment'] != '') { ?>
        <p><strong><?php echo $row['author']; ?></strong> - <?php echo $row['comment']; ?></p>
<?php
    } ?>
<?php
} ?>

使用

SELECT a.article
       ,GROUP_CONCAT(CONCAT('<p>', c.comment, '</p>') SEPARATOR "'n") as comments
FROM
article a
INNER JOIN comment c ON (c.article_id = a.id)
WHERE a.id = '12454';

您可能需要稍微摆弄一下分隔符。

见:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html function_group-concat

请注意:

结果被截断为系统变量group_concat_max_len给出的最大长度,该变量的默认值为1024。虽然返回值的有效最大长度受到max_allowed_packet值的限制,但该值可以设置得更大。在运行时更改group_concat_max_len值的语法如下,其中val是一个无符号整数:

SET [GLOBAL | SESSION] group_concat_max_len = val;

查看这里如何修改max_allowed_packet
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html sysvar_max_allowed_packet

查看MySQL GROUP_CONCAT,它将返回一个逗号分隔的项目列表。你可以在你的评论区展开。

一旦有人评论了一篇文章,就插入带有该评论的文章id,然后相应地获得如下内容

一旦有人选择要阅读的文章,将$_GET中的文章id发送到您的文章页面,以便您可以超过文章id。一旦有人评论了那篇文章,就按如下方式插入

$sql = mysql_query("INSERT INTO comments_table (subject,article_id,comments) VALUES ('$subject','$_GET['id']','$comments')");

,然后当你拉它们的时候,就像你在$_GET中获取文章id一样您可以运行如下查询来访问它

$fetch = mysql_query("SELECT * FROM comments WHERE article_id = $_GET['id'] ORDER BY id DESC") or die(mysql_error());

希望能成功