如何回复评论? (PHP)

时间:2010-05-28 23:15:18

标签: php mysql

我想创建像reddit这样的评论,然后回复评论,然后回复回复。

他们使用什么类型的数据库结构:

1. they keep track of all the comments to a posting
2. a reply to a comment
3. a reply to a reply

我所拥有的只是一个帖子和一些与之相关的评论,如...

POSTING TABLE
posting_id | title | author

COMMENTS TABLE
comment_id | posting_id | comment

REPLIES TABLE
????

如何将评论与回复相关联? 他们使用什么类型的css来提供缩进空间的回复?

修改   谢谢你的回答!现在我唯一的问题是如何缩进回复? 如.. ..

you like food
     yes I love italian
        Yes i do like it too
     chinese is best

6 个答案:

答案 0 :(得分:8)

您可以在注释表中添加另一列,指定parent_comment_id,并使用用户回复的注释(或回复)的ID填充该列。如果评论是对帖子的直接回复(不是对评论的回复),则此列将为空。

答案 1 :(得分:2)

要在回复中显示回复,您必须进行递归调用以继续生成子回复。

这样的东西
function get_comments($comment_id) {
    print '<div class="comment_body">';

    // print comment body or something?

    if (comment_has_reply($comment_id)) {
        foreach(comment_comments($comment_id) as $comment) {
            get_comments($comment->id);
        }
    }

    print '</div>';
}

要缩进评论,请使用css。

<style type="text/css">
.comment_body {
    margin-left:10px;
}
</style>

这种方式子回复比父回复缩进,并且它们的子回缩更多,依此类推。

答案 2 :(得分:1)

我会通过制作交叉参考表来做到这一点。

示例:

表:帖子

Columns: pstkey | userid | postMessage | etc...

pstkey是帖子的关键。 userid是创建帖子的人。 postMessage是实际的帖子条目。

表:评论

Columns: comkey | pstkey | userid | commentMessage | etc...

comkey是评论的关键。使用pstkey引用帖子。 userid是发表评论的人。然后commentMessage是实际评论的文本正文。

表:xref_postComm

Columns: xrefkey | pstkey | comkey | comkey2 |

现在为有趣的部分。所有帖子都进入帖子表。所有评论都会进入评论表。这些关系都在交叉参考表中定义。

我以这种方式完成所有编程。我有幸与一位退休的世界上最优秀的数据库工程师合作,他教了我一些技巧。

如何使用交叉参考表:

xrefkey | pstkey | comkey | comkey2
All that you look for is the population of a given field.

xref (Auto Incremented)
pstkey (Contains the pstkey for the post)
comkey (Contains the comkey for the comment post)
comkey2 (Contains the comkey for the comment post)
        (but only populate comkey2 if comkey already has a value)
and of course you populate comkey2 with the key of the comment.

SEE, no reason for a 3rd tabel!

With this method you can add as many relationships as you want. 
Now or in the future!

comkey2是您对回复的回复。这一行包含的位置......帖子的关键,评论的关键以及回复评论的回复键。全部由外星人口完成。

EXAMPLE:
PAGES.... Page table

POSTS
 pstkey | pageid | user| Post
-------------------------------------
|   1   |    1   |  45 | Went to the store the....|
|   2   |    2   |  18 | Saw an apple on tv.....

COMMENTS
 comkey | pstkey | user  | Comment
-----------------------------------------------
|   1   |    1   |   9   | Wanted to say thanks...
|   2   |    1   |   7   | Cool I like tha.....
|   3   |    2   |   3   | Great seeing ya....
|   4   |    2   |   6   | Had a great....
|   5   |    2   |   2   | Don't sweat it man...

xref_PostCom
xrefkey | pageid | pstkey | comkey | comkey2 |
----------------------------------------------
|   1   |   1    |   1    |  NULL  |   NULL  | Post1 on Page1
|   2   |   1    |   1    |   1    |   NULL  | Comment1 under Post1
|   3   |   1    |   1    |   2    |   NULL  | Comment2 under Post1
|   4   |   2    |   2    |  NULL  |   NULL  | Post2 on Page2
|   5   |   2    |   2    |   3    |   NULL  | Comment3 under Post2 on Page2
|   6   |   2    |   2    |   4    |   NULL  | Comment4 under Post2 on Page2 (a second Comment)
|   7   |   2    |   2    |   4    |    5    | Explained below....
Comment key 5 is matched with comment key 4....under post2 on Page 2

如果您对连接,左连接,右连接,内/外连接创建SELECT以了解使用这些关系获取数据数组的任何信息,那么您的工作将变得更加轻松。

我相信工程师称这基本上是定义关系的“数据图”。现在的诀窍是如何使用这些关系访问它们。它起初很难接触,但知道我所知道的,我拒绝以任何其他方式做到这一点。

最后发生的事情是你最终编写了一个脚本,上面写着,好吧,去做什么,一切都回来了。您将最终得到1个函数调用,请求第1页。它返回page1,post 1,comment1&amp; 2&amp; 3以及对1个数组中的回复的回复。回显输出并完成。

评论更新 第一次向我展示时我说了同样的话。事实上,数据库程序员强迫我这样做,真让我生气。但现在我明白了。优势很多。

优点1)可以编写1个查询,以便在1次拍摄中全部拉出。

2)多个查询中的答案可以在结构中填充数组,当打印页面时,循环中的循环可以显示页面。

3)升级使用它的软件可以支持您可以想到的任何可能的设计变更。完美无瑕的可扩展性。

那个教给我的人是雇佣的枪,重新设计了sears和jcpenny数据库。因为重复记录问题,他们有9本书去同一所房子。

交叉引用表可以防止设计中出现很多问题。

这个理论的核心是,一列不仅可以包含数据,还可以同时作为真或假的陈述。在它的自我节省空间。为什么搜索20个表时可以搜索一个表? 1个索引交叉引用表可以告诉您需要知道的关于其他20个表的内容,内容,您需要的内容,您不需要的内容,甚至还需要打开另一个表。

简称: 1只包含INT(2/11)的交叉引用,它告诉您在打开另一个表之前需要知道的所有事情,不仅包含完美的可扩展性,而且还包含照明速度结果。更不用说重复记录的可能性很小。对你我来说,重复记录可能不是问题。但对西尔斯来说,每本11美元有40亿条记录,错误加起来。

答案 3 :(得分:0)

在评论表中添加另一个字段“reply_to”或其他字段,并将其回复的评论的ID存储在那里。

答案 4 :(得分:0)

你可以使评论表像这样通用:

COMMENTS TABLE
comment_id | posting_type | posting_id | comment

其中posting_type是某种鉴别器,例如字符串'POST'或'COMMENT',或整数以提高效率(1 = POST,2 = COMMENT等)。

编辑:诚然,这更复杂,但这意味着你可以使用相同的评论表来评论任何内容,而不仅仅是帖子和其他评论。

答案 5 :(得分:0)

您不需要回复表。正如其他人已经正确指出的那样,递归是使用RDBMS的方法。您始终可以考虑使用nosql样式的DBMS,以避免必须处理递归。