分页|终结者
/*
------------------------------------------------------------------------------------
类名:Lwgpagenum
说明:PHP+MySQL分页类
作者:龙卫国
网络user:lwg888
邮箱:lwg888@163.com
使用、修改、传播请保留作者信息
------------------------------------------------------------------------------------
*/
require_once(dirname(__FILE__)."/Lwgdb.inc.php");
//Lwgdb.inc.php是数据库连接与sql语句执行类
class Lwgpageturn {
//----------可以设置值的变量----------------------------------------
var $maxnum;//每页显示数
var $maxnum_max_size=100; //每页最多显示数,用来规定$maxnum不能超过$maxnum_max_size
var $sql;//sql语句
var $navchar=array('[|<<]','[<]','[>]','[>>|]','[<<]','[>>]');
//导航条的显示字符,值可以自定义,如一个img标签
//$navchar[0]表示第一页,$navchar[1]表示前一页,$navchar[2]表示后一页,$navchar[3]表示最后页,$navchar[4]表示前n页,$navchar[5]表示后n页
var $key;//如果一个页面中有多个分页时作为区别标记
var $debug=true;//是否显示调试信息
//----------用来获取值的变量---------------------------------------
var $totalnum;//总记录数
var $totalpage;//总页数
var $startnum;//本页的第一条在总数中的序数
var $endnum;//本页的最后一条在总数中的序数
var $pagenum;//本页在总页数中的序数
var $field;//结果记录的集合
var $id;//每条记录的序号
var $linkhead;//链接指定的url及要传递的相关参数
var $err;//记录最后一条错误信息
//构造函数。
//参数$maxnum用来指定每页显示多少条记录,如果不指定$maxnum,表示全部显示而不用分页
//如果同一个页面中有两个以上的分页,参数$key作为区分标记,否则不用指定
//使用方法:
// $obj=new Lwgpagenum('10');
//或: $obj=new Lwgpagenum();
// $obj->maxnum="10";
// $obj->key="1";
function Lwgpageturn($maxnum="",$maxnum_max_size='',$key=""){
$this->maxnum=$maxnum;
if ($maxnum_max_size!="")$this->maxnum_max_size=$maxnum_max_size;
$this->key=$key;
}
//通过run方法运行sql并取得相关信息
//$sql参数为有效的sql语句。可以通过$obj->sql=""来指定
//$db参数为数据库连接ID
//使用方法:
//$sql="select * from table";
//$db=mysql_connect('host','user','pass');
//$obj->run($sql,$db);
//或:
//$obj->sql="select * from table";
//$obj->run();
function run($sql='',$db=''){
if ($sql!="")$this->sql=$sql;
if ($this->sql=="") return $this->output("错误:未给出sql查询语句!");
if ($this->maxnum<0 || $this->maxnum_max_size<0) return $this->output("错误:maxnum、maxnum_max_size都不能小于0!");
if ($db=="")$db=new Lwgdb();
//如果没有指定参数$db,则用Lwgdb类与数据库建立连接
if (empty($this->maxnum)){
//如果初始maxnum为空,则显示全部记录而不用分页
$result = $db->query($this->sql);//执行sql语句
$this->totalnum = mysql_num_rows($result);//取得总记录数
if ($this->maxnum_max_size>0 && $this->totalnum>$this->maxnum_max_size)return $this->output("错误:记录数太多,请使用分页!");
$this->startnum=0;//第一条记录数为0
$this->endnum=$this->totalnum;//最后一条记录数与总记录数相同
}
else {
$ifpost=false;
//是否有$_POST变量,如果有的话,则在翻页时只传递其值,其它的一律省略
if (sizeof($_POST)>0){
$formlink = "";
$ifpost=true;
foreach ($_POST as $key => $value) {
//循环分析出$_POST变量的键值
if (!empty($value)) $formlink .=$key."=".rawurlencode($value)."&";
}
$querystring=$formlink;//将$_POST变量的键值作为翻页时传递的参数
}
else {
//如果没有$_POST变量,则将$_GET变量分析后作为翻页时传递的参数
$qs=explode("totalnum".$this->key,$_SERVER['QUERY_STRING']);
if ($qs[0]!="")$querystring=(substr($qs[0],-1)=="&")?$qs[0]:$qs[0]."&";
//扔掉totalnum及其以后的参数,因为要付新的值
}
if (isset($_GET["totalnum".$this->key]) && $_GET["totalnum".$this->key]>0 && !$ifpost)$this->totalnum = sprintf('%d',$_GET["totalnum".$this->key]);
//如果有$_POST变量,则不再传递旧的totalnum参数
//否则如果在$_GET中有totalnum,则直接传递它,而不用重新计算
else {
$all_result = $db->query($sql);
$this->totalnum = mysql_num_rows($all_result);
//如果$totalnum<=0,视为无效,重新计算值
}
if (isset($_GET["maxnum".$this->key]) && $_GET["maxnum".$this->key]>0)$this->maxnum = sprintf('%d',$_GET["maxnum".$this->key]);
//如果通过get接收到$maxnum,则使用之,这样便能在客户端指定要显示的记录数
if ($this->maxnum_max_size>0 && $this->maxnum>$this->maxnum_max_size)$this->maxnum=$this->maxnum_max_size;
//如果$maxnum<=0,视为无效,重新计算值
if ($this->maxnum==$this->totalnum){
//虽然前面说maxnum的初始值为空时也是全部显示,但没有任何统计与导航, 适用于如首页的显示前n条记录
$this->totalpage=1;
$this->startnum=0;
$this->endnum=$this->totalnum;
$result=(empty($all_result))?$db->query($sql):$all_result;
//$result是用来显示记录的数据库查询id;
//如果前面计算总数时已有id,则直接使用前面的
}
else {
if (!empty($all_result))mysql_free_result($all_result);
$this->totalpage=ceil($this->totalnum/$this->maxnum);
$this->pagenum =(isset($_GET["pagenum".$this->key]) && $_GET["pagenum".$this->key]>0 && !$ifpost)?sprintf('%d',$_GET["pagenum".$this->key]):1;
//如果没有$_POST变量,并且$_GET变量中有发pagenum参数,则使用之,否则,表示页数的pagenum为1
if ($this->pagenum>$this->totalpage)$this->pagenum=$this->totalpage;
$this->startnum = max(($this->pagenum-1) * $this->maxnum,0);
$this->endnum=min($this->startnum+$this->maxnum,$this->totalnum);
//本页显示数为本页的最后一条在总数中的序数减去本页的第一条在总数中的序数
$limitstart=0;
// 如果sql语句中有limit,则重新设置limit的参数
//重设limit的第一个参数为 $limitstart=0
if (eregi("limit (-?[0-9]+) *,? *(-?[0-9]*)",$sql,$regs)){
if (!empty($regs[2])) $limitstart=$regs[1];
//$regs[1]为limit的第一个参数;$regs[2]为limit的第二个参数
//如果存在第二个参数,则让$limitstart=第一个参数
//此时第二个参数已没有用,因为在计算总数时已发挥作用
$sql=eregi_replace("limit (-?[0-9]+) *,? *(-?[0-9]*)","",$sql);
//去掉limit,因为后面要新建limit
}
$limitstart+=$this->startnum;
$query_limit = sprintf("%s LIMIT %d, %d", $sql, $limitstart,$this->maxnum) = $db->query($query_limit);
GET[ "最大"。 $this->key]))$querystring.="&maxnum".$this->key."=".$this->maxnum; "?" $ Querystring; TotalNum と Maxnum で渡すパラメータを URL の後ろに追加します}}
$ i = 0;
Tile ($ myRow = MySQL_FETCH_ARAY ($ Result) ; ;
//「合計 14 ページ」のように表示されますと 27 項目"
//使用法: echo $obj-> ;total()
function total(){
if ($this->maxnum=="")return;
"記事";
}
/ / 「このページは第9条から第10条までです」のように表示されます
// 使用法:echo $obj->fromto()
function fromto(){
if ($this ->maxnum=="")return;
$startnum=$this-> .$startnum."Bar to ".$this->endnum."
}
//navbar メソッドはページ番号ナビゲーション バーを表示します
//$num_size は方法を示します$num_size=5 など、多くのナビゲーション番号を指定すると、「1 2 3 4 5」と表示されます
//$num_style は数値ナビゲーション バーのスタイルです
// $num_style の値が 1 の場合、番号はグループ化されますで、表示は「最初の 5 ページ 前の 1 ページ 1 2 3 4 5 次のページの 5 ページ」のようになります
//$num_style の値が 1 以外の場合、表示は「1 2 3 4 5」のようになります。 ...";
//$nolink_show リンクのないナビゲーション文字が表示されるかどうか、true が表示される、false が表示されない
//$nolink_color リンクのないナビゲーション文字によって表示される色
//Usage: echo $obj-> ;navbar(10,2,false,"#ffff00")
function navbar($num_size=0,$num_style =1,$nolink_show=false,$nolink_color="#ff0000"){
If ($this-> totalpage<=1)return;
If ($num_size>0){
if ($num_style==1 ){
前のページのすべてのグループを取得します
$nextunit=($thisunit
$startpage=($thisunit-1)*$num_size+1;//取得本组的开始页
$endpage=min($thisunit*$num_size,$this->totalpage);//取得本组的最后页
if ($preunit!=""){
$str_preunit=" linkhead."&pagenum".$this->key."=".(($thisunit-2)*$num_size+1)."\" title=\"前".$num_size."页\">".$this->navchar[4]." ";
}
if ($nextunit!=""){
$str_nextunit=" linkhead."&pagenum".$this->key."=".($thisunit*$num_size+1)."\" title=\"后".$num_size."页\">".$this->navchar[5]."";
}
}
else {
$tmpnum=ceil($num_size/2);
$startpage=max(min($this->pagenum-$tmpnum,$this->totalpage-$num_size+1),1);
$endpage=min($startpage+$num_size-1,$this->totalpage);
if ($startpage>1)$str_frontell=" … ";
if ($endpage<$this->totalpage)$str_backell=" … ";
}
$str_num="";
for ($i=$startpage;$i<=$endpage;$i++){
if ($i==$this->pagenum)$str_num.=" ".$i." ";
else $str_num.= " linkhead."&pagenum".$this->key."=".$i."\" title=\"第".$i."页\">".$i." ";
}
}
if ($this->pagenum > 1){
$str_first=" linkhead."&pagenum".$this->key."=1\" title=\"第一页\">".$this->navchar[0]." ";
$str_pre=" linkhead."&pagenum".$this->key."=".($this->pagenum-1)."\" title=\"前一页\">".$this->navchar[1]." ";
}
else if ($nolink_show){
$str_first=" ".$this->navchar[0]." ";
$str_pre=" ".$this->navchar[1]." ";
}
if ($this->pagenum<$this->totalpage){
$str_next= " linkhead."&pagenum".$this->key."=".($this->pagenum+1)."\" title=\"后一页\">".$this->navchar[2]." ";
$str_last= " linkhead."&pagenum".$this->key."=".$this->totalpage."\" title=\"最后页\">".$this->navchar[3]." ";
}
else if ($nolink_show){
$str_next=" ".$this->navchar[2]." ";
$str_last=" ".$this->navchar[3]." ";
}
return $str_first.$str_preunit.$str_pre.$str_frontell.$str_num.$str_backell.$str_next.$str_nextunit.$str_last;
}
//「m ページ中 n ページまで」などの表示にはドロップダウン リストを使用します
//使用法: echo $obj->pagejump()
function pagejump(){
if ($this->totalpage< ;=1 ; .$this->droplist("pagenum".$this->key,$options)."page/total".$this->totalpage."page";ドロップダウンリスト表示を使用する 「ページごとに n 項目を表示」など
//使用法: echo $obj->maxnum()
function maxnum(){
if ($this->maxnum=="")return ;
$options=array ('1'=>'1','2'=>'2','3'=>'3','4'=>'4','6' =>'6' 、'8'=>'8'、'9'=>'9'、'10'=>'10'、'20'=>'20'、'30' =>'30' ,'50'=>'50','100'=>'100','All'=>$this->totalnum);
return "ページごとに表示". $this->droplist("maxnum".$this->key,$options)."Bar"
}
//droplist() はドロップダウン メニューを生成するために使用されます。
関数droplist($name,$options, $class=""){
class='".$class."' ";
$write.=">"; $tmplinkhead=eregi_replace("&maxnum".$これ - &gt; "= [0-9]、"、$ this-&gthead); pagenum- = 1;
// 各ページのレコード数が変わったので再計算が必要 $ pagenum
$ linkhead = $ tmplinkhead. "& Pagenum." = $ this->totalnum> ;$this->maxnum_max_size){
.$this->max num_max_size.(($this->maxnum_max_size==$this->maxnum)?" 選択済み>":">" ).$this->maxnum_max_size." ";
" _size、"all" および $this->maxnum_max_size を超えるオプションは表示されません。
else if ($preval<$this->maxnum && $val>$this->maxnum)$write.="";
//当$maxnum的值不选单中時間则创建它
$write.=" if ($this->maxnum==$val)$write.=" selected";
$preval=$val;
}
else if ($name=="pagenum".$this->key){
$write.="";
}
$write.="";
$write を返します。
}
//出力错误情報
function Output($msg){
if ($msg!="")$this->err=$msg;
if ($this->debug)echo "