PHP应用分页显示制作详细讲解_php基础_脚本之家

for ($j=$a; $j$a+$pageNum; $j++) { if ($j$amountPage) break; if
($j==$page) $urlArray[]= ‘[‘.$j.’]’; else $urlArray[]= a
href=’talk.php?id=.$j.’ [.$j.] /a; }//}

<?php // 建立数据库连接 $link = mysql_connect(“localhost”,
“mysql_user”, “mysql_password”) or die(“Could not connect: ” .
mysql_error; // 获取当前页数 if ){ $page = intval; } else{ $page = 1; }
// 每页数量 $PageSize = 10; // 获取总数据量 $sql = “select count as
amount from table”; $result = mysql_query; $row = mysql_fetch_row;
$amount = $row[‘amount’]; // 记算总共有多少页 if{ if( $amount <
$page_size ){ $page_count = 1; }
//如果总数据量小于$PageSize,那么只有一页 if( $amount % $page_size ){
//取总数据量除以每页数的余数 $page_count = + 1;
//如果有余数,则页数等于总数据量除以每页数的结果取整再加一 }else{
$page_count = $amount / $page_size;
//如果没有余数,则页数等于总数据量除以每页数的结果 } } else{
$page_count = 0; }

function getPage() //得到当前页面数 { $id= trim($_GET[‘id’]);
//当前页面id$this-getAmount(); //得到总数据数$amountPage=
$this-getAmountPage(); //总页数 if (isset($id) $id0) //如果参数id存在
并且 参数id大于0 $this-page= intval($id); //取其整数部分else
$this-page=1; //将1赋给当前页面

1、前言

function getPageLinks()
//得到当前页面显示的所有的链接,并以数组的形式返回 {$amountPage=
$this-amountPage; //总页面数$pageNum= $this-pageNum;
//每页显示的链接数$page= $this-page; //当前页数$urlArray= array();if
($page1) //如果当前页面数大于1{ $urlArray[]= a href=’talk.php?id=1′
[|] /a; $urlArray[]= a href=’talk.php?id=.($page-1).’ [] /a;}else{
$urlArray[]= ‘[|]’; $urlArray[]= ‘[]’;}

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

?php/*******************************************writer:zhaofei299Emai:zhaofei299@163.com百度空间:*******************************************/class
Page { var $pageSize;//每页显示的数据数 var $page;//当前页面数 var
$amount; //总数据数 var $amountPage; //总页数 var $pageNum;
//每页显示的链接数

function _setOptions { $allow_options = array( ‘PageSize’,
‘CurrentPageID’, ‘sql’, ‘numItems’ );

if (isset($id) ($id$amountPage))//如果参数id存在 并且 参数id大于总页数
$this-page=$amountPage; //将总页数赋给当前页数 } function getStart()
//得到LIMIT数据 开始的索引 { $start= ($this-page-1)*5;return $start;
//返回开始索引 }

$PageID = $this->CurrentPageID;

function getAmount() //得到总数据数 {$sql= SELECT count(*) as count
FROM talk_info; //查询$result= mysql_query($sql); $reArray=
mysql_fetch_array($result); return $this-amount= $reArray[‘count’];
//总数据数 }

mysql: select * from table limit offset, rowspgsql: select * from
table limit m offset n……

$p= intval($page/5)+1; //区间$a= ($p-1)*5+1;

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

function getAmountPage() //得到总页数 { $this-amountPage=
$this-amount/$this-pageSize; //总页数= 总数据数 / 每页显示数据数if
(!is_int($this-amountPage)) //如果计算得到的总页数不是整形
$this-amountPage= intval($this-amountPage)+1; //取其整数部分+1; return
$this-amountPage; }

第二个需要说明的地方就是不同数据库的兼容性,在不同的数据库里截获一段结果的写法是不一样的。

function __construct($size, $pageNum) //构造函数,初始化成员属性 {
$this-pageSize= $size; //每页显示数据数$this-amount= 0;$this-ampuntPage=
0; $this-pageNum=$pageNum;
//每页显示多少页数链接link_data();//连接数据库 }

return true; }}?><?php// FileName: test_pager.php//
这是一段简单的示例代码,前边省略了使用pear db类建立数据库连接的代码
require “Pager.class.php”; if ){ $page = $_GET[‘page’];}else{ $page =
1;} $sql = “select * from table order by id”; $pager_option = array(
“sql” => $sql, “PageSize” => 10, “CurrentPageID” => $page); if (
isset{ $pager_option[‘numItems’] = $_GET[‘numItems’];} $pager =
@new Pager; $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 {
$turnover .= “下一页|尾页”;}else{ $turnover .= “<a
href=’?page=”.$pager->NextPageID.”&numItems=”.$pager->numItems.”‘>下一页</a>|<a
href=’?page=”.$pager->numPages.”&numItems=”.$pager->numItems.”‘>尾页</a>”;}?>

if ($page$amountPage) //当前页面数小于总页面数{ $urlArray[]= a
href=’talk.php?id=.($page+1).’ [] /a; $urlArray[]= a
href=’talk.php?id=.$amountPage.’ [|] /a; }else{ $urlArray[]= ‘[]’;
$urlArray[]= ‘[|]’;}return $urlArray; //返回包含所有链接的数组 }}?

