分页:如何知道页面的评论所属的位置

时间:2012-10-09 18:16:44

标签: php mysql pagination

我正在开发一个带有php和mysql的博客系统,其中包含以下数据库结构:

Article
   -id
   -firstMessage
   -lastMessage
   -body

Comment
   - id
   - article_id
   - publiched_date
   - body

这里的想法是利用分页,其中包含大量评论的文章显示了[first][1][2][3][last] 10 评论等链接树按页。一切顺利,我创建了一个很好的SQL,根据url:

的页码选择10条消息
  

example.com/?article=3&page=2

问题在哪里?好吧,请在我的主页上有这个网址:

  

example.com/?article=3&message=3565

根据上面的网址,如何确定此邮件的页码?你有什么想法指引我走向正确的方向吗?

修改

  • 消息ID不是连续的,例如,文章可以包含注释:125,364,561,1522

5 个答案:

答案 0 :(得分:3)

如果每页显示10条评论并请求消息3565,则可以执行以下操作:

$pageNumber = floor($_GET['message'] / 10) + 1;

修改

谢谢@Alix。

编辑#2

在对OP进行编辑之后,没有看到数据库结构的样子,最坏的情况,你必须获取整个评论列表,就像在网站上看到的那样,找到消息的索引你正在寻找。

我意识到这不一定是你想听到的,但没有真正的其他方法可以知道你的数据库是什么样的。

答案 1 :(得分:2)

我想你必须进行查询,这样的事情应该有效:

SELECT CEIL((COUNT(id) + 1) / $nb_message_per_page) AS page_for_message
FROM comment
WHERE article_id = $article_id
AND published_date < (SELECT published_date FROM comment WHERE id = $message_id)

根据排序选择显示评论,您必须更改<的{​​{1}},该查询会假设>排序

PS:我不知道这是不是一个错字,但你在DB模式中写了published_date DESC

修改
如果没有排序,行可能按PRIMARY KEY排序,就像publiched_date排序

编辑2
正如@bfrohs所说,如果测试(published_date DESC)在<(或任何其他包含非唯一数据的列)而不是{{{}},则此查询会给出不准确的结果(对于一种情况,但会发生) 1}}。
由于没有排序,使用published_date是一个更好的解决方案。

答案 2 :(得分:2)

基本上,选择同一篇文章中的评论,按ID排序(如果id可能无序,则选择其他列 - 非连续就可以了),并且结果有点数学。这是代码(demo):

SELECT (
  SELECT CEILING((count(*) + 1) / 10)
  FROM `Comment`
  WHERE `id` < `comment`.`id`
  AND `article_id` = `comment`.`article_id`
) AS `page`
FROM `Comment`
WHERE `id` = ?
AND `article_id` = ?

只需插入?所在的注释ID和文章ID(或者更好的是,在准备好的语句中使用此确切代码)。如果您更改每页的评论数量,请务必同时更改查询中的10

对于此查询,您只需要article_id上的索引(PRIMARY上的id索引)。

答案 3 :(得分:1)

您需要设置每页显示的项目数,并使用该项目将消息分成页面

答案 4 :(得分:1)

从消息号回到页面是非常重要的。最简单的方法是简单地将页码传递给消息阅读脚本,这样您就可以将该页码简单地嵌入到“后退”链接中,例如......

messages.php:

<a href="readmessage.php?messageID=1234&page=7">1234</a>

readmessage.php:

<a href="messages.php?page={$_GET['page']}">Back</a>

这样可以省去计算你来自哪个页面的麻烦,因为你只需随身携带页码。