"select id,name,email,oicq from class limit $offset,$pagesize"
这就是PHP分页的核心ASP的SQL不能这样做,但它有记录集对象,也可以实现,不过总的来说还是PHP的方法够节省资源

解决方案 »

  1.   

    但是在sql 中不支持limit语句吧,请高手也讨论一下sql中怎么用最简单的方法实现吧
      

  2.   

    改写夜猫:
    //-------------------函数:LIST_PAGES()--------------------------------------------------//
    //
    //
    //           功能:通用的分页函数
    //           形参:
    //              $type:         分类,
    //              $setpage:      显示的页数,
    //              $setid:       显示的ID,
    //              $table:        处理的表名,
    //              $htmlname:     调用分页显示的网页名
    //              $index:        索引
    //              $classid:      分类ID;
    //         GLOBAL:
    //              $dbhost,$dbuser,$dbpasswd,$dbname; 数据库连接变量
    //              $list_num:     每页显示的数量
    //              $list_page_num:每页显示的分页
    //         返回:
    //              无
    //         调用方法:
    //              list_pages($type,$setpage,$setid,$table,$htmlname,$classid,$index);
    //
    //------------------------------------------------------------------------------------------------------------//
    function list_pages($type,$setpage,$setid,$table,$htmlname,$classid,$index)
    {
             global $dbhost,$dbuser,$dbpasswd,$dbname;
             global $list_num,$list_page_num;        if (empty($type) || $type==0)
            {
                         $type = 0;
                         $istype = "";
            }
            else{
                         $istype = "WHERE $classid=".$type;
            }
            $sql = "SELECT COUNT(*) AS rcnt FROM $table $istype ORDER BY $index DESC";
            mysql_select_db($dbname);
            $result = mysql_query($sql);
            $row = mysql_fetch_array($result);        $num = $row['rcnt'];
            if (empty($setid))
            {
                        $setid = 0;
            }        $sql = "SELECT * FROM $table $istype ORDER BY $index DESC LIMIT $setid, $list_num";
            mysql_select_db($dbname);
            $result = mysql_query($sql);
            // 计算页数
            $pages = ceil($num/$list_num);
            $page = ceil($pages/$list_page_num);        if ($setid > 0)
            {
                        $setpage1 = ceil($setid/$list_num);
                        $setpage = ceil(($setpage1+1)/$list_page_num);
            }
            else{
                        $setpage = 1;
            }        if ($pages > $list_page_num)
            {
                          $pagenum = $list_page_num;
            }
            else{
                          $pagenum = $pages;
            }        $issetid = ceil(($setid+1)/$list_num);
            $issetpage = $issetid % $list_page_num;
            // 第一页
            if ($setpage > 1)
            {
                           echo "<a title='第一页' href='$htmlname?type=".$type."&setpage=1&setid=0'>[1]</a>...\n";
            }        // 上一列
            if ($setpage>1)
            {
                         $lastpage = $setpage-1;
                         $lastsetid = ($setpage-2)*$list_page_num*$list_num;
                         echo "<a title='上一列' href='$htmlname?type=".$type."&setpage=".$lastpage."&setid=".$lastsetid."'>[<<]</a> - \n";
            }        // 上一页
            if ($setid > 0)
            {                      if ($issetpage == 1)
                          {
                                            $newsetpage = $setpage-1;
                          }
                          else{
                                            $newsetpage = $setpage;
                          }                                        $presetid = $setid-$list_num;
                                            echo "<a title='上一页' href='$htmlname?type=".$type."&setpage=".$newsetpage."&setid=".$presetid."'>[<]</a> \n";
            }        // 列出页
            $i1 = ($setpage-1)*$list_page_num;
            for ($i=$i1; $i<($i1+$pagenum) && $i<$pages; $i++)
            {
                          $newsetid=$list_num*$i;
                          if (($setid/$list_num) == $i)
                          {
                                           echo "<b><font color=red>[".($i+1)."]</font></b> \n";
                          }
                          else{
                                           echo "<a href='$htmlname?type=".$type."&setpage=".$setpage."&setid=".$newsetid."'>[".($i+1)."]</a> \n";
                          }        }        // 下一页
            if ($pages!=0 && ($setid/$list_num+1)!=$pages && ($setid/$list_num+1)<=$pages||$setid==1)
            {
                        if ($list_page_num-$issetpage == 0 || $issetpage == 0)
                        {
                                             $newsetpage = $setpage+1;
                        }
                        else{
                                             $newsetpage = $setpage;
                        }                    $newsetid = $setid+$list_num;
                        echo "<a title='下一页' href='$htmlname?type=".$type."&setpage=".$newsetpage."&setid=".$newsetid."'>[>]</a> \n";
            }        // 下一列
            if ($pages!=0 && $pages>$list_page_num && $setpage<$page)
            {
                        $nextpage = $setpage+1;
                        $nextsetid = $setpage*$list_page_num*$list_num;
                        echo "- <a title='下一列' href='$htmlname?type=".$type."&setpage=".$nextpage."&setid=".$nextsetid."'>[>>]</a>\n";
            }        // 最后一页
            if ($pages>$list_page_num && $setpage<$page)
            {
                        $lastpage = $list_num*($pages-1);
                        echo "...<a title='最后一页' href='$htmlname?type=".$type."&setpage=".$page."&setid=".$lastpage."'>[".$pages."]</a>\n";
            }}
    //------------------------------------------ end list_pages------------------------------------------------//
      

  3.   

    分页有什么好讨论的吗?好象都差不多是大同小异呀(个人感觉)!
    如果非要我说点看法的话,我觉得在读取总记录数以取得总页数时,不要用select *,而用一个具体的最小的字段,如id。
    还有,在后面的滚页的地方,不如多加一个<select></select>,这样,在页面少时可以直接跳到任何一页,而在页在多时,仅列出与当前页相邻的前后各N页就可以了。
      

  4.   

    不知是谁所创(略有改动,本人认为实在经典):
    <?
    /********************************************* 
    以下是此分页类的所有方法: 
    ***********************************************/ 
    /*
    构造函数 Page($SQL,$ML,$MP,$TS,$TC,$INBDRC,$INBGC) 
    参数:查询的SQL语句、最大行数、每次输出的页码数、输出的文本大小、文本颜色、输入框边框原色、输入框背景原
    色 设置传递参数 SetPageQuery($key,$value) 
    参数:参数名称,参数值 读取记录,显示输出 ShowList($startpage,$t,$OF,$phpscript) 
    参数:输出页码的最小值、何种方式跳转的标志,数据记录集的偏移量,当前文件名 
    此部分参数无须给定值,调用时只需延用以下变量名称即可 
    */
    /********************************************* 
    分页显示Mysql数据库记录的类 
    本类需在外部打开相应的数据库。 
    ***********************************************/ 
    class Page { 
    var $MaxLine; //每页显示行数 
    var $MaxPage; //每次显示分页数 
    var $Offset; //记录偏移量 
    var $Total; //记录总数 
    var $Result; //读出的结果 
    var $TPages; //总页数 
    var $CPages; //当前页数 
    var $Sql;//将要执行的SQL语句 
    var $PageQuery; //分页显示要传递的参数 
    var $OutPut; //输出内容 
    var $TextSize;//输出文字的大小 
    var $TextColor;//输出文字的颜色 
    var $TTextColor;//当前页输出文字的颜色 
    var $InBdrColor;//输出文本框的边框颜色 
    var $InBgColor;//输出文本框的背景颜色 /******构造函数************* 
    参数:查询的SQL语句、最大行数、每次输出的页码数、输出的文本大小、文本颜色、输入框边框原色、输入框背景原
    色 
    ***************************/ function Page($SQL,$ML,$MP,$TS,$TC,$TTC,$INBDRC,$INBGC){ 
    $this->Sql=urldecode($SQL); 
    $this->Sql=StripSlashes($this->Sql); 
    $this->MaxLine=$ML; 
    $this->MaxPage=$MP; 
    $this->TextSize=$TS; 
    $this->TextColor=$TC;
    $this->TTextColor=$TTC;
    $this->InBdrColor=$INBDRC; 
    $this->InBgColor=$INBGC; 

    //******设置传递参数************ 
    function SetPagePara($key,$value){ 
    $tmp[key]=$key; $tmp[value]=$value; 
    $this->PageQuery[]=$tmp; 

    /********读取记录,显示输出*************** 
    参数:输出页码的最小值、何种方式跳转的标志,数据记录集的偏移量,当前文件名 
    此部分参数无须给定值,调用时只需延用以下变量名称即可 
    ****************************************/ 
    function ShowList($startpage,$t,$OF,$phpscript) { 
    if ($OF=="") $OF=0; 
    $this->Offset=$OF; //确定此次的偏移量 
    $querysql=$this->Sql; //分情况确定输出页码的起始值 
    if ($t==1) {$startpage=$startpage+$this->MaxPage;$this->Offset=($startpage-1)*$this->MaxLine;} 
    if ($t==2) {$startpage=$startpage-$this->MaxPage;if ($startpage<1) 
    {$startpage=1;}$this->Offset=($startpage-1)*$this->MaxLine;} 
    if ($t==3) {$this->Offset=($startpage-1)*$this->MaxLine;} 
    if ($startpage<1 or $startpage=="") $startpage=1; //计算此次查询结果的记录条数 
    $result=mysql_query($querysql); 
    $this->Total = mysql_num_rows($result); //把当前页的数据付给本类的对应属性,便于调用时直接使用 
    $sqllimit =" LIMIT ".$this->Offset." , ".$this->MaxLine;$this->Result = mysql_query($querysql.$sqllimit); $this->Tpages=ceil($this->Total/$this->MaxLine); 
    $this->CPages=$this->Offset/$this->MaxLine+1; 
    $querysql = urlencode($this->Sql); //确定输出内容,并付给本类的相应属性。 
    $this->OutPut="<table><form name=\"pageform\" action=$phpscript&offset=$this->Offset&querysql=$querysql><tbody><font 
    style=\"font-size:$this->TextSize;color:$this->TextColor\">共<b> ".$this->Tpages."</b> 
    页/第</font><input type=\"text\" name=\"startpage\" size=\"3\" maxlength=\"4\" 
    value=\"".$this->CPages."\" style=\"border:$this->InBdrColor 1pt 
    solid;background-color:$this->InBgColor;height:12pt;text-align: center;color:$this->TextColor\"><font 
    style=\"font-size:$this->TextSize;color:$this->TextColor\">页</font> \n"; 
    $this->OutPut.="<input type=\"hidden\" name=\"t\" value=3>"; 
    $k=count($this->PageQuery); //生成需传递的参数字符串或隐藏文本域 
    $strQuery=""; 
    for($i=0;$i<$k;$i++){ 
    $strQuery.="&".$this->PageQuery[$i][key]."=".$this->PageQuery[$i][value]; 
    $this->OutPut.="<input type=\"hidden\" name=\"".$this->PageQuery[$i][key]."\" 
    value=".$this->PageQuery[$i][value].">"; 

    if ($startpage>1) //若起始页大于一,则显示 [<<]
    {    $this->OutPut.="<font style=\"font-size:$this->TextSize;color:$this->TextColor\">[<a 
    href=$phpscript&offset=$this->Offset&querysql=$querysql&startpage=$startpage&t=2$strQuery 
    style=\"color:$this->TextColor;text-decoration:none\"><<</a>]</font>";

    for ($i=$startpage;$i<=$this->Tpages;$i++)
    {     $offset=($i-1)*$this->MaxLine; 
          $ii=$i<10?'0'.$i:$i;
         if($this->CPages != $i) $this->OutPut.="<font 
    style=\"font-size:$this->TextSize;color:$this->TextColor\">[<a 
    href=$phpscript&offset=$offset&querysql=$querysql&startpage=$startpage$strQuery 
    style=\"color:$this->TextColor;text-decoration:none\">".$ii."</a>]</font>";
         else $this->OutPut.="<font style=\"color:$this->TTextColor;font-size:$this->TextSize;\">[$ii]</font>";
           if ($i-$startpage>$this->MaxPage-2 and $i!=$this->Tpages) //显示 [>>]
       {    $this->OutPut.="<font style=\"font-size:$this->TextSize;color:$this->TextColor\">[<a 
    href=$phpscript&offset=$this->Offset&querysql=$querysql&startpage=$startpage&t=1$strQuery 
    style=\"color:$this->TextColor;text-decoration:none\">>></a>]</font>";break;
       }

    $this->OutPut.='</tbody></form></table>'; 
    } //   end class 

    $MaxLine = 2; //每页显示行数
    $MaxPage = 5; //每次显示分页数 
    mysql_connect('localhost','ck','ok');
    mysql_select_db('nukesky');
    $query = urlencode('select * from nukesky_post');
    $pclass=new Page($query,$MaxLine,$MaxPage,'10pt','blue','red','black','#aaaaaa');
    $phpscript=$PHP_SELF.'?name=ck';
    $pclass->ShowList($startpage,$t,$offset,$phpscript);//生成输出内容,并付给相应属性
    echo 'a'.$pclass -> OutPut.'b';
    while($data=mysql_fetch_row($pclass->Result)){ 
    echo"$data[1]$data[2]$data[3]";
    }
    ?>
    在原代码中在<form>的前后并没有<table>和<tbody>标签
    但当输出时(不加以上两标签时,代码的倒数第5行输出),形式如下:
    a共 53 页/第页 [01][02][03][04][05][>>] ba b 与输出内容之间空格太大(我对html代码不是很在行),不知有没有另外的解决方法,望哪位高手指教指教
      

  5.   

    这个class写得其实也不怎么样?首先:  与数据库相关( 必须mysql ),第二,如果加什么连接,显示数据为连接 ,不能很好实现。第三: class考虑不周到 ,比如-1等例外 。  等我有空了自己写个。  今天看了一个php+gd 的class写了
    5000行,一个 class .
      

  6.   

    换数据库只需要换换函数就可以<?php
    //*********************************************
    //  名称: 数据操作程序 v 1.2
    //  脚本: php 4.2.0RC4
    //  数据库: mysql 3.23.49
    //  制作: [email protected]
    //  完成: 2002-4-15 22:05
    //  备注: 此程序中的翻页算法通用于所有数据库
    // 更换数据库只需更换php数据库函数
    // 需要自己定制的变量注释后面有" * "
    //  Copyright By 开花石头 ◎ 2001
    //*********************************************
    mysql_connect('localhost','root','');
    mysql_select_db('myferly');//所操作的表名*
    $table_name = "user_info";//处理删除程序
    if(isset($cngift[0])){
    for($i = 0;$i<sizeof($cngift);$i++){ $Del_Sql = "Delete from ".$table_name." where ".$sign_value."='$cngift[$i]'";
    mysql_query($Del_Sql);

    }
     echo "<script>alert('共删除了".$i."条数据!')</script>";
    }
    //显示列表数目*
    $PAGESIZE = 10;
    //定义列表的表头(注:$table_title和table_value的顺序一定不能错)*
    $table_title = array("编号","品名","单价");//定义列表显示内容的数据库字段名(注:select的值不一定都要显示)*
    $table_value = array("id","username","password");//定义显示列表的sql语句的返回值*
    //列表显示的值一定要写在返回值的最前面*
    $return = "id,username,password";//当需要倒叙显示数据时请填写倒叙的数据库字段*
    $flashback = "id";//定义sql语句中where后面的条件语句,字串中不需要写where*
    //当需要id='$id'时,直接写$where = "id='$id'"*
    $where = "";//定义select中的条件变量作为计算翻页时的传递变量*
    //如果$where = "id='$id' and name='$name'"*
    //则$impress = "id='$id'&&name='$name'";*
    $impress = "";//定义进行数据操作中的参数值,一定是sql中取到的有唯一值的字段*
    $sign_value = "id";$sql = "select ".$return." from ".$table_name;//处理一般列表
    if($where != ""){

    $sql = "select ".$return." from ".$table_name." where ".$where;
    }//处理搜索
    if($search_select != ""&&$search_value != ""){

    $sql = "select ".$return." from ".$table_name." where ".$search_select." like '%".$search_value."%'";

    if($where != ""){

    $sql = "select ".$return." from ".$table_name." where ".$where." and ".$search_select." like '%".$search_value."%'";
    }}//处理sql语句倒叙
    if($flashback != ""){
    $sql.= " order by ".$flashback." desc";
    }
    $query = mysql_query($sql);//翻页处理程序
    //-- 总页数
    $number = mysql_num_rows($query);
    $sum = ceil($number / $PAGESIZE);
     
    if (($num == "") || ($num <= 0) || ($num > $sum)){ $num = 1;}
     
    //--开始和结束的位置
    $start = $num * $PAGESIZE - $PAGESIZE + 1;
    $end = $num * $PAGESIZE;

    $j = 1;$table_title_num = sizeof($table_title);
    $table_value_num = sizeof($table_value);
    ?><html>
    <head>
    <title>数据操作程序 v 1.2</title>
    <meta content="text/html; charset=gb2312">
    <script language="JavaScript">
    function SelectAll(){
    var items = document.cngift.elements[0];
    for(var i=0;i<document.cngift.elements.length;i++){
    if(document.cngift.elements[i].type != "checkbox"){
    continue;}
    items = document.cngift.elements[i];
    if(items.name = 'cngift[]')
    items.checked = true;
    }
    }
    </Script>
    </head><body bgcolor="#FFFFFF">
    <form method="post" action=<?=$PHP_SELF?> name="cngift">
      <table width="350" border="1" bordercolorlight="#000000" bordercolordark="#FFFFFF" cellpadding="0" cellspacing="0">
        <tr>
        <?php
         //表头处理
         for($i=0;$i<$table_title_num;$i++){
        ?>
          <td height="20"> 
            <div align="center"><font size="2"><?=$table_title[$i]?></font></div>
          </td>
        <?}?>
          <td height="20"> 
            <div align="center"><font size="2">维护操作</font></div>
          </td>
        <tr>
        <?php            while(($rs = mysql_fetch_array($query)) && ($j<=$end)){
    if($j >= $start){
         //内容列表    
         for($i=0;$i<$table_value_num;$i++){
        ?> 
          <td height="20"> 
            <div align="center"><font size="2"><?=$rs[$i]?></font></div>
          </td>
          <?php
           }//for end
      ?>
          <td> 
            <div align="center"> <font size="2"> 
              <input type="checkbox" name="cngift[]" value=<?=$rs[$sign_value]?>>
            </font></div>
          </td>
        </tr>
          <?php
    }
    $j++;
    }//while end
          ?>    <tr> 
          <td colspan="4"> 
            <div align="center"> 
             <input type="hidden" name="start_num" value=<?=$start_num?>>
             <input type="hidden" name="sign_value" value=<?=$sign_value?>>
             <input type="hidden" name="search_value" value=<?=$search_value?>>
             <input type="hidden" name="search_select" value=<?=$search_select?>>
                <input type="submit" name="Submit" value="删除" onClick="return confirm('你真的要删除所选信息?!');">
       <input type=button value=全选 onClick='SelectAll()'>
       <input type=reset value=全不选>
       <input type=button value=版权信息 onClick="return confirm('数据操作程序 v 1.2\n\nCopyright By 开花石头 ◎ 2002\n\nEmail:[email protected]');">
            </div>
          </td>
        </tr>
        <tr> 
          <td colspan="4"> 
            <div align="center"><font size="2">
    <?       
    if($num==1){
    echo "[首页] \n";
    }else{
    echo " <a href=?num=1&&search_select=$search_select&&search_value=$search_value&&$impress>[首页]</a> \n";
    }
    if($num>1){
      $num--;
      echo " <a href=?num=$num&&search_select=$search_select&&search_value=$search_value&&$impress>[前页]</a> \n";
      $num++;
      }else{
      echo "[前页] \n";   
      }
      echo "&nbsp;";
      if($num<$sum && $sum != 0){
      $num++;
      echo "  <a href=?num=$num&&search_select=$search_select&&search_value=$search_value&&$impress>[后页]</a>  \n";
      $num--;
      }else{
      echo "[后页] \n";
      }
      if($num != $sum && $sum != 0){
      echo "<a href=?num=$sum&&search_select=$search_select&&search_value=$search_value&&$impress>[末页]</a> \n";
    }else{
      echo "[末页] \n ";
    }
    echo "[当前".$num."/".$sum."页]";
    ?></font></div>
          </td>
        </tr>
      </table>
    </form>
    <form method="post" action="">
      <input type="text" name="search_value" size="15">
      <select name="search_select" >
        <option value="">选择检索类</option>
        <?php
         for($i=0;$i<$table_title_num;$i++){
         //显示检索条件
         echo"<option value=$table_value[$i]>$table_title[$i]</option>";
         }
        ?>
      </select>
      <input type="hidden" name="start_num" value="">
      <input type="submit" name="Submit" value="检索">
    </form>
    </html><!--
    本程序为1.2版本,在1.1版本中使用了数据库的游标进行分页,有一定的局限性
    在此版本中使用循环来控制分页显示,对速度与应用性有大幅提升,减少了大约70%
    的代码计算量,在10万以上的数据量下测试效果很好版权信息在转载的时候必须保留,但在使用中悉听尊便,包括个人与企业
    如果您发现了本程序功能与设计中的bug,请及时通知
    -->
      

  7.   

    到www.myvc.net 或www.easthot.net去看看,有你要的答案