写给产品经理及UI的PHP教程丨文章管理系统

我是创始人李岩:很抱歉!给自己产品做个广告,点击进来看看。  

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

写给产品经理及UI的PHP教程丨文章管理系统-简易分页

 

【系列推荐】

写给产品经理及UI设计师的PHP教程(一)

写给产品经理及UI设计师的PHP教程丨文章管理系统-创建栏目(1)

写给产品经理及UI的PHP教程丨文章管理系统-创建栏目(2)

写给PM及UI的PHP教程丨文章管理系统-后台界面框架设计

写给产品经理及UI的PHP教程丨文章管理系统-栏目列表

写给产品经理及UI的PHP教程丨文章管理系统-修改&删除栏目

给产品经理及UI的PHP教程丨文章管理系统-创建文章(关联数据)

给产品经理及UI的PHP教程丨文章管理系统-文章列表(二维数组)

写给PM及UI的PHP教程丨文章管理系统-修改文章(遍历数组)

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

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

写给产品经理及UI的PHP教程丨文章管理系统-简易分页 运行之后可以看到原来有一堆数据的文章列表就剩了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方法比较省事(后面会讲到)

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

写给产品经理及UI的PHP教程丨文章管理系统-简易分页 代码分析:

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

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

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

写给产品经理及UI的PHP教程丨文章管理系统-简易分页

注意:要放在 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/article.php,不要从框架的左侧栏目里点进去)!在文本框中输入页码点击提交提交按钮就可以翻页查看了有木有!

但是有个问题,假设我们有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,我们现在就可以根据我们得出的结论写出如下代码了,打开article.php在if($_GET[‘page’]){上方加入下方代码:

写给产品经理及UI的PHP教程丨文章管理系统-简易分页 代码分析:

第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.1)返回的是2,floor(0.5)返回的是0,floor(-1.5)返回的是-2。floow在英文中是楼层的意思,我们设想一下一只虫子飞在2层和3层之间,它不就在2层吗?飞在地下1层和地下2层之间,它不就在地下2层吗?floor就是返回楼层,就这么记!

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

写给产品经理及UI的PHP教程丨文章管理系统-简易分页 运行之后就可以把文章数、页数、当前页显示出来了。

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

接下来我们再来做一个最常见的分页功能之一的上一页、下一页。

上一页、下一页是什么概念?上一页当然就是当前页-1,下一页就是当前页+1。

打开article.php页面在$snum=($page-1)*$pnum;上方插入如下代码:

写给产品经理及UI的PHP教程丨文章管理系统-简易分页 这就不用我说了吧?继续打开article_list.php页面,在form表单后面插入如下代码:

写给产品经理及UI的PHP教程丨文章管理系统-简易分页

在这里就体现出来了我们这次为什么用了get方法,没用post方法,在做上一页下一页功能的时候我们可以通过a标签直接把URL地址改成带有我们所需要的参数page的url。href的地址也同action中的地址一样当从“?”开始的时候就会在当前页面的地址文件后方里加上href中的部分。

上一页、下一页的功能做好了,不过比较笨,当到最后一页的时候还能继续往下翻,在第一页的时候还能继续往上翻。怎能允许如此愚蠢的事情发生呢?

所以把$prev_page=$page-1;$next_page=$page+1;部分改成如下:

写给产品经理及UI的PHP教程丨文章管理系统-简易分页

我相信各位都这么聪明,学到这份儿上都能看懂上面这是什么意思了,我也就不解释了哈。

再运行一下看看,这会儿就不能乱翻也了吧!!!

就这么点个翻页功能,就需要思考这么多逻辑,计算这么多公式!请大家务必尊重程序员的复出!做点东西真不容易!

留个作业:

通过学到的知识实现“第一页”,“最后一页”功能。

延伸作业:

通过以上学到的知识,我们完全可以延伸出,每页显示【X】条文章这样的功能。很简单噢!

要提示?还用说吗,就是那个$pnum,剩下的就自己研究吧!(*^__^*)

 

 

随意打赏

提交建议
微信扫一扫,分享给好友吧。