【问题标题】:Building a PHP forum, how to link to last post permalink in a paged thread建立一个 PHP 论坛,如何链接到分页线程中的最后一个帖子永久链接
【发布时间】:2012-07-08 10:27:18
【问题描述】:

我正在构建一个相对简单的 PHP 论坛,并尝试添加一些来自 phpBB 等主流板的不错的功能。

数据库结构是简单的 3 表方法。类别、主题和帖子。

我正在为每个类别和主题实现“最后一篇文章”功能。我已经有了最后的发布信息,因为它存储在数据库中,这不是问题。我正在努力解决的是如何在一个有分页回复的线程中链接到这篇文章,比如每页25个。如果我的帖子是 26 篇文章中的第 26 篇,您将如何编写线程以转到第二页?假设我想永久链接到 90 个中的 30 个,您如何链接到第 2 页并确保两边的回复/页面数量正确?

我一直在尝试弄清楚 phpBB 是如何做到的,但我认为你可能会花一整年时间将其撕成碎片而无处可去。我看到他们将 post_id 作为附加参数与 thread_id 一起传递,但我无法弄清楚他们如何使用该信息。有什么想法可以作为起点吗?谢谢。

【问题讨论】:

    标签: php mysql forum


    【解决方案1】:

    我不知道 phpBB 是如何做到这一点的。但我要做的是通过它自己的 ID 跟踪最后一篇文章。对于每个永久链接请求,我会在内部“渲染”线程(只是准系统,甚至不需要从数据库中获取诸如正文之类的帖子信息)。只需获取线程上的答案数量,然后按照通常的逻辑将其分成几页。

    由此,我可以很容易地找出最后一篇文章进入哪个页面,而不是试图从我的角度“确保”任何事情(看看系统在做什么,不要试图屈从于你的意愿) - 然后,当然,重定向到该页面是一个相对简单的事情,并将 HTML anchor id 附加到帖子和 URL,以便浏览器自动滚动到该帖子。

    嗯,这不是我的想法。成熟的系统可能会以更优雅的方式解决它,请随时研究并在此处回复:)

    【讨论】:

      【解决方案2】:

      你可以试试这个例子,在一个有 20 个帖子的线程的每个页面上呈现 5 个帖子
      查询

      // get the first 5 posts<br/>
      SELECT posts FROM topics WHERE topicid = 1 LIMIT 0,5
      
      // get the next five posts<br/>
      SELECT posts FROM topics WHERE topicid = 1 LIMIT 5,10
      

      在 php 方面,页面控件(第一个、下一个、上一个、最后一个)是表单按钮,用于提交表单和位置标识符,例如第一页 X、下一页 Y、上一页 Z、最后一页 S .. 使用 url GET方法

      http://example.com/forum/topic.php?id=1&cur=5&next=10&previous=5&last=20

      这种关于跟踪用户的信息在主题中,可以存储在会话中或使用 POST 方法提交

      希望对你有帮助

      【讨论】:

      • 对不起,这没有帮助。问题不在于如何将数据返回到页面中,我正在使用 LIMIT 来实现这一点。问题是如何计算出给定帖子 id 驻留在这些页面中的哪些页面。
      • 因为您每页显示 5 个帖子并且主题订单权重为 16,所以它在第 6 页(第 3 次查询)15,20 16 主题帖子的权重 ID / 每页 5 个帖子 = 3.2 , 四舍五入给出 3 SELECT posts FROM topic WHERE topicid=1 LIMIT (5*3),(5*3+5) 虽然只是一个想法但不确定
      【解决方案3】:

      我根据@aditya-menon 和@GeoPhoenix 的说法提出了一个解决方案。我已经知道帖子总数,所以我只是将其除以每页的帖子以获得总页数。最后一篇文章总是在最后一页,所以这很容易。

      挑战在于找出帖子位于线程中间的哪个页面。我已经像这样运行BETWEEN 查询来计算特定帖子在线程中的帖子数

      SELECT COUNT(post_id) FROM posts 
      WHERE topic_id = $TOPIC_ID AND post_id BETWEEN 0 AND $POST_ID
      

      然后将每页的帖子除以这个数字和ceil(),得到帖子所在的页码。

      不太确定该查询对于大型论坛的效率如何,但它似乎可以完成这项工作。谢谢大家

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 2019-11-18
        • 2014-08-14
        • 1970-01-01
        • 1970-01-01
        • 2014-09-02
        • 1970-01-01
        • 2017-10-26
        相关资源
        最近更新 更多