仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1360|回复: 19
打印 上一主题 下一主题

[学习教程] PHP编程:PHP分页显示制造具体解说

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:28:19 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
即使你理解不了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、复杂代码
请具体浏览以下代码,本人调试运转一次,最好把它修正一次,加上本人的功效,好比搜刮等等。

<?php
// 创立数据库毗连
$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
// 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
// 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,写完收功,但愿花工夫看完这些文字的你不感觉是华侈了工夫。


  我的这套线路可能跟许多学习PHP的爱好者不谋而合,这也算是一个循序渐进的学习过程,不过新手不要看到上面的概括就以为学习蛮简单的,默默在此不得不对您稍微泼一下冷水,任何东西其实都不简单。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-10 19:56

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表