经测试代码如下:
<?PHP
/**
* 超强分页类
*
* @param
* @arrange (512.笔记) jb51.cc
**/
class paging{
var $sql_results;
var $sql_query;
var $display_offset;
var $display_limit;
var $display_limit_URI;
var $display_currentpage;
var $display_totalpages;
var $alt_content_count;
var $display_offset_var;
var $display_limit_var;
var $display_mid_offset;
var $display_link_first;
var $display_link_prev;
var $display_link_next;
var $display_link_last;
var $page_filename;
var $page_uri;
var $content;
var $content_type;
var $content_count;
## CONSTRUCTOR
function paging($offsetVar='offset',$limit=10,$midOffset=2){
$this->display_offset = isset($_REQUEST[$offsetVar])?$_REQUEST[$offsetVar]:0;
$this->display_limit = is_numeric($limit)?$limit:10;
$this->display_mid_offset = $midOffset;
$this->display_offset_var = $offsetVar;
$this->display_currentpage = ceil($this->display_offset / $this->display_limit);
}
## HANDLE DATA
function setContent($content){
if( is_array($content) )
$this->content_type = 'array';
$this->content = $content;
$this->private_contentDetails();
$this->getLinks();
}
function private_contentDetails(){
if( $this->content_type == 'array' )
$this->content_count = count($this->content);
}
function getContent(){
$returnAry = array();
for(
$i=$this->display_offset;
$i< min( $this->content_count,$this->display_offset+$this->display_limit );
++$i
)
array_push($returnAry,$this->content[$i]);
return $returnAry;
}
## LINKS TO NAVIGATE
function getLinks(){
$this->getNextLink('');
$this->getFirstLink('');
$this->getLastLink('');
$this->getPrevLink('');
}
function getNext(){
return $this->display_link_next;
}
function getPrev(){
return $this->display_link_prev;
}
function getFirst(){
return $this->display_link_first;
}
function getLast(){
return $this->display_link_last;
}
function getNextLink($caption){
// Check if we're counting content or the alternate user provided count
if( $this->alt_content_count )
$count = $this->alt_content_count;
else
$count = $this->content_count;
if( $this->display_offset+$this->display_limit-$count >=0 ){
$this->display_link_next = $this->display_offset;
}else{
$this->display_link_next = min(
$count-1,$this->display_offset+$this->display_limit
);
}
return $this->buildLink( $this->buildNewURI( $this->display_link_next),$caption );
}
function getPrevLink($caption){
$this->display_link_prev = max(
0,$this->display_offset-$this->display_limit
);
return $this->buildLink( $this->buildNewURI( $this->display_link_prev),$caption );
}
function getFirstLink($caption){
$this->display_link_first = 0;
return $this->buildLink( $this->buildNewURI( $this->display_link_first),$caption );
}
function getLastLink($caption){
$this->display_link_last = $this->content_count-$this->display_limit;
return $this->buildLink( $this->buildNewURI( $this->display_link_last),$caption );
}
## NUMBERS
function getPageCount(){
if( $this->alt_content_count )
$count = $this->alt_content_count;
else
$count = $this->content_count;
$this->display_totalpages = ceil(
$count / $this->display_limit
);
return $this->display_totalpages;
}
function getPageNumbers(){
// define variables
$midOffset = $this->display_mid_offset;
$firstLink = $this->display_link_first;
$pageCount = $this->getPageCount();
$thisPage = $this->display_currentpage;
$limit = $this->display_limit;
$displayed = $midOffset*2+1;
$returnAry = array();
// dots
$returnAry['afterdot'] = '';
$returnAry['beforedot'] = '';
// if two times and center the number is less than all the pages together
if( ($midOffset*2+1) < $pageCount ){
$min = max($firstLink,$thisPage-$midOffset);
$max = min($pageCount,$thisPage+$midOffset+1);
$total = $max-$min;
// this keeps x amount of pages displayed even if
// you're not in mid cause of page 1 or 2
if($total<$displayed){
if($min==0){
$max+=$displayed-$total;
}
if($max==$pageCount){
$min-=$displayed-$total;
}
}
}else{
# Just output a set of numbers
$min = 0;
$max = $pageCount;
}
// run pages,check for current page and name it
for($i=$min;$i<$max;++$i){
$cp = 'no';
if($thisPage==$i)
$cp = 'yes';
if($max!=$pageCount)
$returnAry['afterdot'] = '...';
if($min>0)
$returnAry['beforedot'] = '...';
array_push($returnAry,array(
'currentPage' => $cp,'pageNumber' => ($i+1),'pageLink' => $this->buildLink( $this->buildNewURI( ($i*$limit) ),($i+1) )
)
);
}
return $returnAry;
}
function makePageNumbers($format,$pages,$boldCurrent=true,$separator=' '){
$retPages = '';
// make actual page numbers
foreach($pages as $key => $value):
if(is_numeric($key))
$retPages .= ('yes'==$value['currentPage'] && $boldCurrent)?'<b>'.$value['pageLink'] .'</b>'.$separator:$value['pageLink'].$separator;
endforeach;
$format = str_replace( array('{beforedot}','{afterdot}','{pages}','{separator}'),array( $pages['beforedot'],$pages['afterdot'],$retPages),$format);
return $format;
}
## CHECKS
function isFirstPage(){
if($this->display_currentpage==0)
return true;
return false;
}
function isLastPage(){
// add one because basis is 0,not 1
if($this->display_currentpage+1==$this->getPageCount())
return true;
return false;
}
## FUNCTIONS
function getPageName(){
$fileName = explode('/',$_SERVER['REQUEST_URI']);
$fileName = $fileName[count($fileName)-1];
if(strpos($fileName,'?')>0) {
$fileName = explode('?',$fileName);
$fileName = $fileName[0];
}
return $fileName;
}
function getCleanURI(){
$URI = $_SERVER['REQUEST_URI'];
if(strpos($URI,'?')>0){
$URI = explode('?',$URI);
$URI = $URI[1];
$URI = preg_replace('/\b'.$this->display_offset_var.'\b[=0-9&]{2,20}/','',$URI);
//$URI = preg_replace('/\b'.$this->display_limit_var.'\b[=0-9&]{2,$URI);
return $URI;
}
return false;
}
function buildNewURI($offset){
$newFile = $this->getPageName() . '?' . $this->getCleanURI();
$lastChar = substr($newFile,strlen($newFile)-1,1);
if( $lastChar != '&' && $lastChar != '?' )
$newFile.='&';
$newFile .= $this->display_offset_var.'='.$offset.'&';
//$newFile .= $this->display_limit_var.'='.$limit.'&';
return $newFile;
}
function buildLink( $href,$caption,$target=NULL ){
if( $target != NULL )
$target = ' target="'.$target.'"';
return '<a href="'.$href.'"'.$target.'>'.$caption.'</a>';
}
function encodeURI($str){
$salt = 'falaful';
$str = strrev($salt.$str);
return base64_encode($str);
}
function decodeURI($str){
$salt = 'falaful';
$str = strrev( base64_decode($str) );
$str = substr( $str,strlen($salt),strlen($str) );
return $str;
}
##############
#
# These functions are for inputting a query for this
# class to execute. The other functions will grab all
# x amount of rows then truncate it. These functions will
# only limit to whatever amount. This improves performance.
# Reason is so you dont grab 1,000,000 rows when you want 3.
#
##############
function runWQuery($db,$statement,$table,$where=''){
// get total rows
$db->query( 'SELECT COUNT(*) AS count FROM '. $table . ' ' . $where );
$db->movenext();
$this->alt_content_count = $db->col['count'];
// add limit to query
$where .= ' LIMIT ' . $this->display_offset .','.$this->display_limit;
// save query
$this->sql_query = $statement . ' FROM ' . $table .' '. $where;
// print query
//echo $this->sql_query;
// run query
$db->query( $this->sql_query );
$this->sql_results = array();
// save results
while($db->movenext()){
array_push($this->sql_results,$db->col);
}
return $this->runQueryActions();
}
function runQueryActions(){
$this->setContent( $this->sql_results );
$pages = $this->getPageNumbers();
// make actual page numbers
$retPages = $this->makePageNumbers( '{beforedot} {pages} {afterdot}',true,' ' );
// get new display
return array(
'content' => $this->sql_results,'pages' => $retPages
);
}
}
/*** 来自:编程之家 jb51.cc(jb51.cc) ***/
?>
专门用户数据库查询后分页显示的PHP类