I have write one pagination class using PHP. This is useful for you reference.
<?
php
class Paging {
private $total_rows ;
private $total_pages ;
private $rows_per_page ;
private $pre_sign ; // the previous page sign
private $next_sign ; // the next page sign
private $first_sign ; // the first page sign
private $last_sign ; // the last page sign
private $seperater ; // the page number seperater
private $current_page ;
private $start_page ;
private $num_per_page ; // how many page number to show
/* *
* Construct function.
* @param int $total_rows the total rows number.
* @param int $rows_per_page how many row to display per page.
*/
public function __construct( $total_rows , $rows_per_page , $num_page = 10 ) {
$this -> total_rows = $total_rows ;
$this -> total_pages = ceil ( $total_rows / $rows_per_page );
$this -> rows_per_page = $rows_per_page ;
$this -> current_page = isset ( $_GET [ ' page ' ]) ? $_GET [ ' page ' ] : 1 ;
$this -> num_per_page = $num_page ;
$this -> pre_sign = ' < ' ;
$this -> next_sign = ' > ' ;
$this -> first_sign = ' << ' ;
$this -> last_sign = ' >> ' ;
$this -> seperater = ' | ' ;
}
/* *
* Show paging info.
*/
public function showPaging() {
if ( $this -> total_rows > $this -> rows_per_page) {
$this -> start_page = $this -> getStartPage();
$end_page = $this -> start_page + $this -> num_per_page - 1 ;
if ( $end_page > $this -> total_pages) { // adjust the end page, start page
$end_page = $this -> total_pages;
$this -> start_page = $end_page - $this -> num_per_page + 1 ;
}
$pages = $this -> addLinkInfo( $this -> start_page , $end_page );
$paging = implode ( $this -> seperater , $pages );
}
else {
$paging = '' ;
}
return $paging ;
}
/* *
* Gets start page number.
* @return int $start_page the start page number.
*/
private function getStartPage() {
$start = NULL ;
$start = ( 5 < $this -> current_page) ? ( $this -> current_page - 5 ) : 1 ;
return ( $this -> total_pages > $start ) ? $start : ( $this -> total_pages - $this -> num_per_page + 1 );
}
/* *
* Sets the pre page sign.
*/
public function setPreSign( $pre_sign ) {
$this -> pre_sign = $pre_sign ;
}
/* *
* Sets the next page sign.
*/
public function setNextSign( $next_sign ) {
$this -> next_sign = $next_sign ;
}
/* *
* Sets the first page sign.
*/
public function setFirstSign( $first_sign ) {
$this -> first_sign = $first_sign ;
}
/* *
* Sets the last page sign.
*/
public function setLastSign( $last_sign ) {
$this -> last_sign = $last_sign ;
}
/* *
* Sets the page seperator sign.
*/
public function setSeperator( $seperator ) {
$this -> seperater = $seperator ;
}
/* *
* Adds page link info.
* @param int $start_page the start page number.
* @param int $end_page the end page number.
*/
private function addLinkInfo( $start_page , $end_page ) {
$page_with_link = NULL ;
$paging = array ();
if ( 1 != $start_page ) {
$paging [] = $this -> addPageLink( $this -> first_sign , ' first ' ); // add first page link
}
if ( 1 < $this -> current_page) {
$paging [] = $this -> addPageLink( $this -> current_page - 1 , ' previous ' ); // add previous page link
}
for ( $i = $start_page ; $i <= $end_page ; ++ $i ) {
if ( $i != $this -> current_page) {
$page_with_link = $this -> addPageLink( $i );
}
else {
$page_with_link = $i ;
}
$paging [] = $page_with_link ;
}
if ( $this -> current_page < $this -> total_pages) {
$paging [] = $this -> addPageLink( $this -> current_page + 1 , ' next ' ); // add next page link
if ( $this -> total_pages > $end_page ) { // need add the last page link
$paging [] = $this -> addPageLink( $this -> last_sign , ' last ' );
}
}
return $paging ;
}
/* *
* Adds link info to page $page_num.
* @param int $page_num
* @return string page number with link info.
*/
private function addPageLink( $page_num , $add_sign = '' ) {
$current_file = basename ( $_SERVER [ ' PHP_SELF ' ]);
if ( ' first ' == $add_sign ) {
$query_string = $this -> getQueryString( 1 );
$link = <<< END
< a href = " $current_file?$query_string " > $page_num </ a >
END ;
}
else if ( ' last ' == $add_sign ) {
$query_string = $this -> getQueryString( $this -> total_pages);
$link = <<< END
< a href = " $current_file?$query_string " > $page_num </ a >
END ;
}
else if ( ' previous ' == $add_sign ){
if ( 0 >= $page_num ) {
$page_num = 1 ;
}
$query_string = $this -> getQueryString( $page_num );
$link = <<< END
< a href = " $current_file?$query_string " > $this -> pre_sign </ a >
END ;
}
else if ( ' next ' == $add_sign ) {
if ( $page_num > $this -> total_pages) {
$page_num = $this -> total_pages;
}
$query_string = $this -> getQueryString( $page_num );
$link = <<< END
< a href = " $current_file?$query_string " > $this -> next_sign </ a >
END ;
}
else {
$query_string = $this -> getQueryString( $page_num );
$link = <<< END
< a href = " $current_file?$query_string " > $page_num </ a >
END ;
}
return $link ;
}
/* *
* Gets the query string from the URL.
* @param int $page set the current page number.
* @return string new query string.
*/
private function getQueryString( $page ) {
$query_string = $_SERVER [ ' QUERY_STRING ' ];
$query_array = NULL ;
parse_str ( $query_string , $query_array );
$query_array [ ' page ' ] = $page ; // set page num
return http_build_query ( $query_array );
}
}
$page = new Paging( 1000 , 10 );
$page -> setFirstSign( ' first ' ); // set the first page sign, default is '<<'
$page -> setPreSign( ' pre ' )); // set the pre page sign, default is '<'
$page -> setNextSign( ' next ' )); // set the next page sign, default is '>'
$page -> setLastSign( ' last ' )); // set the last page sign, default is '>>'
$page -> setSeperator( ' ][ ' )); // set the first page sign, default is '|'
echo ' [ ' . $page -> showPaging() . ' ] ' ;
?>
class Paging {
private $total_rows ;
private $total_pages ;
private $rows_per_page ;
private $pre_sign ; // the previous page sign
private $next_sign ; // the next page sign
private $first_sign ; // the first page sign
private $last_sign ; // the last page sign
private $seperater ; // the page number seperater
private $current_page ;
private $start_page ;
private $num_per_page ; // how many page number to show
/* *
* Construct function.
* @param int $total_rows the total rows number.
* @param int $rows_per_page how many row to display per page.
*/
public function __construct( $total_rows , $rows_per_page , $num_page = 10 ) {
$this -> total_rows = $total_rows ;
$this -> total_pages = ceil ( $total_rows / $rows_per_page );
$this -> rows_per_page = $rows_per_page ;
$this -> current_page = isset ( $_GET [ ' page ' ]) ? $_GET [ ' page ' ] : 1 ;
$this -> num_per_page = $num_page ;
$this -> pre_sign = ' < ' ;
$this -> next_sign = ' > ' ;
$this -> first_sign = ' << ' ;
$this -> last_sign = ' >> ' ;
$this -> seperater = ' | ' ;
}
/* *
* Show paging info.
*/
public function showPaging() {
if ( $this -> total_rows > $this -> rows_per_page) {
$this -> start_page = $this -> getStartPage();
$end_page = $this -> start_page + $this -> num_per_page - 1 ;
if ( $end_page > $this -> total_pages) { // adjust the end page, start page
$end_page = $this -> total_pages;
$this -> start_page = $end_page - $this -> num_per_page + 1 ;
}
$pages = $this -> addLinkInfo( $this -> start_page , $end_page );
$paging = implode ( $this -> seperater , $pages );
}
else {
$paging = '' ;
}
return $paging ;
}
/* *
* Gets start page number.
* @return int $start_page the start page number.
*/
private function getStartPage() {
$start = NULL ;
$start = ( 5 < $this -> current_page) ? ( $this -> current_page - 5 ) : 1 ;
return ( $this -> total_pages > $start ) ? $start : ( $this -> total_pages - $this -> num_per_page + 1 );
}
/* *
* Sets the pre page sign.
*/
public function setPreSign( $pre_sign ) {
$this -> pre_sign = $pre_sign ;
}
/* *
* Sets the next page sign.
*/
public function setNextSign( $next_sign ) {
$this -> next_sign = $next_sign ;
}
/* *
* Sets the first page sign.
*/
public function setFirstSign( $first_sign ) {
$this -> first_sign = $first_sign ;
}
/* *
* Sets the last page sign.
*/
public function setLastSign( $last_sign ) {
$this -> last_sign = $last_sign ;
}
/* *
* Sets the page seperator sign.
*/
public function setSeperator( $seperator ) {
$this -> seperater = $seperator ;
}
/* *
* Adds page link info.
* @param int $start_page the start page number.
* @param int $end_page the end page number.
*/
private function addLinkInfo( $start_page , $end_page ) {
$page_with_link = NULL ;
$paging = array ();
if ( 1 != $start_page ) {
$paging [] = $this -> addPageLink( $this -> first_sign , ' first ' ); // add first page link
}
if ( 1 < $this -> current_page) {
$paging [] = $this -> addPageLink( $this -> current_page - 1 , ' previous ' ); // add previous page link
}
for ( $i = $start_page ; $i <= $end_page ; ++ $i ) {
if ( $i != $this -> current_page) {
$page_with_link = $this -> addPageLink( $i );
}
else {
$page_with_link = $i ;
}
$paging [] = $page_with_link ;
}
if ( $this -> current_page < $this -> total_pages) {
$paging [] = $this -> addPageLink( $this -> current_page + 1 , ' next ' ); // add next page link
if ( $this -> total_pages > $end_page ) { // need add the last page link
$paging [] = $this -> addPageLink( $this -> last_sign , ' last ' );
}
}
return $paging ;
}
/* *
* Adds link info to page $page_num.
* @param int $page_num
* @return string page number with link info.
*/
private function addPageLink( $page_num , $add_sign = '' ) {
$current_file = basename ( $_SERVER [ ' PHP_SELF ' ]);
if ( ' first ' == $add_sign ) {
$query_string = $this -> getQueryString( 1 );
$link = <<< END
< a href = " $current_file?$query_string " > $page_num </ a >
END ;
}
else if ( ' last ' == $add_sign ) {
$query_string = $this -> getQueryString( $this -> total_pages);
$link = <<< END
< a href = " $current_file?$query_string " > $page_num </ a >
END ;
}
else if ( ' previous ' == $add_sign ){
if ( 0 >= $page_num ) {
$page_num = 1 ;
}
$query_string = $this -> getQueryString( $page_num );
$link = <<< END
< a href = " $current_file?$query_string " > $this -> pre_sign </ a >
END ;
}
else if ( ' next ' == $add_sign ) {
if ( $page_num > $this -> total_pages) {
$page_num = $this -> total_pages;
}
$query_string = $this -> getQueryString( $page_num );
$link = <<< END
< a href = " $current_file?$query_string " > $this -> next_sign </ a >
END ;
}
else {
$query_string = $this -> getQueryString( $page_num );
$link = <<< END
< a href = " $current_file?$query_string " > $page_num </ a >
END ;
}
return $link ;
}
/* *
* Gets the query string from the URL.
* @param int $page set the current page number.
* @return string new query string.
*/
private function getQueryString( $page ) {
$query_string = $_SERVER [ ' QUERY_STRING ' ];
$query_array = NULL ;
parse_str ( $query_string , $query_array );
$query_array [ ' page ' ] = $page ; // set page num
return http_build_query ( $query_array );
}
}
$page = new Paging( 1000 , 10 );
$page -> setFirstSign( ' first ' ); // set the first page sign, default is '<<'
$page -> setPreSign( ' pre ' )); // set the pre page sign, default is '<'
$page -> setNextSign( ' next ' )); // set the next page sign, default is '>'
$page -> setLastSign( ' last ' )); // set the last page sign, default is '>>'
$page -> setSeperator( ' ][ ' )); // set the first page sign, default is '|'
echo ' [ ' . $page -> showPaging() . ' ] ' ;
?>