≡
  • 网络编程
  • 数据库
  • CMS技巧
  • 软件编程
  • PHP笔记
  • JavaScript
  • MySQL
位置:首页 > 网络编程 > PHP笔记

PHP 分页原理用法

人气:390 时间:2020-11-03

这篇文章主要为大家详细介绍了PHP 分页原理用法,具有一定的参考价值,可以用来参考一下。

感兴趣的小伙伴,下面一起跟随512笔记的小编小韵来看看吧!

 

1、前言


分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一。对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解,力求让看完这篇文章的朋友在看完以后对于分页显示的原理和实现方法有所了解。本文适合初学者阅读,所有示例代码均使用php编写。

2、原理

所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数:

每页多少条记录($PageSize)?
当前是第几页($CurrentPageID)?

现在只要再给我一个结果集,我就可以显示某段特定的结果出来。
至于其他的参数,比如:上一页($PreviousPageID)、下一页($NextPageID)、总页数($numPages)等等,都可以根据前边这几个东西得到。
以mysql数据库为例,如果要从表内截取某段内容,sql语句可以用:select * from table limit offset, rows。看看下面一组sql语句,尝试一下发现其中的规率。

前10条记录:select * from table limit 0,10
第11至20条记录:select * from table limit 10,10
第21至30条记录:select * from table limit 20,10
……

这一组sql语句其实就是当$PageSize=10的时候取表内每一页数据的sql语句,我们可以总结出这样一个模板:

select * from table limit ($CurrentPageID - 1) * $PageSize, $PageSize

拿这个模板代入对应的值和上边那一组sql语句对照一下看看是不是那么回事。搞定了最重要的如何获取数据的问题以后,剩下的就仅仅是传递参数,构造合适的sql语句然后使用php从数据库内获取数据并显示了。以下我将用具体代码加以说明。

3、简单代码
请详细阅读以下代码,自己调试运行一次,最好把它修改一次,加上自己的功能,比如搜索等等。
 

代码如下:

<?php 
// * 512笔记网 wWw.512Pic.com
// 建立数据库连接 

$link = mysql_connect("localhost", "mysql_user", "mysql_password") 

or die("Could not connect: " . mysql_error()); 

// 获取当前页数 

if( isset( 

$_GET['page']) ){ 

$page = intval( 

$_GET['page'] ); 

} 

else{ 

$page = 1; 

} 

// 每页数量 

$PageSize = 10; 

// 获取总数据量 

$sql = "select count(*) as amount from table"; 

$result = mysql_query($sql); 

$row = mysql_fetch_row($result); 

$amount = $row['amount']; 

// 记算总共有多少页 

if( $amount ){ 

if( $amount < $page_size ){ $page_count = 1; } //如果总数据量小于$PageSize,那么只有一页 

if( $amount % $page_size ){ //取总数据量除以每页数的余数 

$page_count = (int)($amount / $page_size) + 1; //如果有余数,则页数等于总数据量除以每页数的结果取整再加一 

}else{ 

$page_count = $amount / $page_size; //如果没有余数,则页数等于总数据量除以每页数的结果 

} 

} 

else{ 

$page_count = 0; 

} 



// 翻页链接 

$page_string = ''; 

if( $page == 1 ){ 

$page_string .= '第一页|上一页|'; 

} 

else{ 

$page_string .= '<a href="/?page=1>";第一页</a>|<a href="/?page='."($page-1).'>上一页</a>|'; 

} 

if( ($page == $page_count) || ($page_count == 0) ){ 

$page_string .= '下一页|尾页'; 

} 

else{ 

$page_string .= '<a href="/?page='."($page+1).'>下一页</a>|<a href="/?page='."$page_count.'>尾页</a>'; 

} 

// 获取数据,以二维数组格式返回结果 

if( $amount ){ 

$sql = "select * from table order by id desc limit ". ($page-1)*$page_size .", $page_size"; 

$result = mysql_query($sql); 



while ( $row = mysql_fetch_row($result) ){ 

$rowset[] = $row; 

} 

}else{ 

$rowset = array(); 

} 

// 没有包含显示结果的代码,那不在讨论范围,只要用foreach就可以很简单的用得到的二维数组来显示结果 

