我是编程新手,对导航有疑问。 有哪些方法可以实现“第一”,“上一页”,“下一步”和“最后”导航,如文章或基于漫画的网站所示? (不可否认,“第一”链接并不会让人感到困惑,因为它可以保持静止,但其他链接呢?) 例如,在第50页,链接将适当地导致第49和第51(如果它存在,如果不存在它将不起作用但在这样的页面存在时将自动变为活动状态。 在大多数这样的例子中,我看到网址以“.php?id = 50”结尾但不确定它是如何实现的,使用数据库? 非常感谢任何帮助,谢谢。
答案 0 :(得分:4)
URL末尾的位称为GET
变量。当用户转到最后一页的页面时,例如:
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开始的页数,而不是0),所以回到导航......
$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>
";
这是你的导航。显然你会想要安排它们适合你的网站,不要让它们像那样一起运行,使用炫酷的箭头等等。但即使你不做任何花哨的事情,链接也会有用。
BUT!
我只是给了你非常好的,“我第一次玩PHP”版本。我遗漏的事情(你应该更多地询问或做一些认真的研究):
由于GET变量包含在URL中,因此不难理解。我可以轻松地将?page=50
更改为?page=1=1
,并且根据您获取内容的方式,我可能刚刚要求您提供数据库的所有内容。 从不直接将用户输入(甚至是URL)抓取到您的变量中。如果您知道它的页码,那么您知道它是一个数字。在运行脚本和数据库之前,检查输入以确保它是一个数字。
如果用户输入一个数字并且超出范围,您需要有一个系统。像“抱歉,找不到页面”或甚至“从头开始找不到页面”这样简单的东西,并将它们发送回第1页,无论如何。如果您只是输出任何内容,它看起来很糟糕,并且您会揭示可以操作的脚本逻辑部分。
当你对GET变量感到满意时,我建议你放弃mod_rewrite(假设你在apache服务器上)。现在不要跳入,但是当你掌握它时,你就可以开始制作如下网址:example.org/comics/myawesomecomic/page50
或example.org/comics/myawesomecomic/page/50
或者你拥有的网址。真正发生的是该目录中的所有页面都被重定向到同一个脚本,然后检查URL的结尾以确定从DB中提取的内容。但对最终用户来说,它看起来只是一个网页。这看起来更干净(我认为),甚至可以覆盖脚本的逻辑。但我要说的是等待它,因为它还会让你更加难以预料到其他风险,直到你习惯于清理用户输入并处理标准页面错误,例如“找不到页面”。
无论如何,找出像当前日期添加一周并在当前页面添加页码等内容的方式完全是我进入PHP和Web应用程序开发的方式,所以我希望这是有帮助和直截了当的。
答案 1 :(得分:2)
这种导航称为分页。有三个变量会影响给定页面上的分页:
您通常可以使用如下查询轻松获取数据库中的项目总数:
$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;
这就是它的全部内容。希望这会有所帮助。
答案 2 :(得分:1)
也许 this tutorial 或this one会对您有所帮助。
答案 3 :(得分:1)
我假设您不是在谈论分页(即将大量记录分成多个页面),而是关于记录的详细视图,并预先提供“下一个”/“前一个”链接到下一个和上一个< EM>记录
如果您没有找到前一个和最后一个邻居的固定方法(因此您不能只说“当前ID -1”和“+1”),您将不得不按照您的标准进行数据库查询,并找出上一个和下一个成员。
也许是深入研究这个问题,而不是你需要开始的问题,但我最近提出了一个问题,涉及优化问题以及以快速有效的方式进行“neghbor查询”的不同方法。 Caching the results of a “next” / “previous element” query
答案 4 :(得分:1)
有很多方法可以做到这一点,从复杂到简单。 (在谷歌搜索php分页)。
某些网址中的?id = 50是确定要开始的项目。
例如在sql中,您使用SELECT * FROM tbl LIMIT 0,10
确定要选择的项目范围,这将选择记录0-10。然后SELECT * FROM tbl LIMIT 11,10
会选择11到20。