search
HomeBackend DevelopmentPHP TutorialPHP分页显示制作详细讲解_PHP

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

// 建立数据库连接
$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 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 .= '第一页|上一页|';
}
if( ($page == $page_count) || ($page_count == 0) ){
$page_string .= '下一页|尾页';
}
else{
$page_string .= '下一页|尾页';
}
// 获取数据,以二维数组格式返回结果
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类进行处理

// 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 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;
}
}
?>
// 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 = "首页|上一页|";
}
if ( $pager->isLastPage )
{
$turnover .= "下一页|尾页";
}
else
{
$turnover .= "下一页|尾页";
}
?>

需要说明的地方有两个:

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

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,写完收功,希望花时间看完这些文字的你不觉得是浪费了时间。

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
PPT制作胶卷移动效果的具体方法PPT制作胶卷移动效果的具体方法Mar 26, 2024 pm 04:00 PM

1、启动PPT,新建一个空白文档,选择所有的文本框将其删除。2、执行插入-形状命令,在文档中拖拽出一个长方形,形状颜色填充为黑色。3、拖拽长方形将其拉长,执行插入-形状命令,拖拽出小正方形,设置填充颜色为白色。4、依次复制粘帖小正方形,使上下均匀分布在胶卷两侧,ctrl+a选择所有的之后,右键单击选择组合。5、执行插入-图片命令,在弹出的对话框中找到需插入的图片,点击打开,调整图片大小和位置。6、重复步骤5依次将其余的图片进行插入并设置,形成一个胶卷图片的形式。7、选择胶卷,执行动画-添加动画命

番茄小说封面怎么制作番茄小说封面怎么制作Feb 23, 2024 pm 01:55 PM

番茄小说封面怎么制作?番茄小说中是可以制作专属的小说封面,但是多数的小伙伴不知道番茄小说当中的封面该如何的制作,接下来就是小编为玩家带来的番茄小说封面制作方法图文教程,感兴趣的玩家快来一起看看吧!番茄小说使用教程番茄小说封面怎么制作1、首先打开番茄小说APP,进入到作品管理页面创建新书,选择下图箭头所示的【封面模板】;2、然后进入到封面模板页面,选择喜爱的封面模板;3、最后选择封面完成之后点击右上角【确认】即可。

创建手机端Excel表格操作指南创建手机端Excel表格操作指南Feb 18, 2024 pm 02:41 PM

手机Excel表格制作教程随着移动设备的普及和技术的不断进步,手机成为了我们日常生活和工作中不可或缺的工具之一。在手机上使用Excel表格,可以方便地进行数据记录、计算和分析,提高工作效率。本文将为大家分享手机Excel表格制作的基本操作和技巧。一、选择合适的应用程序目前市面上有很多可供选择的手机Excel应用程序,例如GoogleSheets、Micro

我来教你!PPT制作动画效果的方法!我来教你!PPT制作动画效果的方法!Mar 20, 2024 pm 06:40 PM

制作PPT的时候使用一些动画效果会比没有使用动画效果的显得活泼可爱,加上动画效果大家也许就喜欢看这个PPT,所以我们必须要学会PPT制作动画效果的方法。接下来,我将为大家详细介绍如何在PPT中添加动画效果。请继续往下阅读,认真学习这些步骤,相信对你会有所帮助!首先,打开我们自己制作的PPT,您会注意到这个PPT目前没有任何动画效果(如下图红色箭头所示)。2.然后,我们需要给图片添加动画效果,我们先选中图片,再单击菜单栏上边的【动画】按钮,(如下图红色圈出部分所示)。3.接下来,我们点击动画里边的

怎么制作word封面怎么制作word封面Mar 19, 2024 pm 06:50 PM

一篇毕业论文一定要有封面、有目录、有结尾等等,这才能说明一篇论文是完整的。上期小编已经给小伙伴们分享了word怎么制作目录啦,这期给大家分享word封面的制作方法,不会制作的赶紧快来吧!1.首先,我们打开自己想要制作封面的word文档,如下图所示:2.然后,我们点击菜单栏上【章节】按钮,选择封面页,这个功能相当于一个封面库,你可以在里面自行挑选合适精美的封面,如下图红色圈出部分所示:3.点击后,你可以看到各种类型的封面,比如商务类型,适合公司合同、文档;简历类型,适合找工作投简历的朋友等等,还可

ppt怎么做 做ppt的流程是怎样的ppt怎么做 做ppt的流程是怎样的Feb 22, 2024 pm 05:00 PM

在软件中点击插入选项,新建空白演示文稿后输入主题和正文,设置文字和对象的放映顺序即可。教程适用型号:联想AIO520C系统:Windows10专业版版本:PowerPoint2022解析1打开PPT以后单击文件选项,选择新建空白演示文稿。2输入主题和正文,添加音频、图片、视频等效果。3最后按照要求设置文字和对象的放映顺序以及动画效果即可。补充:ppt中怎么插入视频1首先点击打开PowerPoint软件,进入后点击左上角插入选项。2接着点击右上角的视频选项。3弹出选框,点击来自文件的影片。4然后选

如何使用CSS制作倒计时效果的实现步骤如何使用CSS制作倒计时效果的实现步骤Oct 26, 2023 am 10:36 AM

如何使用CSS制作倒计时效果的实现步骤倒计时效果是网页开发中常见的一个功能,可以为用户呈现倒计时的动态效果,给人以紧迫感和期待感。本文将介绍如何使用CSS来实现倒计时效果,并给出详细的实现步骤和代码示例。实现步骤如下:步骤一:HTML结构搭建首先,在HTML中创建一个div容器,用于包裹倒计时的内容。例如:<divclass="countd

我可以用Python制作游戏吗?我可以用Python制作游戏吗?Sep 23, 2023 pm 09:21 PM

Python显然对技术和编程社区产生了重大影响。然而,您是否考虑过使用Python来创建游戏?答案是毫无疑问是的!Python作为一种灵活而强大的编程语言已得到越来越多的认可。数据分析、人工智能、Web开发,Python的队列不胜枚举。嗯,Python的游戏开发也不例外。Python丰富的库和框架是其显着特征之一,使其成为游戏创建的绝佳选择。这些资源使制作游戏和实现您的想法变得更加简单。Python简单易懂的语法使其成为游戏开发的理想选择。因此,各个级别的程序员都可以使用Python,从初学者到

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft