我正在开发一个带有php和mysql的博客系统,其中包含以下数据库结构:
Article
-id
-firstMessage
-lastMessage
-body
Comment
- id
- article_id
- publiched_date
- body
这里的想法是利用分页,其中包含大量评论的文章显示了[first][1][2][3][last]
, 10 评论等链接树按页。一切顺利,我创建了一个很好的SQL,根据url:
example.com/?article=3&page=2
问题在哪里?好吧,请在我的主页上有这个网址:
example.com/?article=3&message=3565
根据上面的网址,如何确定此邮件的页码?你有什么想法指引我走向正确的方向吗?
答案 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>
这样可以省去计算你来自哪个页面的麻烦,因为你只需随身携带页码。