代码之家  ›  专栏  ›  技术社区  ›  Lizard

php分页类

  •  4
  • Lizard  · 技术社区  · 14 年前

    我正在寻找一个php分页类,我在过去使用过一个相当简单的类,它不再受支持。

    我想知道有没有人有什么建议?

    当可能有那么多好的东西在那里的时候,建立我自己的似乎是没有意义的。

    7 回复  |  直到 6 年前
        1
  •  5
  •   Travis    14 年前

    我建议 Zend_Paginator 原因如下

    • 它是松散耦合的,不需要整个库。
    • zf社区比pear社区大,并且正在积极地对代码运行安全审计,并发布维护版本。
    • 它使用适配器模式分离数据源,文档中有许多前端ui模式实现的示例。
        2
  •  5
  •   Lizard    14 年前

    经过更多的搜索,我决定在使用框架版本之前,我应该完全理解分页器所涉及的内容。所以我自己做了一个。不过,谢谢你的建议!

        3
  •  2
  •   Jordan Running    14 年前

    你试过了吗 PEAR::Pager ?使用示例 here .

        4
  •  1
  •   Sam Adams    8 年前

    你可以试试这个: zebra_pagination,一个通用的、与twitter引导程序兼容的、用php编写的分页类 请检查以下链接: http://stefangabos.ro/php-libraries/zebra-pagination

        5
  •  1
  •   Robert    8 年前
    // pagination class
    class Pagination
    {
        // database handle
        private $dbh;
    
        // total records in table
        private $total_records;
    
        // limit of items per page
        private $limit;
    
        // total number of pages needed
        private $total_pages;
    
        // first and back links
        private $firstBack;
    
        // next and last links
        private $nextLast;
    
        // where are we among all pages?
        private $where;
    
        public function __construct($dbh) {
            $this->dbh = $dbh;
        }
    
        // determines the total number of records in table
        public function totalRecords($query, array $params)
        {
            $stmt = $this->dbh->prepare($query);
            $stmt->execute($params);
            $this->total_records = $stmt->fetchAll(PDO::FETCH_COLUMN)[0];
    
            if (!$this->total_records) {
                echo 'No records found!';
                return;
            }
        }
    
        // sets limit and number of pages
        public function setLimit($limit)
        {
            $this->limit = $limit;
    
            // determines how many pages there will be
            if (!empty($this->total_records)) {
                $this->total_pages = ceil($this->total_records / $this->limit);
            }
        }
    
        // determine what the current page is also, it returns the current page
        public function page()
        {
            $pageno =  (int)(isset($_GET['pageno'])) ? $_GET['pageno'] : $pageno = 1;
    
            // out of range check
            if ($pageno > $this->total_pages) {
                $pageno = $this->total_pages;
            } elseif ($pageno < 1) {
                $pageno = 1;
            }
    
            // links
            if ($pageno > 1) {
                // backtrack
                $prevpage = $pageno -1;
    
                // 'first' and 'back' links
                $this->firstBack = "<div class='first-back'><a href='$_SERVER[PHP_SELF]?pageno=1'>First</a> <a href='$_SERVER[PHP_SELF]?pageno=$prevpage'>Back</a></div>";
            }
    
            $this->where =  "<div class='page-count'>(Page $pageno of $this->total_pages)</div>";
    
            if ($pageno < $this->total_pages) {
                // forward
                $nextpage = $pageno + 1;
    
                // 'next' and 'last' links
                $this->nextLast =  "<div class='next-last'><a href='$_SERVER[PHP_SELF]?pageno=$nextpage'>Next</a> <a href='$_SERVER[PHP_SELF]?pageno=$this->total_pages'>Last</a></div>";
            }
    
            return $pageno;
        }
    
        // get first and back links
        public function firstBack()
        {
            return $this->firstBack;
        }
    
        // get next and last links
        public function nextLast()
        {
            return $this->nextLast;
        }
    
        // get where we are among pages
        public function where()
        {
            return $this->where;
        }
    }
    

    用途:

    $pagination = new Pagination($dbh);
    $pagination->totalRecords('SELECT COUNT(*) FROM `photos` WHERE `user` = :user', array(':user' => $_SESSION['id']));
    $pagination->setLimit(12);
    $pagination->page();
    echo $pagination->firstBack();
    echo $pagination->where();
    echo $pagination->nextLast();
    

    结果:

    <div class='first-back'><a href='/xampp/web_development/new_study_2014/imagebox2016/app/public/test.php?pageno=1'>First</a> <a href='/xampp/web_development/new_study_2014/imagebox2016/app/public/test.php?pageno=3'>Back</a></div>
    <div class='page-count'>(Page 4 of 6)</div>
    <div class='next-last'><a href='/xampp/web_development/new_study_2014/imagebox2016/app/public/test.php?pageno=5'>Next</a> <a href='/xampp/web_development/new_study_2014/imagebox2016/app/public/test.php?pageno=6'>Last</a></div>
    
        6
  •  1
  •   Joe    7 年前
    public function make_pagination()
        {
    
        $total = 0;
        $query = "SELECT COUNT(downloads.dn_id) FROM downloads WHERE downloads.dn_type = 'audios'";
        $stmt = $this->conn->prepare($query);
        $stmt->execute();
        $total = $stmt->fetchColumn();
        //echo 'row_count = ' . $total;
    
        // How many items to list per page
        $limit = 11;
    
        // How many pages will there be
        $pages = ceil($total / $limit);
    
        // What page are we currently on?
        $page = min($pages, filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, array(
            'options' => array(
                'default'   => 1,
                'min_range' => 1,
            ),
        )));
    
        // Calculate the offset for the query
        $offset = ($page - 1)  * $limit;
    
        // Some information to display to the user
        $start = $offset + 1;
        $end = min(($offset + $limit), $total);
    
        // The "back" link
        $prevlink = ($page > 1) ? '<a href="?page=1" title="First page">&laquo;</a> <a href="?page=' . ($page - 1) . '" title="Previous page">&lsaquo;</a>' : '<span class="disabled">&laquo;</span> <span class="disabled">&lsaquo;</span>';
        // The "forward" link
        $nextlink = ($page < $pages) ? '<a href="?page=' . ($page + 1) . '" title="Next page">&rsaquo;</a> <a href="?page=' . $pages . '" title="Last page">&raquo;</a>' : '<span class="disabled">&rsaquo;</span> <span class="disabled">&raquo;</span>';
        // Display the paging information
        echo '<div id="paging"><p>'.$prevlink.' Page '.$page.' of '.$pages. ' pages'. $nextlink.' </p></div>';
    
    
        //prepare the page query
        $query2 = "  
                    SELECT * FROM downloads, map_artists, song_artists
                    WHERE map_artists.dn_id = downloads.dn_id 
                    AND song_artists.artist_id = map_artists.artist_id 
                    AND downloads.dn_type = 'audios' GROUP BY downloads.dn_id 
                    ORDER BY downloads.dn_time DESC LIMIT :limit OFFSET  :offset ";
    
    
        $stmt2 = $this->conn->prepare($query2);
        $stmt2->bindParam(':limit', $limit, PDO::PARAM_INT);
        $stmt2->bindParam(':offset', $offset, PDO::PARAM_INT);
        $stmt2->execute();
    
        // Do we have any results?
        if ($stmt2->rowCount() > 0) {
            // Define how we want to fetch the results
            $stmt2->setFetchMode(PDO::FETCH_ASSOC);
            $iterator = new IteratorIterator($stmt2);
    
            // Display the results
            foreach ($iterator as $row) {
                echo '<p>'. $row['dn_title'].' - '. $row['artist_name'].'</p>';
            }
    
        } else {
            echo '<p>No results could be displayed.</p>';
        }
    
    
    
    }
    
        7
  •  0
  •   Ahmed Mohamed    7 年前

    很可能您的sql select语句查询可能会导致1000条记录。但是在一个页面上显示所有结果不是一个好主意。所以我们可以根据需要将这个结果分成多个页面作为分页类。

    使用分页类分页数据非常容易

    分页类有助于生成分页

    如何使用分页类 访问此链接以获取更多信息 http://utlearn.com/2017/02/15/pagination-class-use-pagination-class/

    <?php
    
    /**
     * @package pagination class
     * @version 1.0
     */
    /*
    @class Name: pagination 
    @Author: Ahmed Mohamed
    @Version: 1.0
    @Author URI: https://www.fb.com/100002349977660
    @Website URI: http://www.utlearn.com
    @class page URI:  http://utlearn.com/2017/02/15/pagination-class-use-pagination-class
    */
    
    
    include_once 'libs/config.php';
    include_once 'libs/Database.php';
    include_once 'libs/Model.php';
    include_once 'libs/pagination.php';
    if(!empty($_GET["page"]) and is_numeric($_GET["page"])){
        $page = htmlspecialchars(strip_tags($_GET["page"]));
    }  else {
        $page = 1;
    }
    // news = table name / you page URL / current page / true or false for full query
    // its false i just use table name  
    $pag = new pagination("news", URL."?page=", 3, $page, false);
    $pagination = $pag->pagination();
    $data = $pag->data();
    
    ?>
    <news>
        <?php foreach($data as $news){ ?>
        <header><h1><?=$news->title ?></h1> | <span><?=$news->date ?></span></header>
        <div>
            <?=$news->content ?>
        </div>
        <?php } ?>
    </news>
    <?=$pagination ?>