<?php
/**
 * 一个用于Mysql数据库的分页类
 *
 * @author      Avenger <[email protected]>
 * @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 ($current<1) {$current = 1;} $this->curr  = $current;
$this->psize = $pagesize; if (!$this->file) {$this->file = $HTTP_SERVER_VARS['PHP_SELF'];} if ($this->tpage > 1) {
            
if ($current>10) {
$this->output.='<a href='.$this->file.'?'.$this->pvar.'='.($current-10).($this->varstr).' title="前十页">&lt;&lt;&lt;</a>&nbsp;';
}
            if ($current>1) {
$this->output.='<a href='.$this->file.'?'.$this->pvar.'='.($current-1).($this->varstr).' title="前一页">&lt;&lt;</a>&nbsp;';
}            $start = floor($current/10)*10;
            $end = $start+9;            if ($start<1) {$start=1;}
            if ($end>$this->tpage) {$end=$this->tpage;}            for ($i=$start; $i<=$end; $i++) {
                if ($current==$i) {
                    $this->output.='<font color="red">'.$i.'</font>&nbsp;';    //输出当前页数
                } else {
                    $this->output.='<a href="'.$this->file.'?'.$this->pvar.'='.$i.$this->varstr.'">['.$i.']</a>&nbsp;';    //输出页数
                }
            }            if ($current<$this->tpage) {
$this->output.='<a href='.$this->file.'?'.$this->pvar.'='.($current+1).($this->varstr).' title="下一页">&gt;&gt;</a>&nbsp;';
}
            if ($this->tpage>10 && ($this->tpage-$current)>=10 ) {
$this->output.='<a href='.$this->file.'?'.$this->pvar.'='.($current+10).($this->varstr).' title="下十页">&gt;&gt;&gt;</a>';
}
}
}    /**
     * 要传递的变量设置
     *
     * @access public
     * @param array $data   要传递的变量,用数组来表示,参见上面的例子
     * @return void
     */
function setvar($data) {
foreach ($data as $k=>$v) {
$this->varstr.='&amp;'.$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
?>这是个mysql的分页类。你自己看吧!

解决方案 »

  1.   

    摘录:
    <?
    //为了避免重复包含文件而造成错误,加了判断函数是否存在的条件:
    if(!function_exists(pageft)){ 
    //定义函数pageft(),三个参数的含义为:
    //$totle:信息总数;
    //$displaypg:每页显示信息数,这里设置为默认是20;
    //$url:分页导航中的链接,除了加入不同的查询信息“page”外的部分都与这个URL相同。
    //   默认值本该设为本页URL(即$_SERVER["REQUEST_URI"]),但设置默认值的右边只能为常量,所以该默认值设为空字符串,在函数内部再设置为本页URL。
    function pageft($totle,$displaypg=20,$url=''){//定义几个全局变量: 
    //$page:当前页码;
    //$firstcount:(数据库)查询的起始项;
    //$pagenav:页面导航条代码,函数内部并没有将它输出;
    //$_SERVER:读取本页URL“$_SERVER["REQUEST_URI"]”所必须。
    global $page,$firstcount,$pagenav,$_SERVER;//为使函数外部可以访问这里的“$displaypg”,将它也设为全局变量。注意一个变量重新定义为全局变量后,原值被覆盖,所以这里给它重新赋值。
    $GLOBALS["displaypg"]=$displaypg;if(!$page) $page=1;//如果$url使用默认,即空值,则赋值为本页URL:
    if(!$url){ $url=$_SERVER["REQUEST_URI"];}//URL分析:
    $parse_url=parse_url($url);
    $url_query=$parse_url["query"]; //单独取出URL的查询字串
    if($url_query){
    //因为URL中可能包含了页码信息,我们要把它去掉,以便加入新的页码信息。$url_query=ereg_replace("(^|&)page=$page","",$url_query);//将处理后的URL的查询字串替换原来的URL的查询字串:
    $url=str_replace($parse_url["query"],$url_query,$url);//在URL后加page查询信息,但待赋值: 
    if($url_query) $url.="&page"; else $url.="page";
    }else {
    $url.="?page";
    }页码计算:
    $lastpg=ceil($totle/$displaypg); //最后页,也是总页数
    $page=min($lastpg,$page);
    $prepg=$page-1; //上一页
    $nextpg=($page==$lastpg ? 0 : $page+1); //下一页
    $firstcount=($page-1)*$displaypg;//开始分页导航条代码:
    $pagenav="显示第 <B>".($totle?($firstcount+1):0)."</B>-<B>".min($firstcount+$displaypg,$totle)."</B> 条记录,共 $totle 条记录<BR>";//如果只有一页则跳出函数:
    if($lastpg<=1) return false;$pagenav.=" <a href='$url=1'>首页</a> ";
    if($prepg) $pagenav.=" <a href='$url=$prepg'>前页</a> "; else $pagenav.=" 前页 ";
    if($nextpg) $pagenav.=" <a href='$url=$nextpg'>后页</a> "; else $pagenav.=" 后页 ";
    $pagenav.=" <a href='$url=$lastpg'>尾页</a> ";//下拉跳转列表,循环列出所有页码:
    $pagenav.=" 到第 <select name='topage' size='1' onchange='window.location=\"$url=\"+this.value'>\n";
    for($i=1;$i<=$lastpg;$i++){
    if($i==$page) $pagenav.="<option value='$i' selected>$i</option>\n";
    else $pagenav.="<option value='$i'>$i</option>\n";
    }
    $pagenav.="</select> 页,共 $lastpg 页";
    }
    }
    ?>使用例子
    <?
    //(前面程序略) 
    include("pageft.php"); //包含“pageft.php”文件
    //取得总信息数
    $result=mysql_query("select * from mytable");
    $total=mysql_num_rows($result);
    //调用pageft(),每页显示10条信息(使用默认的20时,可以省略此参数),使用本页URL(默认,所以省略掉)。
    pageft($total,10);
    //现在产生的全局变量就派上用场了:
    $result=mysql_query("select * from mytable limit $firstcount,$displaypg ");
    while($row=mysql_fetch_array($result)){
    //(列表内容略)
    }//输出分页导航条代码:
    echo $pagenav;//(后面程序略)
    ?>
      

  2.   

    将查询表达式保存在session中或在页面间传递
    你的
    $query="select id,ename,cname,lname from ecduizhao where cname='".$lyhjs."' or ename='".$lyhjs."'or letter='".$lyhjs."' or lname='".$lyhjs."'  limit $firstcount,$displaypg ";则查询表达式为
    $search = "cname='".$lyhjs."' or ename='".$lyhjs."'or letter='".$lyhjs."' or lname='".$lyhjs."'";sql串改写为
    $query="select id,ename,cname,lname from ecduizhao where $search limit $firstcount,$displaypg ";