0

我正在使用具有以下数据库结构的 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

根据上面的url,如何确定这条消息所在的页码?你有什么想法可以引导我走向正确的方向吗?

编辑

  • 消息id不是连续的,例如一篇文章可以有评论:125、364、561、1522
4

5 回答 5

3

如果您每页显示 10 条评论并请求消息 3565,您可以这样做:

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

编辑

谢谢@Alix。

编辑#2

在对 OP 进行编辑后,如果没有看到数据库结构是什么样的,最坏的情况是,您必须获取整个评论列表,因为它会出现在网站上,并找到您的消息索引寻找。

我意识到这不一定是您想听到的,但是如果不查看您的数据库的外观,就没有其他真正的方法可以知道。

于 2012-10-09T18:19:28.563 回答
2

基本上,从同一篇文章中选择评论,按 ID 排序(或者如果id可以乱序--non-consecutive 可以使用另一列),然后对结果进行一些数学运算。这是代码(演示):

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)。

于 2012-10-09T19:06:20.203 回答
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)

根据显示评论的排序选择,您必须更改<for a >,该查询假定published_date DESC排序

PS:我不知道这是否是一个错字,但你已经publiched_date在你的数据库模式中写了

编辑
如果不进行排序,行可能按 PRIMARY KEY 排序,这就像published_date DESC排序

编辑 2
正如@bfrohs 所说,如果测试 ( <) 处于打开状态published_date(或任何其他包含非唯一数据的列)而不是id.
由于没有排序,因此使用id是更好的解决方案。

于 2012-10-09T18:34:51.183 回答
1

从消息编号返回页面是相当重要的。最简单的方法是简单地将页码传递给消息阅读脚本,因此您可以简单地将该页码嵌入到“返回”链接中,例如...

消息.php:

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

readmessage.php:

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

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

于 2012-10-09T18:29:15.230 回答
1

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

于 2012-10-09T18:18:59.030 回答