仓酷云

标题: PHP网站制作之PHP使用分页显示制造具体解说 [打印本页]

作者: 金色的骷髅    时间: 2015-2-4 00:11
标题: PHP网站制作之PHP使用分页显示制造具体解说
完成一个功能齐全的动态站点分页|显示    1、媒介
  分页显示是一种十分罕见的阅读和显示大批数据的办法,属于web编程中最常处置的事务之一。关于web编程的内行来讲,编写这类代码其实是和呼吸一样天然,然而关于初学者来讲,经常对这个成绩摸不着眉目,因而专程撰写此文对这个成绩停止具体的解说,力图让看完这篇文章的伴侣在看完今后关于分页显示的道理和完成办法有所懂得。本文合适初学者浏览,一切示例代码均利用php编写。
  2、道理
  所谓分页显示,也就是将数据库中的了局集工资的分红一段一段的来显示,这里需求两个初始的参数:
   每页几何笔记录($PageSize)?
   以后是第几页($CurrentPageID)?

  如今只需再给我一个了局集,我就能够显示某段特定的了局出来。
  至于其他的参数,好比:上一页($PreviousPageID)、下一页($下一页:php完成首页主动选择言语转跳ID)、总页数($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 $下一页:php完成首页主动选择言语转跳ID; //下一页
  var $PreviousPageID; //上一页
  var $numPages; //总页数
  var $numItems; //总纪录数
  var $isFirstPage; //是不是第一页
  var $is上一页:PHP和JAVA的XML-RPC中文成绩处理举措; //是不是最初一页
  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->is上一页:PHP和JAVA的XML-RPC中文成绩处理举措 = true;
     break;
    case 1:
     $this->isFirstPage = true;
     $this->is上一页:PHP和JAVA的XML-RPC中文成绩处理举措 = false;
     break;
    case $this->numPages:
     $this->isFirstPage = false;
     $this->is上一页:PHP和JAVA的XML-RPC中文成绩处理举措 = true;
     break;
    default:
     $this->isFirstPage = false;
     $this->is上一页:PHP和JAVA的XML-RPC中文成绩处理举措 = false;
   }

   if ( $this->numPages > 1 )
   {
    if ( !$this->is上一页:PHP和JAVA的XML-RPC中文成绩处理举措 ) { $this->下一页:php完成首页主动选择言语转跳ID = $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->is上一页:PHP和JAVA的XML-RPC中文成绩处理举措 )
{
 $turnover .= "下一页|尾页";
}
else
{
 $turnover .= "<a href='?page=".$pager->下一页:php完成首页主动选择言语转跳ID."&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办法。

如果你单纯是为了做网站赚钱,我想你还是别学php的好,去学ASP,JSP好了,毕竟它们有实力雄厚的公司去支持它们。
作者: 金色的骷髅    时间: 2015-2-4 09:56
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
作者: 不帅    时间: 2015-2-9 21:59
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
作者: 仓酷云    时间: 2015-2-27 22:45
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
作者: 透明    时间: 2015-3-9 14:54
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
作者: 深爱那片海    时间: 2015-3-13 05:37
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
作者: 小魔女    时间: 2015-3-17 04:11
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
作者: 乐观    时间: 2015-3-18 02:10
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
作者: 飘灵儿    时间: 2015-3-21 23:00
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
作者: 变相怪杰    时间: 2015-3-27 16:52
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
作者: 简单生活    时间: 2015-3-28 07:25
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
作者: 活着的死人    时间: 2015-4-3 22:05
写的比较杂,因为我也是个新手,不当至于大家多多指正。
作者: 冷月葬花魂    时间: 2015-4-18 20:22
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
作者: 老尸    时间: 2015-4-19 06:55
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
作者: 莫相离    时间: 2015-4-25 19:42
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
作者: 因胸联盟    时间: 2015-4-27 15:12
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
作者: 第二个灵魂    时间: 2015-5-1 00:51
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
作者: 飘飘悠悠    时间: 2015-5-2 02:56
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
作者: 小女巫    时间: 2015-5-4 10:22
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
作者: 再现理想    时间: 2015-5-12 12:44
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2