2010-03-17 62 views
4

我正在尋找一個php分頁類,我已經使用了一個相當簡單的過去,它不再支持。PHP分頁類

我想知道是否有人有任何建議?

當有可能有這麼多好東西的時候,建立我自己似乎毫無意義。

回答

5

更多的搜索後,我決定之前,我使用frameworked版本我應該充分了解什麼是參與一個分頁程序。所以我自己建了一個。感謝您的建議,但!

+1

這是最好的方法。 – Stann 2011-07-08 05:51:45

+0

我使用庫是因爲我不想關心內部進程。 – cweiske 2012-05-03 06:38:18

4

我建議Zend_Paginator,原因如下

  • 它是鬆散耦合的,不需要整個庫。
  • ZF社區比PEAR社區還要大,並且正在積極地對代碼進行安全審計,併發布維護版本。
  • 它使用適配器模式分離數據源,並且文檔中有許多前端UI模式實現的示例。
+0

爲什麼downvote? – Travis 2011-07-08 16:52:10

+0

您仍然無法只下載paginator,但必須下載整個胖Zend Framework,才能獲得paginator。除此之外,它完全是過度工程。 PEAR的尋呼機也不受限於某些數據源。 – cweiske 2012-05-03 06:39:24

1
// 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> 
0

它很可能是您的SQL SELECT語句查詢可能會導致1000條記錄。但是在一個頁面上顯示所有結果並不是一個好主意。所以我們可以根據需要將這個結果分成許多頁作爲分頁類。與分頁類VERY EASY

分頁類

PAGINATE數據有助於產生尋呼

如何使用分頁類 訪問此鏈接瞭解更多信息 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 ?> 
1
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>'; 
    } 



}