Version: 2.0
Type: Class
Category: Databases
License: Other
Description: Simple classe to display a large recordset in a paging format. Customize to your needs.
<?
/** Paging.php
** Description: This class handles the paging from a query to be print
** to the browser. You can customize it to your needs.
**
** Modification:
** Version 1.1 (2001-04-09) Remove 3 lines in getNumberOfPage() that were forgot after debugging
** Version 1.1 (2001-04-09) Modification to the exemple
** Version 1.1 (2001-04-10) Added more argv to the previous and next link. ( by: peliter@mail.peliter.com )
**
** Version 2.0 (2001-11-22) Complete re-write of the script
** Summary: The class will be make it easier to play with results...
** -The class now only returns 2 arrays. All HTML, except href, tag were remove.
** -Function printPaging() broken in two: getPagingArray() and getPagingRowArray()
** -Function openTable() and closeTable() removed.
**
** @author Pierre-Yves Lemaire (py@ottawa.com)
** @version 1.0 (August 2001)
** @version 2.0 (November 2001)
**
** Copyright E-medhosting, 2000, 2001
*/
if( !PHPUSER )
define( "PHPUSER", 1 | 0 );
class Paging {
/**
* Number of result to show per page (decided by user)
* @private
* @type int
*/
var $int_num_result;
/**
* Total number of items (SQL count from db)
* @private
* @type int
*/
var $int_nbr_row;
/**
* Current position in recordset
* @private
* @type int
*/
var $int_cur_position;
/**
* Extra argv of query string
* @private
* @type String
*/
var $str_ext_argv;
/**
** The constructors simply gives an initial value to all private vars
** @returns void
**/
function Paging( $int_nbr_row, $int_cur_position, $int_num_result, $str_ext_argv = "" ){
$this->int_nbr_row = $int_nbr_row;
$this->int_num_result = $int_num_result;
$this->int_cur_position = $int_cur_position;
$this->str_ext_argv = urldecode( $str_ext_argv );
}
/**
** getNumberOfPage()
** This function returns the total number of page to display.
** @returns int
**/
function getNumberOfPage(){
$int_nbr_page = $this->int_nbr_row / $this->int_num_result;
return $int_nbr_page;
}
/**
** getCurrentPage()
** This function returns the current page number.
** @returns int
**/
function getCurrentPage(){
$int_cur_page = ( $this->int_cur_position * $this->getNumberOfPage() ) / $this->int_nbr_row;
return number_format( $int_cur_page, 0 );
}
/**
** getPagingArray()
** Build an array represented by:
** $array_paging['lower'] lower limit of where we are in result set
** $array_paging['upper'] upper limit of where we are in result set
** $array_paging['total'] total number of result
** $array_paging['previous_link'] href tag for previous link
** $array_paging['next_link'] href tag for next link
** @returns Array
**/
function getPagingArray(){
global $PHP_SELF;
// define the lower limit of all results
$array_paging['lower'] = ( $this->int_cur_position + 1 );
// define the upper limit of all results
if( $this->int_cur_position + $this->int_num_result >= $this->int_nbr_row ){
$array_paging['upper'] = $this->int_nbr_row;
}else{
$array_paging['upper'] = ( $this->int_cur_position + $this->int_num_result );
}
// define the total of results
$array_paging['total'] = $this->int_nbr_row;
// define the previous link (html href)
if ( $this->int_cur_position != 0 ){
$array_paging['previous_link'] = "<a href=\"$PHP_SELF?int_cur_position=". ( $this->int_cur_position - $this->int_num_result ).$this->str_ext_argv ."\">";
}
// define the next link (html href)
if( ( $this->int_nbr_row - $this->int_cur_position ) > $this->int_num_result ){
$int_new_position = $this->int_cur_position + $this->int_num_result;
$array_paging['next_link'] = "<a href=\"$PHP_SELF?int_cur_position=$int_new_position". $this->str_ext_argv ."\">";
}
return $array_paging;
}
/**
** getPagingRowArray()
** This function returns an array of string (href link with the page number)
** @returns Array
**/
function getPagingRowArray(){
global $PHP_SELF;
for( $i=0; $i<$this->getNumberOfPage(); $i++ ){
// if current page, do not make a link
if( $i == $this->getCurrentPage() ){
$array_all_page[$i] = "<b>". ($i+1) ."</b>";
}else{
$int_new_position = ( $i * $this->int_num_result );
$array_all_page[$i] = "<a href=\"". $PHP_SELF ."?int_cur_position=$int_new_position$this->str_ext_argv\">". ($i+1) ."</a>";
}
}
return $array_all_page;
}
}; // End Class
// ==============================================================
// Exemple Usage
// Note: I make 2 query to the database for this exemple, it
// could (and should) be made with only one query...
// ==============================================================
/*
include( "db_mysql.php" );
// New instance of database object, from phplib (http://phplib.sourceforge.net/)
$db = new db_data();
// If current position is not set, set it to zero
if( !isset( $int_cur_position ) || $int_cur_position == 0 ){
$int_cur_position = 0;
}
// Number of result to display on the page, will be in the LIMIT of the sql query also
$int_num_result = 10;
$extargv = "&argv1=1&argv2=2"; // extra argv here (could be anything depending on your page)
// Get the total number of result from db
$sql1 = "Select count( key ) as nbr FROM table";
if ( !$db->query( $sql1 )){ print "\n<p>ERREUR $sql1"; exit; }
$db->next_record();
$result_from_sql1 = $db->f("nbr");
// New instance of the Paging class, you can modify the color and the width of the html table
$p = new Paging( $result_from_sql1, $int_cur_position, $int_num_result, $extargv );
// Load up the 2 array in order to display result
$array_paging = $p->getPagingArray();
$array_row_paging = $p->getPagingRowArray();
// Display the result as you like...
print "Results: ". $array_paging['lower'];
print " to ". $array_paging['upper'];
print " of ". $array_paging['total'];
print " ". $array_paging['previous_link'] ."<<<</a> " ;
for( $i=0; $i<sizeof($array_row_paging); $i++ ){
print $array_row_paging[$i] ." ";
}
print $array_paging['next_link'] .">>></a>";
// The above exemple will print somethings like:
// Results: 1 to 10 of 597 <<< 1 2 3 4 5 6 7 8 9 10 >>>
// Of course you can now play with array_row_paging in order to print
// only the results you would like...
// Now go on with the rest of you page...
// Select only fields needed according to paging
$sql2 = "Select * FROM my_table ORDER BY id "
."LIMIT $int_cur_position, $int_num_result";
*/
?>