【文章摘要】文章列表有了,自然离不开分页功能。这一节我们来做一个简易的分页功能。请不要小看分页功能,我将通过两节课程来分开讲解分页功能的实现。让我们来看看一个看似简单的分页功能,实现起来是需要多么复杂的逻辑关系的。

首先为了查看分页效果,请先创建好充足的文章。(最起码25个以上)

打开ar页面,把SELECT * FROM article部分改成如下代码:

运行之后可以看到原来有一堆数据的文章列表就剩了10条最新的数据。

代码中新增的部分是LIMIT 0,10。通过查询MYSQL获得结果集的时候我们可以通过LIMIT来指定返回的数据起始位置和记录数。

LIMIT在英文中是界限的意思,同样的道理我们通过2个数字给需要返回的数据划了界限。第一个数字代表的是起始位置,第二个数字代表的是需要返回的记录数量。

关于起始位置需要注意,当数值为0的时候才是从第一条数据开始返回,当数值为1的时候从第二条数据开始返回,以此类推,也就是从第+1条数据开始返回。

LIMIT 0,10是的意思就是从第一条数据开始返回一共10条数据。当改成LIMIT 10,10的时候就意味着从第11条数据开始返回一共10条数据,也就是返回第11-20的数据。

那也就是说假设我们每一页要显示10个文章的话,LIMIT 0,10是第一页,LIMIT 10,10就是第二页,LIMIT 20,10就是第三页,以此类推。

那如何计算第X页的起始位置是多少呢?第1页是0,第2页是10,第3页是20。假设我们的第X页的起始位置为Y,不难想象 Y=(X-1)*10。

这时候我们基本上也就可以联想到,只要我们通过一个参数告诉这个页面X值是多少,就可以通过X计算出Y,并且在LIMIT后方带入Y的值就可以实现想看第几页就看第几页的效果了。

之前我们有讲到过通过form表单的post方法向服务器提交参数,也可通过get方法向URL提交参数,这次我们就用get方法提交一个参数到URL告知我们需要查看第几页。

PS:POST方法也可以实现,不过某些时候用GET方法比较省事(后面会讲到)

打开ar页面,在栏目列表的表格的结束位置/table下方增加如下代码:

代码分析:

我们创建了一个方法为get的表单,并可通过name为page的input文本框像URL提交参数page的值,除了POST以外我有说过还有get方法直接把参数提交到链接地址url里去。

在ar中把SELECT * FROM article ORDER BY add_time DESC LIMIT 0,10部分代码删掉。

打开ar页面在include(‘ar’);页面上方增加如下代码:

注意:要放在 else{}内。当然不是说放到if语句外面不行,只不过这段代码我们只需要在进入列表页面的时候执行就可以了,所以放到外面无疑是降低执行效率。

代码分析:

第1行、通过if($_GET[‘page’])来判断$_GET[‘page’]值是否存在。在if条件语句中可以以if(变量)的形式来判断该变量值是否存在,有值意味着条件成立,无值意味着条件不成立。

第2行、当条件成立的时候把$_GET[‘page’]的值赋值到变量$page,在这里变量$page就是之前公式中的x,为了方便理解我用了$page来表示当前页面。

第4行、条件不成立是$page的值被赋值为1,也就是$page的默认值是1。

第6行、$snum就是之前的Y,通过公式计算出起始位置$snum的数值。这个运算公式跟我们一般的数学公式没有差别,只不过在程序中用“*”来表示乘法符号,因为键盘上没有“×”符号。

第7行、把$snum的值带入到了LIMIT后方。