?> 



4、OO风格代码
以下代码中的数据库连接是使用的pear db类进行处理
 

代码如下:

<?php 
// * 512笔记网 wWw.512Pic.com
// FileName: Pager.class.php 

// 分页类,这个类仅仅用于处理数据结构,不负责处理显示的工作 

Class Pager 

{ 

var $PageSize; //每页的数量 

var $CurrentPageID; //当前的页数 

var $NextPageID; //下一页 

var $PreviousPageID; //上一页 

var $numPages; //总页数 

var $numItems; //总记录数 

var $isFirstPage; //是否第一页 

var $isLastPage; //是否最后一页 

var $sql; //sql查询语句 



function Pager($option) 

{ 

global $db; 

$this->_setOptions($option); 

// 总条数 

if ( !isset($this->numItems) ) 

{ 

$res = $db->query($this->sql); 

$this->numItems = $res->numRows(); 

} 

// 总页数 

if ( $this->numItems > 0 ) 

{ 

if ( $this->numItems < $this->PageSize ){ $this->numPages = 1; } 

if ( $this->numItems % $this->PageSize ) 

{ 

$this->numPages= (int)($this->numItems / $this->PageSize) + 1; 

} 

else 

{ 

$this->numPages = $this->numItems / $this->PageSize; 

} 

} 

else 

{ 

$this->numPages = 0; 

} 



switch ( $this->CurrentPageID ) 

{ 

case $this->numPages == 1: 

$this->isFirstPage = true; 

$this->isLastPage = true; 

break; 

case 1: 

$this->isFirstPage = true; 

$this->isLastPage = false; 

break; 

case $this->numPages: 

$this->isFirstPage = false; 

$this->isLastPage = true; 

break; 

default: 

$this->isFirstPage = false; 

$this->isLastPage = false; 

} 



if ( $this->numPages > 1 ) 

{ 

if ( !$this->isLastPage ) { $this->NextPageID = $this->CurrentPageID + 1; } 

if ( !$this->isFirstPage ) { $this->PreviousPageID = $this->CurrentPageID - 1; } 

} 



return true; 

} 



/*** 

* 

* 返回结果集的数据库连接 

* 在结果集比较大的时候可以直接使用这个方法获得数据库连接,然后在类之外遍历,这样开销较小 

* 如果结果集不是很大,可以直接使用getPageData的方式获取二维数组格式的结果 

* getPageData方法也是调用本方法来获取结果的 

* 

***/ 



function getDataLink() 

{ 

if ( $this->numItems ) 

{ 

global $db; 



$PageID = $this->CurrentPageID; 



$from = ($PageID - 1)*$this->PageSize; 

$count = $this->PageSize; 

$link = $db->limitQuery($this->sql, $from, $count); //使用Pear DB::limitQuery方法保证数据库兼容性 



return $link; 

} 

else 

{ 

return false; 

} 

} 



/*** 

* 

* 以二维数组的格式返回结果集 

* 

***/ 



function getPageData() 

{ 

if ( $this->numItems ) 

{ 

if ( $res = $this->getDataLink() ) 

{ 

if ( $res->numRows() ) 

{ 

while ( $row = $res->fetchRow() ) 

{ 

$result[] = $row; 

} 

} 

else 

{ 

$result = array(); 

} 



return $result; 

} 

else 

{ 

return false; 

} 

} 

else 

{ 

return false; 

} 

} 



function _setOptions($option) 

{ 

$allow_options = array( 

'PageSize', 

'CurrentPageID', 

'sql', 

'numItems' 

); 



foreach ( $option as $key => $value ) 

{ 

if ( in_array($key, $allow_options) && ($value != null) ) 

{ 

$this->$key = $value; 

} 

} 



return true; 

} 

} 

?> 

 

代码如下:


<?php 
// * 512笔记网 wWw.512Pic.com
// FileName: test_pager.php 

// 这是一段简单的示例代码,前边省略了使用pear db类建立数据库连接的代码 

require "Pager.class.php"; 

if ( isset( 

$_GET['page']) ) 

{ 

$page = (int) 

$_GET['page']; 

} 

else 

{ 

$page = 1; 

} 

