喜悦国际村 » 喜悦原创 » 与数据库分离的分页类

页: [1]
lwter2006-7-15 05:52 AM
与数据库分离的分页类

[php]

<?
///////////////////////////////////////
//    FileName: page.class.php
// Last Update: 2006-06-18
///////////////////////////////////////
/*
** 版    本:1.0
** 数 据 库:postgresql
** 制作日期:2006-06-18
** 程序设计:neway lwter 刘伟韬 ([email]lwter@sina.com[/email])
** 如您使用本程序,请保留以上信息。
*/
?>
<?
    /**
     * 显示效果
     *
     *   <<   1 2 [3] 4 5  ...  100      >>
     *  上一页  显示前5页        最后一页   下一页
     *
     *   <<   1  ...  96 97 98 [99] 100  >>
     *  上一页 第一页       显示后5页       下一页
     *
     *   <<   1  ... [5] 6 7 8 9  ... 100   >>
     *  上一页 第一页  显示中间5页     最后一页 下一页
     *
     *  
     */
   
    class page {
        var $numberPerPage = 30;                            // 每页显示记录
        var $prv  = '&lt;';                                 // 上一条记录样式
        var $next = '&gt;';                                 // 下一条记录样式
        var $omit = '<span class="break">...</span>';   
        var $visitedStar = '<span class="this-page">';      // 当前记录不显示链接开始标记
        var $visitedEnd  = '</span>';                       // 当前记录不显示链接结束标记
        var $startpage = 0;                                 // 数据记录开始
        var $sbar = '';                                     // 主要用于显示 1 ... [6][7]8[9][10] ... 100 的样式
        var $sBarInfo = '';                                 // 导航信息显示,如 总有1000条记录,有14页。。。
        var $url;                                           // 当前页的URL
        var $adjustNumber = 2;                              // 对当前页码进行正负调整, 例: 当前页码是8 , $adjustNumber =  2, 那么显示 [6][7]8[9][10]
        var $prvpage  = 1;                                  // 前一页码 当前页码 - $adjustNumber
        var $nextpage = 1;                                  // 后一页码 当前页码 + $adjustNumber
        var $sE = '';                                       // 显示1
        var $sT = '';                                       // 显示最后页码
        
        /**
         * 初始函数
         *
         * @param int $totalRecord
         * @param int $page
         * @return page
         */
        function pageBar($totalRecord,$page) {
            $pages = ceil($totalRecord/$this->numberPerPage);
            $page = ($page > $pages) ? $pages:$page;
            
            $this->prvpage  = $page - $this->adjustNumber;
            $this->nextpage = $page + $this->adjustNumber;
            
            $this->prvpage  = ($this->prvpage <=1) ? 1:$this->prvpage;
            $this->nextpage = ($this->nextpage >= $pages) ? $pages:$this->nextpage;
            $this->prvpage  = ($this->nextpage >= $pages) ? $pages - $this->adjustNumber:$this->prvpage;
            $this->prvpage  = ($this->prvpage <=1) ? 1:$this->prvpage;
            
            for ($i=$this->prvpage;$i<=$this->nextpage;$i++) {
                if ($page > 1) {
                    $prv = '<a href="'.$this->url.'&page='.($page-1).'" title="第 '.($page-1).' 页">&lt;&lt;</a>';
                } else {
                    $prv = '';
                }
                if ($page < $pages) {
                    $end = '<a href="'.$this->url.'&page='.($page+1).'" title="第 '.($page+1).' 页">&gt;&gt;</a>';
                } else {
                    $end = '';
                }
                if ($page - $this->adjustNumber <=1 ) {
                        $this->sT = '';
                        $this->sE = $this->omit.'<a href="'.$this->url.'&page='.$pages.'" title="第 '.$pages.' 页">'.$pages.'</a>';
                } else if ($page + $this->adjustNumber >= $pages) {
                        $this->sT = '<a href="'.$this->url.'&page=1" title="第 1 页">1</a>'.$this->omit;
                        $this->sE = '';
                } else {
                        $this->sT = '<a href="'.$this->url.'&page=1" title="第 1 页">1</a>'.$this->omit;
                        $this->sE = $this->omit.'<a href="'.$this->url.'&page='.$pages.'" title="第 '.$pages.' 页">'.$pages.'</a>';
                }
                if ($i == $page) {
                        $this->sbar .= $this->visitedStar.$i.$this->visitedEnd;
                } else {
                        $this->sbar .= '<a href="'.$this->url.'&page='.$i.'" title="第 '.$i.' 页">'.$i.'</a>';
                }
            }
            
            $this->startpage = ($page-1)*$this->numberPerPage;
            $lastrecord = (($this->startpage + $this->numberPerPage) > $totalRecord) ? $totalRecord:($this->startpage + $this->numberPerPage);
            $this->sBarInfo = "共 <strong>$totalRecord</strong> 条记录 每页 <strong>$this->numberPerPage</strong> 条记录 共 <strong>$pages</strong> 页 当前显示 <strong>".($this->startpage + 1)."</strong> - <strong>".$lastrecord."</strong> 条记录<br />";
            $this->sbar = $prv.$this->sT.$this->sbar.$this->sE.$end;
        }
        
        
        /**
         * 取得导航信息
         *
         * @return string
         */
        function getBarInfo() {
            return $this->sBarInfo;
        }
        
        /**
         * 取得导航栏
         *
         * @return string
         */
        function getPageBar() {
            return $this->sbar;
        }
        
        /**
         * 取得开始记录
         *
         * @return int
         */
        function getStartPage() {
            return $this->startpage;
        }
    }
