一个分页原理问题
时间:2006-10-20 来源:w3g8
样式:1
1 2 3 4 5 6 7 8 9 10 下一页
如果分页页书高于规定的页书 暂定10页
则点第二页的时候是
上一页 2 3 4 5 6 7 8 9 10 11 下一页
以此类推
就是 显示页码限定规定数量 根据当前页码自动左右偏移的实现原理
[PHP]
* @version 1.0
* @lastupdate 2003-04-08 11:11:33
*
*
* 使用实例:
* $p = new show_page; //建立新对像
* $p->file="ttt.php"; //设置文件名,默认为当前页
* $p->pvar="pagecount"; //设置页面传递的参数,默认为p
* $p->setvar(array("a" => '1', "b" => '2')); //设置要传递的参数,要注意的是此函数必须要在 set 前使用,否则变量传不过去
* $p->set(20,2000,1); //设置相关参数,共三个,分别为'页面大小'、'总记录数'、'当前页(如果为空则自动读取GET变量)'
* $p->output(0); //输出,为0时直接输出,否则返回一个字符串
* echo $p->limit(); //输出Limit子句。在sql语句中用法为 "SELECT * FROM TABLE LIMIT {$p->limit()}";
*
*/
class show_page {
/**
* 页面输出结果
*
* @var string
*/
var $output;
/**
* 使用该类的文件,默认为 PHP_SELF
*
* @var string
*/
var $file;
/**
* 页数传递变量,默认为 'p'
*
* @var string
*/
var $pvar = "p";
/**
* 页面大小
*
* @var integer
*/
var $psize;
/**
* 当前页面
*
* @var ingeger
*/
var $curr;
/**
* 要传递的变量数组
*
* @var array
*/
var $varstr;
/**
* 总页数
*
* @var integer
*/
var $tpage;
/**
* 分页设置
*
* @access public
* @param int $pagesize 页面大小
* @param int $total 总记录数
* @param int $current 当前页数,默认会自动读取
* @return void
*/
function set($pagesize=20,$total,$current=false) {
global $HTTP_SERVER_VARS,$HTTP_GET_VARS;
$this->tpage = ceil($total/$pagesize);
if (!$current) {$current = $HTTP_GET_VARS[$this->pvar];}
if ($current>$this->tpage) {$current = $this->tpage;}
if ($currentcurr = $current;
$this->psize = $pagesize;
if (!$this->file) {$this->file = $HTTP_SERVER_VARS['PHP_SELF'];}
if ($this->tpage > 1) {
if ($current>10) {
$this->output.='file.'?'.$this->pvar.'='.($current-10).($this->varstr).' title="前十页"> ';
}
if ($current>1) {
$this->output.='file.'?'.$this->pvar.'='.($current-1).($this->varstr).' title="前一页"> ';
}
$start = floor($current/10)*10;
$end = $start+9;
if ($start$this->tpage) {$end=$this->tpage;}
for ($i=$start; $ioutput.=''.$i.' '; //输出当前页数
} else {
$this->output.='file.'?'.$this->pvar.'='.$i.$this->varstr.'">['.$i.'] '; //输出页数
}
}
if ($currenttpage) {
$this->output.='file.'?'.$this->pvar.'='.($current+1).($this->varstr).' title="下一页">>> ';
}
if ($this->tpage>10 && ($this->tpage-$current)>=10 ) {
$this->output.='file.'?'.$this->pvar.'='.($current+10).($this->varstr).' title="下十页">>>>';
}
}
return $this->output;
}
/**
* 要传递的变量设置
*
* @access public
* @param array $data 要传递的变量,用数组来表示,参见上面的例子
* @return void
*/
function setvar($data) {
foreach ($data as $k=>$v) {
$this->varstr.='&'.$k.'='.urlencode($v);
}
}
/**
* 分页结果输出
*
* @access public
* @param bool $return 为真时返回一个字符串,否则直接输出,默认直接输出
* @return string
*/
function output($return = false) {
if ($return) {
return $this->output;
} else {
echo $this->output;
}
}
/**
* 生成Limit语句
*
* @access public
* @return string
*/
function limit() {
return (($this->curr-1)*$this->psize).','.$this->psize;
}
} //End Class
?>[/PHP]
这个 最常见的分爷类不就是 这样的吗?
作者: chenridong 发布日期: 2004-11-13
=0 && $total_pages>$pages_per_range)
{ $start_page = ($page_offset + 10 > $total_pages ) ? $total_pages - $pages_per_range + 1 : $page_offset + 1;
$pageshow .= " 首页";
}
else
{ $start_page = 1; }
if ($now_page>1) { $prepage=$now_page -1; $pageshow .= " 上页"; }
$end_page = ($start_page + $pages_per_range - 1 > $total_pages) ? $total_pages : $start_page + $pages_per_range - 1;
for ($i=$start_page; $i $i "; } else { $pageshow .= " $i "; }
}
if ($now_page下页 "; }
if ($end_page 尾页 "; }
$pagebody = "
$total_records
$now_page/$total_pages
$pageshow";
return $pagebody;
}
$pagebody=pagelist("$PHP_SELF?type=readonly", 20, 250, 10, $page);
echo $pagebody;
?>
作者: abbish 发布日期: 2004-11-13
我想要的是类似Google的那样 以当前页为中心 列出前后十个 页码 正在研究中~ 快出来了
作者: hgxxx007 发布日期: 2005-6-28
我写了一个,不过不是函数,也不是类,就是纯代码,
及其丑陋的,我当初的想法正是跟你一样的,献丑
[php]
您现在处于/页
共/条记录
">|
&pagenum=">
|
".$i." |";
}
else
{
echo " ".$i." |";
}
}
}
else
{
if($pagenum > $TotalPage - 5)
{
if($TotalPage ".$i." |";
}
else
{
echo " ".$i." |";
}
}
}
else
{
for($i = $TotalPage - 8; $i ".$i." |";
}
else
{
echo " ".$i." |";
}
}
}
}
else
{
if($pagenum > 4 && $pagenum ".$i." |";
}
else
{
echo " ".$i." |";
}
}
}
else
{
for($i = 1; $i ".$i." |";
}
else
{
echo " ".$i." |";
}
}
}
}
}
if($pagenum != $TotalPage)
{
?>
&pagenum="> ->>
->>
&pagenum=">>|
[/php]
作者: DevilHookey 发布日期: 2005-6-28
计算总page num
得到当前page num
然后前减后加循环几次~
只是个想法~待批
作者: 纯粹误会 发布日期: 2005-6-28
下面这个是我做得第二个简单的分页函数,数据库照样可以使用
[php]
function ZH_Pagination ($total,$per,$page,$url)
{#程序:纯粹误会 zh5j.com QQ:44922032 2005年5月3日库数据库与文皆可使用,数据库用 mysql_data_seek定位
global $pBegin,$pEnd;#
$per>0||$per=10;#每页显示信息量
$page_total=ceil($total/$per);#页面总数
if($page$page_total)$page=1;#修正$page
$pBegin=max(($page-1)*$per,1);#当前页信息开始下标. 全局变量
$pEnd=Min($page*$per,$total);#当前页信息结束下标. 全局变量
if($page>1)$re="\n首页 上一页"; #当前页码比1大
else $re="\n首页 上一页";#当前页码不大于1
$begin=Max($page-5,1);
$end=Min($page+5,$page_total);
for($i=$begin;$i$i";# 其他
}
if($page下一页 尾页 ";# 当前页码比总页数小
else $re.="\n下一页 尾页";# 当前页码不小于总页数
return $re;
}
#test
$pagination=ZH_Pagination(1000,20,$_GET[page],"?page");
echo ($pagination);
for($i=$pBegin;$i$i";
}
[/php]
作者: 纯粹误会 发布日期: 2005-6-28
[php]
/*下面是一个纯粹误会早期所写的复杂语句,功能:让当前页永远距中,并使分页链接数量保持平衡*/
$offset=floor($midNum/2);
$current_page=$page;
if($current_page-$offset$page_cnt)$current_page=$page_cnt-$offset;
$begin=($current_page-$offset)>0?$current_page-$offset:1;
$end=($current_page+$offset)
作者: 纯粹误会 发布日期: 2005-6-28
楼主,你还想什么,非要自己写一个分页,google那个分页别怪我乱说,并不好,为什么有这么多人要先模仿他呢
不过很欣赏你的开发精神,写出让大看看,用最少语句,写出最大的功能
作者: zeying 发布日期: 2005-6-28
这个是我用的
$aNum //总记录数
$url //附加url地址
$PageList //每页记录数
$PageNum //所显示的页数,比如有10页,则显示到7
$space //分隔
[PHP]/* ===============
@@ 分页函数
================*/
function PageQuery($aNum,$page=1,$url="",$PageList=10,$PageNum=7,$space=" ")
{
if ($aNum==0)
{
return $p;
}
/*总页数计算*/
if ($aNum%$PageList==0)
{
$aPage=$aNum/$PageList;
}
else
{
$aPage=intval($aNum/$PageList)+1;
}
/*分页内容*/
if ($page>intval($PageNum/2)+1)
{
$p[]="|";
}
if ($page!=1)
{
$page_prev=$page-1;
$p[]="";
}
$page_start=$page-intval($PageNum/2);
$page_end=$page+intval($PageNum/2);
if($page_start$aPage)
{
$page_end=$aPage;
}
if ($page_end>$aPage-intval($PageNum/2))
{
if ($page_end-$PageNum$i";
}
else
{
$p[]="$i";
}
}
if ($page>>";
}
if ($page>>|";
}
$p[]="总共 $aPage 页 $aNum 条";
return implode($space, $p);
}[/PHP]
1 2 3 4 5 6 7 8 9 10 下一页
如果分页页书高于规定的页书 暂定10页
则点第二页的时候是
上一页 2 3 4 5 6 7 8 9 10 11 下一页
以此类推
就是 显示页码限定规定数量 根据当前页码自动左右偏移的实现原理
[PHP]
* @version 1.0
* @lastupdate 2003-04-08 11:11:33
*
*
* 使用实例:
* $p = new show_page; //建立新对像
* $p->file="ttt.php"; //设置文件名,默认为当前页
* $p->pvar="pagecount"; //设置页面传递的参数,默认为p
* $p->setvar(array("a" => '1', "b" => '2')); //设置要传递的参数,要注意的是此函数必须要在 set 前使用,否则变量传不过去
* $p->set(20,2000,1); //设置相关参数,共三个,分别为'页面大小'、'总记录数'、'当前页(如果为空则自动读取GET变量)'
* $p->output(0); //输出,为0时直接输出,否则返回一个字符串
* echo $p->limit(); //输出Limit子句。在sql语句中用法为 "SELECT * FROM TABLE LIMIT {$p->limit()}";
*
*/
class show_page {
/**
* 页面输出结果
*
* @var string
*/
var $output;
/**
* 使用该类的文件,默认为 PHP_SELF
*
* @var string
*/
var $file;
/**
* 页数传递变量,默认为 'p'
*
* @var string
*/
var $pvar = "p";
/**
* 页面大小
*
* @var integer
*/
var $psize;
/**
* 当前页面
*
* @var ingeger
*/
var $curr;
/**
* 要传递的变量数组
*
* @var array
*/
var $varstr;
/**
* 总页数
*
* @var integer
*/
var $tpage;
/**
* 分页设置
*
* @access public
* @param int $pagesize 页面大小
* @param int $total 总记录数
* @param int $current 当前页数,默认会自动读取
* @return void
*/
function set($pagesize=20,$total,$current=false) {
global $HTTP_SERVER_VARS,$HTTP_GET_VARS;
$this->tpage = ceil($total/$pagesize);
if (!$current) {$current = $HTTP_GET_VARS[$this->pvar];}
if ($current>$this->tpage) {$current = $this->tpage;}
if ($currentcurr = $current;
$this->psize = $pagesize;
if (!$this->file) {$this->file = $HTTP_SERVER_VARS['PHP_SELF'];}
if ($this->tpage > 1) {
if ($current>10) {
$this->output.='file.'?'.$this->pvar.'='.($current-10).($this->varstr).' title="前十页"> ';
}
if ($current>1) {
$this->output.='file.'?'.$this->pvar.'='.($current-1).($this->varstr).' title="前一页"> ';
}
$start = floor($current/10)*10;
$end = $start+9;
if ($start$this->tpage) {$end=$this->tpage;}
for ($i=$start; $ioutput.=''.$i.' '; //输出当前页数
} else {
$this->output.='file.'?'.$this->pvar.'='.$i.$this->varstr.'">['.$i.'] '; //输出页数
}
}
if ($currenttpage) {
$this->output.='file.'?'.$this->pvar.'='.($current+1).($this->varstr).' title="下一页">>> ';
}
if ($this->tpage>10 && ($this->tpage-$current)>=10 ) {
$this->output.='file.'?'.$this->pvar.'='.($current+10).($this->varstr).' title="下十页">>>>';
}
}
return $this->output;
}
/**
* 要传递的变量设置
*
* @access public
* @param array $data 要传递的变量,用数组来表示,参见上面的例子
* @return void
*/
function setvar($data) {
foreach ($data as $k=>$v) {
$this->varstr.='&'.$k.'='.urlencode($v);
}
}
/**
* 分页结果输出
*
* @access public
* @param bool $return 为真时返回一个字符串,否则直接输出,默认直接输出
* @return string
*/
function output($return = false) {
if ($return) {
return $this->output;
} else {
echo $this->output;
}
}
/**
* 生成Limit语句
*
* @access public
* @return string
*/
function limit() {
return (($this->curr-1)*$this->psize).','.$this->psize;
}
} //End Class
?>[/PHP]
这个 最常见的分爷类不就是 这样的吗?
作者: chenridong 发布日期: 2004-11-13
=0 && $total_pages>$pages_per_range)
{ $start_page = ($page_offset + 10 > $total_pages ) ? $total_pages - $pages_per_range + 1 : $page_offset + 1;
$pageshow .= " 首页";
}
else
{ $start_page = 1; }
if ($now_page>1) { $prepage=$now_page -1; $pageshow .= " 上页"; }
$end_page = ($start_page + $pages_per_range - 1 > $total_pages) ? $total_pages : $start_page + $pages_per_range - 1;
for ($i=$start_page; $i $i "; } else { $pageshow .= " $i "; }
}
if ($now_page下页 "; }
if ($end_page 尾页 "; }
$pagebody = "
$total_records
$now_page/$total_pages
$pageshow";
return $pagebody;
}
$pagebody=pagelist("$PHP_SELF?type=readonly", 20, 250, 10, $page);
echo $pagebody;
?>
作者: abbish 发布日期: 2004-11-13
我想要的是类似Google的那样 以当前页为中心 列出前后十个 页码 正在研究中~ 快出来了
作者: hgxxx007 发布日期: 2005-6-28
我写了一个,不过不是函数,也不是类,就是纯代码,
及其丑陋的,我当初的想法正是跟你一样的,献丑
[php]
您现在处于/页
共/条记录
">|
&pagenum=">
|
".$i." |";
}
else
{
echo " ".$i." |";
}
}
}
else
{
if($pagenum > $TotalPage - 5)
{
if($TotalPage ".$i." |";
}
else
{
echo " ".$i." |";
}
}
}
else
{
for($i = $TotalPage - 8; $i ".$i." |";
}
else
{
echo " ".$i." |";
}
}
}
}
else
{
if($pagenum > 4 && $pagenum ".$i." |";
}
else
{
echo " ".$i." |";
}
}
}
else
{
for($i = 1; $i ".$i." |";
}
else
{
echo " ".$i." |";
}
}
}
}
}
if($pagenum != $TotalPage)
{
?>
&pagenum="> ->>
->>
&pagenum=">>|
[/php]
作者: DevilHookey 发布日期: 2005-6-28
计算总page num
得到当前page num
然后前减后加循环几次~
只是个想法~待批
作者: 纯粹误会 发布日期: 2005-6-28
下面这个是我做得第二个简单的分页函数,数据库照样可以使用
[php]
function ZH_Pagination ($total,$per,$page,$url)
{#程序:纯粹误会 zh5j.com QQ:44922032 2005年5月3日库数据库与文皆可使用,数据库用 mysql_data_seek定位
global $pBegin,$pEnd;#
$per>0||$per=10;#每页显示信息量
$page_total=ceil($total/$per);#页面总数
if($page$page_total)$page=1;#修正$page
$pBegin=max(($page-1)*$per,1);#当前页信息开始下标. 全局变量
$pEnd=Min($page*$per,$total);#当前页信息结束下标. 全局变量
if($page>1)$re="\n首页 上一页"; #当前页码比1大
else $re="\n首页 上一页";#当前页码不大于1
$begin=Max($page-5,1);
$end=Min($page+5,$page_total);
for($i=$begin;$i$i";# 其他
}
if($page下一页 尾页 ";# 当前页码比总页数小
else $re.="\n下一页 尾页";# 当前页码不小于总页数
return $re;
}
#test
$pagination=ZH_Pagination(1000,20,$_GET[page],"?page");
echo ($pagination);
for($i=$pBegin;$i$i";
}
[/php]
作者: 纯粹误会 发布日期: 2005-6-28
[php]
/*下面是一个纯粹误会早期所写的复杂语句,功能:让当前页永远距中,并使分页链接数量保持平衡*/
$offset=floor($midNum/2);
$current_page=$page;
if($current_page-$offset$page_cnt)$current_page=$page_cnt-$offset;
$begin=($current_page-$offset)>0?$current_page-$offset:1;
$end=($current_page+$offset)
作者: 纯粹误会 发布日期: 2005-6-28
楼主,你还想什么,非要自己写一个分页,google那个分页别怪我乱说,并不好,为什么有这么多人要先模仿他呢
不过很欣赏你的开发精神,写出让大看看,用最少语句,写出最大的功能
作者: zeying 发布日期: 2005-6-28
这个是我用的
$aNum //总记录数
$url //附加url地址
$PageList //每页记录数
$PageNum //所显示的页数,比如有10页,则显示到7
$space //分隔
[PHP]/* ===============
@@ 分页函数
================*/
function PageQuery($aNum,$page=1,$url="",$PageList=10,$PageNum=7,$space=" ")
{
if ($aNum==0)
{
return $p;
}
/*总页数计算*/
if ($aNum%$PageList==0)
{
$aPage=$aNum/$PageList;
}
else
{
$aPage=intval($aNum/$PageList)+1;
}
/*分页内容*/
if ($page>intval($PageNum/2)+1)
{
$p[]="|";
}
if ($page!=1)
{
$page_prev=$page-1;
$p[]="";
}
$page_start=$page-intval($PageNum/2);
$page_end=$page+intval($PageNum/2);
if($page_start$aPage)
{
$page_end=$aPage;
}
if ($page_end>$aPage-intval($PageNum/2))
{
if ($page_end-$PageNum$i";
}
else
{
$p[]="$i";
}
}
if ($page>>";
}
if ($page>>|";
}
$p[]="总共 $aPage 页 $aNum 条";
return implode($space, $p);
}[/PHP]
相关阅读 更多 +