$sql = "select * from table order by id"; 

$pager_option = array( 

"sql" => $sql, 

"PageSize" => 10, 

"CurrentPageID" => $page 

); 

if ( isset( 

$_GET['numItems']) ) 

{ 

$pager_option['numItems'] = (int) 

$_GET['numItems']; 

} 

$pager = @new Pager($pager_option); 

$data = $pager->getPageData(); 

if ( $pager->isFirstPage ) 

{ 

$turnover = "首页|上一页|"; 

} 

else 

{ 

$turnover = "<a href='?page=1&numItems=".$pager->numItems."'>首页</a>|<a href="/?page=".$pager->PreviousPageID."&numItems=".$pager->numItems."'>上一页</a>|"; 

} 

if ( $pager->isLastPage ) 

{ 

$turnover .= "下一页|尾页"; 

} 

else 

{ 

$turnover .= "<a href="/?page=".$pager->NextPageID."&numItems=".$pager->numItems."'>下一页</a>|<a href="/?page=".$pager->numPages."&numItems=".$pager->numItems."'>尾页</a>"; 

} 

?> 



需要说明的地方有两个:

这个类仅仅处理数据,并不负责处理显示,因为我觉得将数据的处理和结果的显示都放到一个类里边实在是有些勉强。显示的时候情况和要求多变,不如自己根据类给出的结果处理,更好的方法是根据这个Pager类继承一个自己的子类来显示不同的分页,比如显示用户分页列表可以:
 

代码如下:


<?php 

Class MemberPager extends Pager 

{ 

function showMemberList() 

{ 

global $db; 



$data = $this->getPageData(); 

// 显示结果的代码 

// ...... 

} 

} 

/// 调用 

if ( isset( 

$_GET['page']) ) 

{ 

$page = (int) 

$_GET['page']; 

} 

else 

{ 

$page = 1; 

} 

$sql = "select * from members order by id"; 

$pager_option = array( 

"sql" => $sql, 

"PageSize" => 10, 

"CurrentPageID" => $page 

); 

if ( isset( 

$_GET['numItems']) ) 

{ 

$pager_option['numItems'] = (int) 

$_GET['numItems']; 

} 

$pager = @new MemberPager($pager_option); 

$pager->showMemberList(); 

?> 



第二个需要说明的地方就是不同数据库的兼容性,在不同的数据库里截获一段结果的写法是不一样的。
mysql: select * from table limit offset, rows
pgsql: select * from table limit m offset n
......
所以要在类里边获取结果的时候需要使用pear db类的limitQuery方法。

ok,写完收功,希望花时间看完这些文字的你不觉得是浪费了时间。

 

本文来自:http://www.512pic.com/173/13893-0.html

注:关于PHP 分页原理用法的内容就先介绍到这里,更多相关文章的可以留意512笔记的其他信息。

关键词:

您可能感兴趣的文章

上一篇:php 文章采集正则的简单示例
下一篇:PHP strtotime函数用法示例
热门文章
  • PHP 写入WRITE编码为UTF8的文件示例
  • PHP 中文字符串截取函数示例:支持gb2312,gbk,big
  • PHP 简单留言板的制作示例
  • 解决Fatal error: Call to undefined function mb_convert_encoding() in错误问题
  • PHP语言基础(标记、注释、变量、数组、常量、函数)示例
  • php 生成迅雷链接的简单示例
  • php 获取短网址的实现方法
  • PHP 通用分页类的简单示例
  • PHP 使用文件方式导入导出整个MYSQL数据库的实现方法
  • php 获取MYSQL错误的简单示例
  • 最新文章
    • 解决PHP使用redis实现统计缓存MySQL压力的问题
    • php 简单的上传进度条的简单示例
    • php 给html中引用的js和css路径打上版本号的实现方法
    • php 实现计算年龄精准到年月日的实例
    • php+ajax无刷新分页的简单示例
    • 解决php+ajax无刷新上传图片的问题
    • 解决PHP生成HTML静态页面的问题
    • 解决PHP使用uniqid函数生成唯一ID的问题
    • 解决PHP防刷票的一些问题
    • 微信access_token的获取开发的实现方法

512笔记收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。