?>

<?
     /** 以下调用 */
    require_once('config.php');            // 这里页用   define('PAGENO',10);  define('BARLEN',2);
    require_once('page.class.php');
    require_once('db.class.php');         // 这个页面省略
   
    $totalRecord = 1000  // 从数据库获取
    $page = (isset($_GET['page']) && ($_GET['page'] > 1)) ? $_GET['page']:1;

    $page  = &new page() ;
    $page->pageBar($totalRecord,$page)
    $page->numberPerPage  = PAGENO ;
    $page->adjustNumber     = BARLEN;


    注:数据库
           $sql = "SELECT * FROM database LIMIT ".$page->getStartPage() .",".PAGENO;                 // mysql
           $sql = "SELECT * FROM database LIMIT ".PAGENO." OFFSET ".$page->getStartPage() ;    // postgresql

    $page->getBarInfo() ;    // 导航信息栏
    $page->getPageBar() ;   // 数字栏 [1] ... [5][6]7[8][9] ... 1000
   

?>
[/php]

[[i] 本帖最后由 lwter 于 2006-7-15 01:59 PM 编辑 [/i]]

qh6632006-7-15 08:34 AM
支持下原创!
分页类一直以来就是个简单的难道。如同大家使用的程序一样,结构与算法要不断改进。
如果一个简单的分页类可以设计成下面这样:
[php]
$page = new page('page');//初始化传递变量
$page->initializtion(1000,20);//计算分页所要生成变量或字符,1000是记录总条数,20是每页条数
$sql = "SELECT * FROM database LIMIT ".$page->star() .",20";
.....
echo $page->page();//输出分页字符
[/php]
让$_GET['page']之类的,放在分页类内部去操作。可选的一些功能如:
$page->number = 10;//分页链接显示个数[数字],控制如果等于4,就显示4个数字,如:[5][6]7[8][9]
$page->style = 1;//选择样式
其余的操作都让分页类来做,这样,分页用起来就很爽!

angeljyt2006-7-15 11:20 AM
分页类与数据库无关,分页类只充当个控制器来控制数据进行查询。以后可以实现自定义分页样式。

lwter2006-7-15 12:21 PM
回复 #2 qh663 的帖子

其实$_GET['page']只是一个事件,他不属于分页类,其实应用那里我可能误导了大家,$page 搞成相同的了不好意思,重新说明一下。

[php]
<?
     /** 以下调用 */
    require_once('config.php');            // 这里页用   define('PAGENO',10);  define('BARLEN',2);
    require_once('page.class.php');
    require_once('db.class.php');         // 这个页面省略
   
    $totalRecord = 1000  // 从数据库获取
    $page = (isset($_GET['page']) && ($_GET['page'] > 1)) ? $_GET['page']:1;

    $PG = &new page() ;
    $PG->url = 'whatyouwant.php'  ;        // 这里 写掉了 :(
    $PG->pageBar($totalRecord,$page);
    $PG->numberPerPage  = PAGENO ;  // 自定义页数    不加这句的就是用类默认的30
    $PG->adjustNumber     = BARLEN;   // 控制正负长度  不加这句的就是用类默认的2
                                                              // 重说下这里的作用   当BARLEN=2时    样式如  [5][6]7[8][9]
                                                              // 当BARLEN = 3 时  样式如 [4][5][6]7[8][9][10] ,以此类推..,

    注:数据库
           $sql = "SELECT * FROM database LIMIT ".$PG->getStartPage() .",".PAGENO;                 // mysql
           $sql = "SELECT * FROM database LIMIT ".PAGENO." OFFSET ".$PG->getStartPage() ;    // postgresql

    $PG->getBarInfo() ;    // 导航信息栏
    $PG->getPageBar() ;   // 数字栏 [1] ... [5][6]7[8][9] ... 1000
   
    // 定义链接的样式可以通过css 定义做出你想要的效果 , 大家看到的 <span class="this-page">  $page </span> ,
?>

[/php]

字符分页,迟点再完善。 欢迎大家提出更好的想法 :)

coolhpy2006-7-17 01:23 PM
呵呵```最近好像兴起一股发分页类的热潮嘛


查看完整版本: 与数据库分离的分页类


Powered by Discuz! Archiver 6.1.0  © 2001-2006 Comsenz Inc.
Processed in 0.008483 second(s), 2 queries