实现首个、上一个、下一个和最后一个导航的方法

4
我刚开始学编程,有一个关于导航的问题。 在文章或漫画网站中,有哪些方法可以实现“第一篇”,“上一篇”,“下一篇”和“最后一篇”的导航呢?(诚然,“第一篇”链接不会令人困惑,但其他链接呢?) 例如,在第50页,链接应该适当地指向第49页和第51页(如果存在的话,如果不存在,则不起作用,但当这样的页面存在时,它将自动变为活动状态)。 在这种情况下,我看到大多数示例的URL以“.php?id=50”结尾,但我不确定它是如何实现的,是否需要使用数据库? 任何帮助都将非常感激,谢谢。
5个回答

4

URL末尾的那一串字符被称为GET变量。当用户访问一个URL末尾带有该变量的页面时,例如:

example.org/comics/myawesomecomic.php?page=50

服务器会访问该页面,通常情况下,服务器端脚本会在向用户输出页面之前执行一些任务。在PHP中,GET变量是一个全局变量(还有其他变量,比如POST和COOKIE),php脚本可以通过获取从服务器传递给脚本的值来检索它,例如在$_GET['page']中。
因此,假设您有一个处理所有漫画故事线“My Awesome Comic”请求的脚本,并且它被分成了60页,那么用户只需更改GET变量以获取任何页面。您的脚本可能非常简单,例如获取名为myawesomecomic/的目录的内容并抓取一个名为50.html的文件,然后将其输出给用户。但很可能您想要更复杂的东西,因为您已经费了这个劲儿,所以它会从数据库中获取第50页,并更新所有导航,甚至在左上角放置一个时尚的50-60
现在,这是简单的部分,也就是回答您的问题的部分。既然您知道GET变量的工作原理以及服务器脚本如何使用它们,您只需要执行以下操作即可创建您所描述的导航:
$current_page = $_GET['page'];
$next_page = $current_page + 1;
$prev_page = $current_page - 1;
$first_page = 1;
$last_page = 

最后一部分需要你已经知道。你可以始终拥有相同数量的页面,或者在获取当前页面时同时查询数据库等。假设你在获取当前页面时查询了数据库以获取总页数。它返回60(为避免头痛,我们假设60是从1开始的页数),那么回到导航栏...

$last_page = 60;

现在你已经拥有了第一个、最后一个、上一个和下一个。假设你知道如何处理HTML,那么除了让它看起来漂亮之外,还剩下:

 echo "
 <a href='myawesomecomic.php?page=$first_page'>First Page</a>
 <a href='myawesomecomic.php?page=$prev_page'>Previous Page</a>
 <a href='myawesomecomic.php?page=$next_page'>Next Page</a>
 <a href='myawesomecomic.php?page=$last_page'>Last Page</a>
 ";

这里是您的导航菜单。显然,您会想要将它们排列以适应您的网站,而不是像那样挤在一起,使用酷炫的箭头等等。但即使您不做任何花哨的事情,链接也将起作用。
但是!
我只给了您非常好的“第一次使用PHP玩乐”的版本。 我省略了一些内容(您应该更多地询问或进行一些严肃的研究):
1.由于GET变量包含在URL中,因此很容易弄清楚。 我可以轻松地将“?page = 50”更改为“?page = 1 = 1”,并根据您获取内容的方式,我可能刚刚要求获取您数据库的所有内容。 不要直接将用户输入(甚至是URL)放入您的变量中。 如果您知道它是页面编号,则知道它是数字。 在将其运行到脚本和数据库之前,请检查输入以确保它是数字。
2.您需要有一个系统,以防用户输入的数字超出范围。 像“抱歉,找不到页面”或甚至“找不到页面,从开头开始”这样的简单提示,并将他们发送回第1页。 如果您什么都不输出,看起来很糟糕,并且会揭示您脚本的逻辑的部分,这些部分可能会被操纵。
3.当您熟悉GET变量时,我建议您放弃它们并使用mod_rewrite(假设您在apache服务器上)。 现在不要急着尝试,但是当您掌握它时,您可以开始创建类似于:example.org / comics / myawesomecomic / page50或example.org / comics / myawesomecomic / page / 50之类的URL。 实际发生的是该目录中的所有页面都将重定向到同一脚本,然后该脚本检查URL的结尾以确定从DB中提取什么内容。 但对于最终用户而言,看起来就像只有一个网页。 这看起来更干净(我认为)并且更能覆盖您的脚本逻辑。 但我说要等待它,因为它还会为您带来其他风险,这些风险在您习惯于净化用户输入并处理标准页面错误(例如“找不到页面”)之前可能更难预测。
总之,像将当前日期加一周和将页面编号添加到当前页面之类的事情完全是我进入PHP和Web应用程序开发的原因,所以我希望这很有帮助并且简单明了。

