Here is a lovely paging system I found on the forums the other night...I wish I knew the person who wrote it up or where the thread was...I want to give credit to them. I rewrote parts of it and plan to refactor some things in the future...so far I love this php class....works like a charm.
/*************************************************************
*
* Class:........PagedResults
* Version:......???
* Created:......???
* Author:.......PHPBuilder.com Forum Member
* Author 2:.....Raymond Kolbe
*
* Description: Provides generic functionality for creating
* paged results (e.g. << Prev 1 2 3 Next >>). Database
* friendly (e.g. MySQL).
*
* Usage:
*
* Example:
* $paged = new PagedResults('10');
* $paged->setTotalResults('500');
* print_p($paged->InfoArray());
*
* Note:
*
* Required: Nothing
*
* Change Log:
* April 29, 2007:
* - Added constructor to pass arguments
* - Changed all data members to private
* - Added setTotalResults($tal) method
* - Added visability to methods
*
*************************************************************/
class PagedResults {
private $TotalResults = 0;
private $CurrentPage = 1;
private $PageVarName;
private $ResultsPerPage;
private $LinksPerPage;
public function __construct($rx = "20", $lx = "10", $pgname = "page"){
$this->ResultsPerPage = $rx;
$this->LinksPerPage = $lx;
$this->PageVarName = $pgname;
}
public function setTotalResults($tal){
$this->TotalResults = $tal;
}
public function InfoArray() {
$this->TotalPages = $this->getTotalPages();
$this->CurrentPage = $this->getCurrentPage();
$this->ResultArray = array(
"PREV_PAGE" => $this->getPrevPage(),
"NEXT_PAGE" => $this->getNextPage(),
"CURRENT_PAGE" => $this->CurrentPage,
"TOTAL_PAGES" => $this->TotalPages,
"TOTAL_RESULTS" => $this->TotalResults,
"PAGE_NUMBERS" => $this->getNumbers(),
"MYSQL_LIMIT1" => $this->getStartOffset(),
"MYSQL_LIMIT2" => $this->ResultsPerPage,
"START_OFFSET" => $this->getStartOffset(),
"END_OFFSET" => $this->getEndOffset(),
"RESULTS_PER_PAGE" => $this->ResultsPerPage,
);
return $this->ResultArray;
}
/* Start information functions */
private function getTotalPages() {
/* Make sure we don't devide by zero */
if($this->TotalResults != 0 && $this->ResultsPerPage != 0) {
$result = ceil($this->TotalResults / $this->ResultsPerPage);
}
/* If 0, make it 1 page */
if(isset($result) && $result == 0) {
return 1;
} else {
return $result;
}
}
private function getStartOffset() {
$offset = $this->ResultsPerPage * ($this->CurrentPage - 1);
if($offset != 0) {
$offset++;
}
return $offset;
}
private function getEndOffset() {
if($this->getStartOffset() > ($this->TotalResults - $this->ResultsPerPage)) {
$offset = $this->TotalResults;
} elseif($this->getStartOffset() != 0) {
$offset = $this->getStartOffset() + $this->ResultsPerPage - 1;
} else {
$offset = $this->ResultsPerPage;
}
return $offset;
}
private function getCurrentPage() {
if(isset($_GET[$this->PageVarName])) {
return $_GET[$this->PageVarName];
} else {
return $this->CurrentPage;
}
}
private function getPrevPage() {
if($this->CurrentPage > 1) {
return $this->CurrentPage - 1;
} else {
return false;
}
}
private function getNextPage() {
if($this->CurrentPage < $this->TotalPages) {
return $this->CurrentPage + 1;
} else {
return false;
}
}
private function getStartNumber() {
$links_per_page_half = $this->LinksPerPage / 2;
/* See if curpage is less than half links per page */
if($this->CurrentPage <= $links_per_page_half || $this->TotalPages <= $this->LinksPerPage) {
return 1;
/* See if curpage is greater than TotalPages minus Half links per page */
} elseif($this->CurrentPage >= ($this->TotalPages - $links_per_page_half)) {
return $this->TotalPages - $this->LinksPerPage + 1;
} else {
return $this->CurrentPage - $links_per_page_half;
}
}
private function getEndNumber() {
if($this->TotalPages < $this->LinksPerPage) {
return $this->TotalPages;
} else {
return $this->getStartNumber() + $this->LinksPerPage - 1;
}
}
private function getNumbers() {
for($i=$this->getStartNumber(); $i<=$this->getEndNumber(); $i++) {
$numbers[] = $i;
}
return $numbers;
}
}