第十一章:第8节 PHP与MySQL——PHP实现会员管理(二)分页

更新于:2017-10-09 13:41:22

我们每个人都访问过很多网站,比如百度,一页显示的数据并不多,也就10个,想要看更多信息就得“翻页”。


1.png


如果我们的会员表里有100万个会员,全部显示出来那数据量就太大了,加载都是问题,解决的办法就是像百度一样进行分页。分页的实现主要是靠mysql的limit子句。


回顾下limit子句:


形式:limit   m,n ;


m是“起始行号start”, 可省略。

n是“要取出的行数num”,是有我们自己定的。


假如每页显示10个数据,n就是10。


第一页时,limit子句是 limit 0,10;

第二页时,limit子句是 limit 10,10;

第三页时,limit子句是 limit 20,10;

依次类推……


公式: m = (p -1)*n;


p代表是页数。


数据是有上限的,那页数也肯定是有上限的,公式:max_p = ceil(count/n);


max_p代表最大页数,count代表数据总数。


掌握了这两个公式,我们就可以写分页了。


1)先在Db类里加一个count方法,或者直接用query方法也可以。


1.png


知识扩充:

mysql在设计上,count(星号)性能是很快的,即便是加上where,它就是要比count(col)快,因为count(col)要判断每行是不是NULL,而count( 星号 )也并不是想象中那样扩展所有列,它会直接忽略列而直接统计结果集行数,只要有行就纳入统计,具体这行每列的值是什么对它来说根本不重要,跟select(*)是不同的。

结论就是,如果你要统计记录条数一共多少条,一定要用count(*),而不是count(col),它的性能会更好。当引擎发现你的col不可能为null的时候,它会将col转换成星号,如果楼主用的id时主键,那么其实会被转化成星号,这转化也是耗费性能的。

myisam引擎状况下,如果不指定where条件,那么myisam是很迅速,因为不指定条件会直接读取存储引擎存储的一个特殊字段,值是总行数,但是一旦指定where条件,迅速的神话也就没了,沦落和其他引擎差不多了。


2)我们把分页的代码打包成一个Page类,不光是会员显示时会用到,以后其他表的数据显示也要分页,可直接使用Page类,拓展性好,可以避免重复的代码连续写好几遍。


Page类可归纳为扩展类,为了分清各个类的区别,楠神重新建了两个文件夹:Db类属于模型类,放入Mmodel文件夹里;User类属于控制器类,放入到Controller文件夹;Page类属于扩展类,放入Lib文件夹。


相应的我们的魔术函数要改下代码:


1.png


Page类的代码大家从《本节学习代码》中下载自己看吧,楠神不详细讲解了,这是我以前写的一个Page类,仔细看下是可以看懂的,这里我们直接用了。


1.png


12、14行是新加的代码。运行下:


1.png


报错了。这个地方报错主要是由我们的Db类引起的(由12、13行代码引起),说明我们的Db类没有写好,修改下。


主要是修改下Db类里的table方法和query方法的代码:


1.png


把32行代码去掉。


1.png


140、141、142是新添加的代码。


1.png


在模板文件里执行page对象的show方法,看结果:


1.png

分页成功实现了。


详细的Page类代码自己下载研究,很简单很好理解的。楠神写的这个Page类大家可以在以后开发项目时拿来用,你只要把代码理解了,可以对分页显示的样式随意修改。


本节学习代码》》》