好了,现在运行列表页面看看我们的成果吧(为了方便查看地址栏的变化请直接在浏览器中打开http://127.0.0.1/cainiao/admin/ar,不要从框架的左侧栏目里点进去)!在文本框中输入页码点击提交提交按钮就可以翻页查看了有木有!

但是有个问题,假设我们有25个文章,并且每页显示10条的话,那一共就是3页,翻到第4页,第5页都是没有意义的。好歹应该告诉一下用户一共有多少页吧。

下面就来讲解如何计算出总页数。

也不难想象,总页数当然是需要用文章总数和每页显示的文章数量来换算得出。

先看看几个情况。

假设我们每页显示10个文章,文章一共有10条的时候就是1页,20条、30条、40条的时候2页、3页、4页。这个数字很容易得到,只要总数除以每页文章数10就可以得到。

但是当文章有1、2、3…9条的时候是1页,有11、12、13…19条的时候是2页,21、22、23…29的时候3页。

如果总数除以10我们就会得到0.1、0.2、0.3的时候是1页,1.1、1.2、1.3的时候是2页,2.1、2.2、2.3的时候是3页。

其中的规律不难发现页数是我们除以10之后获得的结果数的整数部分+1。

根据以上规律我们可以得出如下结论:

1. 当文章总数除以每页文章数的结果为整数的时候,总页数=文章总数除以每页文章数。

2. 当文章总数除以每页文章数的结果不是整数的时候,总页数=(文章总数除以每页文章数)取整数部分+1

OK,我们现在就可以根据我们得出的结论写出如下代码了,打开ar在if($_GET[‘page’]){上方加入下方代码:

代码分析:

第1行,我们定一个了一个变量$pnum并给其赋值10,作为每页显示的文章数来用。因为10这个数字在下方代码种要多次出现,所以我们定一成一个变量好方便我们随时修改每页显示的数量。

第2行,通过SELECT COUNT(*) FROM article的mysql指令返回了article表中的记录数,这个很好记,COUNT不就是数数的意思吗?比我们之前的SELECT * FROM语句就多了一个数数而已。

在这一行获得的结果和SELECT * FROM方式来获得结果一样,他也只是个结果集而已,只不过该结果里只有一行数据,这一行数据就是记录数(文章总数)

第3行,通过mysql_result函数返回该结果集中一个字段的值(文章总数)并赋值到了变量$sum。括号中$s是用来指定需要返回的结果集,0是用来指定起始位置,跟LIMIT类似0代表着返回第一行,因为$s中只有一行数据所以如果把0改成1或者其他数字就会出现错误,因为没有第二行或者更多的数据。mysql_result函数的正确写法是mysql_result(结果集,行号,字段名)。其中字段名是可以省略的,如果省略字段的话会显示第一个字段的值。在我们的结果集$s中只有一个字段,该字段名是COUNT(*),所以指定不指定无所谓。如果这里不好理解的话可以利用我们之前的mysql_fetch_array,把$s转换成一个数组并赋值到一个字段里,再用print_r来打印这个字段看看这个数组是什么结构的,基本上就能理解了。

第4行、不知道大家还记不记得小学数学里学过的“余数”,当3除2的时候余数为1,当7除4的时候余数为3,当8除4的时候余数为0。在PHP程序中%就是获得余数的运算符。那$sum%$pnum==0的意思自然就是文章总数除以每页显示的文章数的余数是等于0的时候,也就是说是整数的时候。

第5行、当满足上面的条件的时候,变量$pages(总页数)的值是 $sum/$pnum,其中符号“/”是代表着“除”。

第7行、floor是一个用于取整数的一个函数,返回一个不大于括号中数字的最大整数。floor)返回的是2,floor)返回的是0,floor)返回的是-2。floow在英文中是楼层的意思,我们设想一下一只虫子飞在2层和3层之间,它不就在2层吗?飞在地下1层和地下2层之间,它不就在地下2层吗?floor就是返回楼层,就这么记!

好了,所有我们需要的变量都已经得到了,我们来把他输出出来,打开ar在form表单前面加入如下代码:

运行之后就可以把文章数、页数、当前页显示出来了。

这样基本上完全可以满足一个网页的分页需求了。不过用户体验很不好!

相关推荐