PHP pagination class

2019-01-19 23:54发布

I am looking for a php pagination class, I have used a rather simple one in the past and it is no longer supported.

I was wondering if anyone had any recommendations ?

It seems pointless to build my own when there are probably so many good ones out there.

7条回答
贪生不怕死
2楼-- · 2019-01-20 00:13
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>';
    }



}
查看更多
孤傲高冷的网名
3楼-- · 2019-01-20 00:18

Its Very possible that your SQL SELECT statement query may 1000 result into thousand of records. But its is not good idea to display all the results on one page. So we can divide this result into many pages as per requirement as pagination Class .

PAGINATE DATA WITH PAGINATION CLASS VERY EASY

pagination Class helps to generate paging

How To Use Pagination Class visit this link for more info 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 ?>
查看更多
Rolldiameter
4楼-- · 2019-01-20 00:23

I would suggest Zend_Paginator for the following reasons

  • It's loosely coupled and doesn't require the entire library.
  • The ZF community is larger than the PEAR community and is actively running security audits on code, and releasing maintenance versions.
  • It separates data sources by using the Adapter Pattern, and there are numerous examples of front end UI pattern implementations in the documentation.
查看更多
淡お忘
5楼-- · 2019-01-20 00:24
// 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;
    }
}

Use:

$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();

Result:

<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>
查看更多
Rolldiameter
6楼-- · 2019-01-20 00:27

Have you tried PEAR::Pager? Usage examples here.

查看更多
倾城 Initia
7楼-- · 2019-01-20 00:28

you can try this: Zebra_Pagination, a generic, Twitter Bootstrap compatible, pagination class written in PHP check the link below: http://stefangabos.ro/php-libraries/zebra-pagination

查看更多
登录 后发表回答