这是一个非常好的答案,我会为将来的提问者收藏它,但如果我在第31条记录中,而第30条记录已被删除怎么办?你需要进行一些检查,至少要提到这一点。 - Pekka

2
这种导航被称为分页。有三个变量会影响给定页面上的分页:
  • 项目的总数
  • 每页显示的项目数
  • 当前页面
通常你可以通过 SQL 查询从数据库中轻松获取项目的总数,例如:
```sql SELECT COUNT(*) FROM table_name; ```
$query = "SELECT COUNT(*) FROM tbl";
$count = mysql_result($query, 0);

正如您所知道的,每页的项目数量和当前页,您可以计算出总共有多少页:

$perpage = 10; // This you can define yourself

$pages_count  = ceil($count / $perpage);

接下来,可以使用一些简单的if语句来判断应该显示哪种导航:

// Get the current page or set default if not given
$page = isset($_GET['page']) ? $_GET['page'] : 1;

$pages_count = ceil($count / $perpage);

$is_first = $page == 1;
$is_last  = $page == $pages_count;

// Prev cannot be less than one
$prev = max(1, $page - 1);
// Next cannot be larger than $pages_count
$next = min($pages_count , $page + 1);

// If we are on page 2 or higher
if(!$is_first) {
    echo '<a href="index.php?page=1">First</a>';
    echo '<a href="index.php?page='.$prev.'">Previous</a>';
}

echo '<span>Page '.$page.' / '.$pages_count.'</span>';

// If we are not at the last page
if(!$is_last) {
    echo '<a href="index.php?page='.$next.'">Next</a>';
    echo '<a href="index.php?page='.$pages_count.'">Last</a>';
}

为了从数据库中选择给定页面的正确结果,您可以使用以下查询语句:
$query = "SELECT * FROM tbl LIMIT ".(int)($page - 1)." ".(int)$perpage;

这就是所有的内容,希望这有所帮助。


1

也许这个教程或者这个可以帮到你。

编辑:呃,第一个网站太烦人了。找到了另一个。 :)


1

我假设你不是在谈论分页(即将大量记录拆分为多个页面),而是关于具有详细视图的记录,并提供“下一个”/“上一个”链接到下一个和上一个记录

如果您没有固定的方法来找出前一个和后一个邻居(因此不能只说“当前ID-1”和“+1”),则必须进行按您的标准排序的数据库查询,并找出前一个和下一个成员。

也许这太深入问题了,不是你需要开始的,但我最近问了一个问题,涉及优化问题和以快速高效的方式执行此“邻居查找”的不同方法。 缓存“下一个”/“上一个元素”查询的结果


1

有很多方法可以做到这一点,从复杂到简单不等。(在谷歌上搜索php分页)。

一些url中的?id=50是用来确定要开始的项目。

例如,在sql中,您可以使用SELECT * FROM tbl LIMIT 0,10来确定要选择的项目范围,这将选择记录0-10。然后SELECT * FROM tbl LIMIT 11,10将选择11到20。


实际上,LIMIT 11, 20 将选择记录 11-30,因为 LIMIT 中的第二个参数是持续时间,而不是结束点。 - Tatu Ulmanen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接