4、OO风格代码

function getInfo($start, $sql)
//得到数据表中的数据信息,并以数组的形式返回 {$array=array();
//初始化数组$result= mysql_query($sql); //执行sql语句while (@$reArray=
mysql_fetch_array($result)) //从数据表中取出一行,作相关,索引数组操作 {
$array[]= $reArray; //将包含数据信息的数组添加入新的数组中}return
$array; //返回一个二维数组 }

<?phpClass MemberPager extends Pager{ function showMemberList() {
global $db;

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; }

function getPageData() { if { if ( $res = $this->getDataLink { if {
while ( $row = $res->fetchRow { $result[] = $row; } } else { $result
= array(); }

select * from table limit * $PageSize, $PageSize

function Pager { global $db; $this->_setOptions; // 总条数 if ( !isset
{ $res = $db->query; $this->numItems = $res->numRows(); } // 总页数
if ( $this->numItems > 0 ) { if ( $this->numItems < $this->PageSize
){ $this->numPages = 1; } if ( $this->numItems % $this->PageSize ) {
$this->numPages= ($this->numItems / $this->PageSize) + 1; } else {
$this->numPages = $this->numItems / $this->PageSize; } } else {
$this->numPages = 0; }

foreach ( $option as $key => $value ) { if ( in_array && {
$this->$key = $value; } }

2、原理

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

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

/*** * * 返回结果集的数据库连接 *
在结果集比较大的时候可以直接使用这个方法获得数据库连接,然后在类之外遍历,这样开销较小
*
如果结果集不是很大,可以直接使用getPageData的方式获取二维数组格式的结果
* getPageData方法也是调用本方法来获取结果的 * ***/

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

3、简单代码

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

return true; }

需要说明的地方有两个:

以mysql数据库为例,如果要从表内截取某段内容,sql语句可以用:select *
from table limit offset,
rows。看看下面一组sql语句,尝试一下发现其中的规率。

所以要在类里边获取结果的时候需要使用pear db类的limitQuery方法。

function getDataLink() { if { global $db;

return $link; } else { return false; } }

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

至于其他的参数,比如:上一页、下一页、总页数等等,都可以根据前边这几个东西得到。

<?php // 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查询语句

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

// 翻页链接 $page_string = ”; if{ $page_string .= ‘第一页|上一页|’; }
else{ $page_string .= ‘<a href=?page=1>第一页</a>|<a
href=?page=’..’>上一页</a>|’; } if( || { $page_string .=
‘下一页|尾页’; } else{ $page_string .= ‘<a
href=?page=’..’>下一页</a>|<a
href=?page=’.$page_count.’>尾页</a>’; } //
获取数据,以二维数组格式返回结果 if{ $sql = “select * from table order
by id desc limit “. *$page_size .”, $page_size”; $result =
mysql_query;

while ( $row = mysql_fetch_row{ $rowset[] = $row; } }else{ $rowset =
array(); } //
没有包含显示结果的代码,那不在讨论范围,只要用foreach就可以很简单的用得到的二维数组来显示结果?>

每页多少条记录? 当前是第几页?

$data = $this->getPageData(); // 显示结果的代码 // …… }} /// 调用if
){ $page = $_GET[‘page’];}else{ $page = 1;} $sql = “select * from
members order by id”; $pager_option = array( “sql” => $sql, “PageSize”
=> 10, “CurrentPageID” => $page); if ( isset{
$pager_option[‘numItems’] = $_GET[‘numItems’];} $pager = @new
MemberPager; $pager->showMemberList();?>

return $result; } else { return false; } } else { return false; } }

现在只要再给我一个结果集,我就可以显示某段特定的结果出来。

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

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

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注