对于不同DBMS,PHP必须用不同的方法MYSQL:
利用LIMIT子句
SELECT * FROM 表名 WHERE 条件 ORDER BY 字段 DESC LIMIT M,N从第M条记录选N条

解决方案 »

  1.   

    但是我要使用sql server数据库,它不支持limit呀,怎么办?
      

  2.   

    是这样,因为我要显示的记录非常多,可能多上千条,如果把这些全部读到数组里,怕是内存不够,我想有没有好的解决办法?我相信CSDN一定不是这么做的。
      

  3.   

    RecordSet的Open方式有很多,某些可以支持分页,就是不知道PHP具体怎么实现。
      

  4.   

    to mastercat:
        我一直用MySQL,因为在我的使用情况来看,MySQL要比SQL Server快,你的问题我倒是没有研究过,不过我有一篇关于“分页显示oracle数据库记录的类”的文章,你自己看看。-------------------------------------------
    <?php /********************************************* 
    TOracleViewPage v 1.0 分页显示Oracle数据库记录的类 作者:sharetop 
    email:[email protected] ***********************************************/ 
    class TOracleViewPage { var $Table; //表名 
    var $MaxLine; //每页显示行数 var $LinkId; 
    var $Id; var $Offset; //记录偏移量 
    var $Total; //记录总数 
    var $Number; //本页读取的记录数 
    var $Result; //读出的结果 var $TPages; //总页数 
    var $CPages; //当前页数 var $TGroup; 
    var $PGroup; //每页显示的页号个数 
    var $CGroup; var $Condition; //显示条件 如:where id='$id' order by id desc 
    var $PageQuery; //分页显示要传递的参数 
    //******构造函数************* 
    //参数:表名、最大行数、分页参考的字段、每页显示的页号数 function TOracleViewPage($TB,$ML,$ID){ 
    global $offset; $this->Table=$TB; 
    $this->MaxLine=$ML; 
    $this->Id=$ID; if(isset($offset)) $this->Offset=$offset; 
    else $this->Offset=0; $this->Condition=""; 
    $this->PageQury=NULL; 
    } function InitDB($user,$password,$db){ 
    if (PHP_OS == "WINNT") $dllid=dl("php3_oci80.dll"); 
    $this->LinkId = OCILogon($user,$password,$db); 
    } function Destroy(){ 
    OCILogoff($this->LinkId); 
    } //********设置显示条件********* 
    //如:where id='$id' order by id desc 
    //要求是字串,符合SQL语法(本字串将加在SQL语句后) function SetCondition($s){ 
    $this->Condition=$s; 
    } function SetNumGroup($pg){ 
    $this->PGroup=$pg; 
    } //******设置传递参数************ 
    // key参数名 value参数值 
    // 如:setpagequery("id",$id);如有多个参数要传递,可多次调用本函数。 function SetPageQuery($key,$value){ 
    $tmp[key]=$key; $tmp[value]=$value; 
    $this->PageQuery[]=$tmp; 
    } //********读取记录*************** 
    // 主要工作函数,根据所给的条件从表中读取相应的记录 
    // 返回值是一个二维数组,Result[记录号][字段名] function ReadList() { 
    $SQL="SELECT Count(*) AS total FROM ".$this->Table." ".$this->Condition; $stmt = OCIParse($this->LinkId,$SQL); 
    $bool = OCIExecute($stmt); 
    if (!$bool) { 
    echo "连接失败!"; 
    OCILogoff($this->LinkId); 
    exit; 

    else { 
    OCIFetch($stmt); 
    $this->Total=OCIResult($stmt,1); 

    /*****此句要求ID为连续的。 
    $SQL="SELECT * FROM ".$this->Table." ".$this->Condition. 
    " WHERE ".$this->Id." BETWEEN ".$this->Offset." AND ".($this->Offset+$this->MaxLine-1); 
    ******/ $SQL="SELECT * FROM ".$this->Table." ".$this->Condition." ORDER BY ".$this->Id; $stmt = OCIParse($this->LinkId,$SQL); 
    $bool = OCIExecute($stmt); 
    if (!$bool) { 
    echo "连接失败!"; 
    OCILogoff($this->LinkId); 
    exit; 

    else { 
    $ncols = OCINumCols($stmt); 
    for ( $i = 1; $i <= $ncols; $i++ ) 
    $column_name[$i] = OCIColumnName($stmt,$i); 
    $k=0; //while(OCIFetch($stmt)) { 此句与上句一样,要求ID为连续。 for($j=0;$j<$this->Offset;$j++) OCIFetch($stmt); 
    for($j=0;$j<$this->MaxLine;$j++){ 
    if(OCIFetch($stmt)){ 
    $k++; 
    for($i=1;$i<=$ncols;$i++) 
    $temp[$column_name[$i]]=OCIResult($stmt,$i); 
    $this->Result[]=$temp; 

    else break; 

    $this->Number=$k; 
    OCILogoff($this->LinkId); } 
    return $this->Result; 
    } //************取总页数及当前页************* function GetPage(){ 
    $this->TPages=ceil($this->Total/$this->MaxLine); 
    $this->CPages=ceil($this->Offset/$this->MaxLine)+1; 
    } //**********显示页数************* 
    //显示当前页及总页数 function ThePage() { 
    echo "第".$this->CPages."页/共".$this->TPages."页"; 
    } //**********显示翻页按钮************* 
    //此函数要在getPage()函数之后调用!!! 
    //显示首页、下页、上页、未页,并加上要传递的参数 function Page() { 
    $first=0; 
    $next=$this->Offset+$this->MaxLine; 
    $prev=$this->Offset-$this->MaxLine; 
    $last=($this->TPages-1)*$this->MaxLine; $k=count($this->PageQuery); 
    $strQuery=""; //生成一个要传递参数字串 
    for($i=0;$i<$k;$i++){ 
    $strQuery.="&".$this->PageQuery[$i][key]."=".$this->PageQuery[$i][value]; 
    } if($this->Offset>=$this->MaxLine) 
    echo "<A href=$PHP_SELF?offset=".$first.$strQuery.">首页</A>|"; 
    else echo "首页|"; if($prev>=0) 
    echo "<A href=$PHP_SELF?offset=".$prev.$strQuery.">上一页</A>|"; 
    else 
    echo "上一页|"; if($next<$this->Total) 
    echo "<A href=$PHP_SELF?offset=".$next.$strQuery.">下一页</A>|"; 
    else 
    echo "下一页|"; if($this->TPages!=0 && $this->CPages<$this->TPages) 
    echo "<A href=$PHP_SELF?offset=".$last.$strQuery.">末页</A>"; 
    else 
    echo "末页"; 
    } //*******取分组信息******* function GetGroup() { 
    $this->TGroup=ceil($this->TPages/$this->PGroup); 
    $this->CGroup=ceil($this->CPages/$this->PGroup); 
    } //******分组显示页号****** 
    //显示如:1 2 3 4 function NumPage() { 
    $first=($this->CGroup-1)*($this->PGroup)+1; 
    $last=($first+$this->PGroup > $this->TPages)? ($this->TPages+1):($first+$this->PGroup); 
    $pr=($this->CGroup-2>=0)?( ($this->CGroup-2)*($this->PGroup)+1 ):(-1); 
    $prev=($pr!=-1)?( ($pr-1)*$this->MaxLine):(0); 
    $ne=($this->CGroup*$this->PGroup+1<=$this->TPages)?($this->CGroup*$this->PGroup+1):(-1); 
    $next=($ne!=-1)?( ($ne-1)*$this->MaxLine):(0); $k=count($this->PageQuery); 
    $strQuery=""; //生成一个要传递参数字串 
    for($i=0;$i<$k;$i++){ 
    $strQuery.="&".$this->PageQuery[$i][key]."=".$this->PageQuery[$i][value]; 
    } if($first!=1) 
    echo "<a href=$PHP_SELF?offset=".$prev.$strQuery."> << </a>"; 
    for($i=$first;$i<$last;$i++) { 
    if($this->CPages!=$i){ 
    $current=($i-1)*$this->MaxLine; 
    echo "<a href=$PHP_SELF?offset=".$current.$strQuery.">".$i."</a> "; 

    else echo $i." "; 

    if($ne!=-1) 
    echo "<a href=$PHP_SELF?offset=".$next.$strQuery."> >> </a>"; 
    } //******end class 

    ?>
      

  5.   

    sql server 的php分页是使用cursor的