分页查询     zjcxc [原作]  
关键字   分页 
出处    
 
 /*--用存储过程实现的分页程序 显示指定表、视图、查询结果的第X页
 对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法
 如果视图或查询结果中有主键,不推荐此方法--*//*--调用示例
 exec p_show '地区资料' exec p_show '地区资料',5,3,'地区编号,地区名称,助记码','地区编号'
--*/if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_show]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_show]
GOCREATE Proc p_show
@QueryStr nvarchar(4000), --表名、视图名、查询语句
@PageSize int=10,   --每页的大小(行数)
@PageCurrent int=1,   --要显示的页
@FdShow nvarchar (4000)='', --要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段
@FdOrder nvarchar (1000)='' --排序字段列表
as
declare @FdName nvarchar(250) --表中的主键或表、临时表中的标识列名
 ,@Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
 ,@Obj_ID int    --对象ID
--表中有复合主键的处理
declare @strfd nvarchar(2000) --复合主键列表
 ,@strjoin nvarchar(4000) --连接字段
 ,@strwhere nvarchar(2000) --查询条件
select @Obj_ID=object_id(@QueryStr)
 ,@FdShow=case isnull(@FdShow,'') when '' then ' *' else ' '+@FdShow end
 ,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by '+@FdOrder end
 ,@QueryStr=case when @Obj_ID is not null then ' '+@QueryStr else ' ('+@QueryStr+') a' end--如果显示第一页,可以直接用top来完成
if @PageCurrent=1 
begin
 select @Id1=cast(@PageSize as varchar(20))
 exec('select top '+@Id1+@FdShow+' from '+@QueryStr+@FdOrder)
 return
end--如果是表,则检查表中是否有标识更或主键
if @Obj_ID is not null and objectproperty(@Obj_ID,'IsTable')=1
begin
 select @Id1=cast(@PageSize as varchar(20))
  ,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20)) select @FdName=name from syscolumns where id=@Obj_ID and status=0x80
 if @@rowcount=0   --如果表中无标识列,则检查表中是否有主键
 begin
  if not exists(select 1 from sysobjects where parent_obj=@Obj_ID and xtype='PK')
   goto lbusetemp  --如果表中无主键,则用临时表处理  select @FdName=name from syscolumns where id=@Obj_ID and colid in(
   select colid from sysindexkeys where @Obj_ID=id and indid in(
    select indid from sysindexes where @Obj_ID=id and name in(
     select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
   )))
  if @@rowcount>1  --检查表中的主键是否为复合主键
  begin
   select @strfd='',@strjoin='',@strwhere=''
   select @strfd=@strfd+',['+name+']'
    ,@strjoin=@strjoin+' and a.['+name+']=b.['+name+']'
    ,@strwhere=@strwhere+' and b.['+name+'] is null'
    from syscolumns where id=@Obj_ID and colid in(
    select colid from sysindexkeys where @Obj_ID=id and indid in(
     select indid from sysindexes where @Obj_ID=id and name in(
      select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
    )))
   select @strfd=substring(@strfd,2,2000)
    ,@strjoin=substring(@strjoin,5,4000)
    ,@strwhere=substring(@strwhere,5,4000)
   goto lbusepk
  end
 end
end
else
 goto lbusetemp/*--使用标识列或主键为单一字段的处理方法--*/
lbuseidentity: 
 exec('select top '+@Id1+@FdShow+' from '+@QueryStr
  +' where '+@FdName+' not in(select top '
  +@Id2+' '+@FdName+' from '+@QueryStr+@FdOrder
  +')'+@FdOrder
  )
 return/*--表中有复合主键的处理方法--*/
lbusepk:  
 exec('select '+@FdShow+' from(select top '+@Id1+' a.* from
  (select top 100 percent * from '+@QueryStr+@FdOrder+') a
  left join (select top '+@Id2+' '+@strfd+' 
  from '+@QueryStr+@FdOrder+') b on '+@strjoin+'
  where '+@strwhere+') a'
  )
 return/*--用临时表处理的方法--*/
lbusetemp:  
select @FdName='[ID_'+cast(newid() as varchar(40))+']'
 ,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20))
 ,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))exec('select '+@FdName+'=identity(int,0,1),'+@FdShow+'
  into #tb from'+@QueryStr+@FdOrder+'
 select '+@FdShow+' from #tb where '+@FdName+' between '
 +@Id1+' and '+@Id2
 )GO

解决方案 »

  1.   

    /******************************************
    函数:Pagination($total,$per)
    功能:分页
    参数:$total 总数,$per 每页显示数
    备注:Programmed By Surfchen,http://yubeinet.com
    ******************************************/  
    function Pagination($total,$per)
    {
    $n=$total/$per;
    $page_num=ceil($n);
    if ($page_num==1)
    {
    return false;
    }
    $url=basename($_SERVER['PHP_SELF']);
    $query_array=explode("&",$_SERVER['argv'][0]);
    foreach ($query_array as $key => $value)
    {
    if (strstr($value,"page="))
    {
    unset($query_array[$key]);
    }
    }
    $query_string=implode("&",$query_array);
    for ($page=1;$page<=$page_num;$page++)
    {
    if ($_GET['page']==$page)
    {
    $pages.="&nbsp;[{$page}]";
    continue;
    }
    if (empty($_GET['page']) and $page==1)
    {
    $pages.="&nbsp;[{$page}]";
    continue;
    }
    $pages.="&nbsp;<a href=\"{$url}?{$query_string}&amp;page={$page}\">$page</a>  ";
    }
    $pages.="<br />";
    return $pages;
    }
      

  2.   

    这个和数据库还有关系,MySQL支持分段选择,MSSQL就不支持
      

  3.   

    我自己修改的万能翻页模块面,调用的方法见说明<%
    '+++++++++++++++++++++++++++++++++++++
    '◆模块名称: 公共翻页模块
    '◆文 件 名: TurnPage.asp
    '◆传入参数: Rs_tmp (记录集), PageSize (每页显示的记录条数)
    '◆输    出: 记录集翻页显示功能
    '◆设    计: JM
    '◆调用方法: 
    '<!--#include file="turnpage.asp"-->  引用该文件
    'host   = "127.0.0.1"
    'id     = "username"
    'pwd    = "password"
    'db     = "database"
    'cnstr  = "Provider=SQLOLEDB.1;User ID="& id &";Password="& pwd &";Data Source="& host &";Initial Catalog="& db &";Persist Security Info=True;Connect Timeout=15"
    'set conn = Server.CreateObject("Adodb.Connection")
    'conn.open cnstr
    'sql ="select * from tablename order by id desc" '定义要分页显示的结果集
    'set RS = Server.CreateObject("Adodb.RecordSet")
    'Rs.open sql, conn, 1, 1
    '
    'Dim RowCount
    'RowCount = n '每页显示的记录条数 n >= 1
    'iRowCount = 0 '用于计算页内编号,Do While循环条件计数
    'Call TurnPage(Rs,RowCount,PageNo) '显示翻页文字
    '
    '要显示的表头,如:<tr><td>记录号</td>....</tr> 
    '
    'Do While Not RS.EOF and iRowCount < RowCount '此处RS与上面建立的RS名称要一致
    'iRowCount = iRowCount + 1 '用于计算页内编号
    'RecNo = (PageNo - 1) * RowCount + iRowCount 'RecNo 为总记录编号
    '要显示的表内容,如:<tr><td><%=RecNo%></td>.... </tr>
    'rs.movenext
    'loop
    '+++++++++++++++++++++++++++++++++++++
    %>
    <% Sub TurnPageCommonText(TotalPage,PageNo,RecordCount,FileName) %>
    <div align="center"><table border=0 width=666 style="border-collapse: collapse" bordercolor="#111111" cellpadding="0" cellspacing="0" height="50"><tr><td width="262" align=center>总页数:<font color=#ff3333><%=TotalPage%></font>页 当前第<font color=#ff3333><%=PageNo%></font>页 总计<font color=#ff3333><%=RecordCount%></font>条记录</td><td width="225" align="right"><div align="center"> 
    <%If RecordCount = 0 or TotalPage = 1 Then%>首页|前页|后页|末页
    <%Else%>
    <%If (PageNo - 1) <> 0 Then %>|<a href="<%=fileName%>?PageNo=1"> 首页 </a>|<%Else%>| <font color="#808080">首页</font> |<%End If%>
    <%If PageNo - 1 = 0 Then%> <font color="#808080">前页</font> |<%Else%><a href="<%=fileName%>?PageNo=<%=PageNo-1%>"> 前页 </a>|<%End If%>
    <%If PageNo+1 > TotalPage Then%> <font color="#808080">后页</font> |<%Else%><a href="<%=fileName%>?PageNo=<%=PageNo+1%>"> 后页 </a>|<%End If%>
    <%If (PageNo - TotalPage) <> 0 Then %><a href="<%=fileName%>?PageNo=<%=TotalPage%>"> 末页 </a>|<%Else%> <font color="#808080">末页</font> |<%End If%>
    <%End If%></div></td><td width=212 align=center>
    <!--webbot BOT="GeneratedScript" PREVIEW=" " startspan --><script Language="JavaScript" Type="text/javascript"><!--
    function FrontPage_Form1_Validator(theForm)
    {  var checkOK = "0123456789-";
      var checkStr = theForm.PageNo.value;
      var allValid = true;
      var validGroups = true;
      var decPoints = 0;
      var allNum = "";
      for (i = 0;  i < checkStr.length;  i++)
      {
        ch = checkStr.charAt(i);
        for (j = 0;  j < checkOK.length;  j++)
          if (ch == checkOK.charAt(j))
            break;
        if (j == checkOK.length)
        {
          allValid = false;
          break;
        }
        allNum += ch;
      }
      if (!allValid)
      {
        alert("在 页码 域中,只能输入 数字 字符。");
        theForm.PageNo.focus();
        return (false);
      }  var chkVal = allNum;
      var prsVal = parseInt(allNum);
      if (chkVal != "" && !(prsVal >= 1))
      {
        alert("请在 页码 域中输入值 大于或等于 1。");
        theForm.PageNo.focus();
        return (false);
      }
      return (true);
    }
    //--></script><!--webbot BOT="GeneratedScript" endspan --><form name="FrontPage_Form1" method="post" action="" onsubmit="return FrontPage_Form1_Validator(this)" language="JavaScript">
    转到第&nbsp;&nbsp;
    <!--webbot bot="Validation" s-display-name="页码" s-data-type="Integer" s-number-separators="x" s-validation-constraint="Greater than or equal to" s-validation-value="1" --> 
    <input type=text name=PageNo size="<%=len(cstr(TotalPage))+1%>" <%If TotalPage = 1 Then%> readonly  disabled<%End If%>>页 
    <input type="submit" name="Submit" value="Go" <% If TotalPage = 1 Then%>disabled<%End If%>>
    </td>
    </form></tr></table></div>
    <%End Sub%>
    <%'---------------------------------------------------%>
    <% Sub TurnPage(ByRef Rs_tmp,PageSize,o_PageNo)
    'ByRef表示该参数按引用传递 Rs_tmp 记录集 ; PageSize 每页显示的记录条数;返回三个数值给TurnPageBottom使用
    Dim TotalPage '总页数
    Dim PageNo '当前显示的是第几页
    Dim RecordCount '总记录条数
    Rs_tmp.PageSize = PageSize
    RecordCount = Rs_tmp.RecordCount
    TotalPage = INT(RecordCount / PageSize * -1)*-1
    PageNo = Request.QueryString ("PageNo") '直接输入页数跳转;
    If Request.Form("PageNo")<>"" Then PageNo = Request.Form("PageNo") 
    If PageNo = "" then PageNo = 1 '如果没有选择第几页,则默认显示第一页;
    If (PageNo - TotalPage)>0 then PageNo = 1 '如果提交的页码大于总页数则回到第一页
    If RecordCount <> 0 then
    Rs_tmp.AbsolutePage = PageNo
    End If
    '获取当前文件名,使得每次翻页都在当前页面进行;
    Dim fileName,postion
    fileName = Request.ServerVariables("script_name")
    postion = InstrRev(fileName,"/")+1
    fileName = Mid(fileName,postion) 
    Call  TurnPageCommonText(TotalPage,PageNo,RecordCount,FileName)
    o_PageNo = PageNo
    End Sub%>
    <%'---------------------------------------------------%>
      

  4.   

    TO surfchen(冲浪) 比如说我现在有个查询页面,search.php
    用户提交搜索条件后,提交的页面依然是search.php.想要把搜索的结果分页显示出来,可是我只能点第一个分页,点第二页就不行了,能说下这是怎么回事吗?
      

  5.   

    用SESSION保存查询条件...
    用MYSQL的LIMIT进行查询限制
    用我那个函数进行分页
      

  6.   

    <?php
    require("config.php");
    require("./include/db_mysql.php");
    require("./include/global.php");
    $db=new db_mysql;
    $db->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0); 
    if(!$_POST[searchmember]) {?>
    <br>
    <br><form method='post' action='fenye.php' ecnctype=multipart/form-data>
    <table cellspacing="0" cellpadding="0" border="0" width="80%" align="center">
    <tr><td bgcolor="#89959b">
    <table border="0" cellspacing="1" cellpadding="4" width="100%"><tr><td class="header" colspan="2">搜索您要编辑的用户</td></tr>
    <tr><td bgcolor="#EDEDED">所在用户组:</td>
    <td align="right" bgcolor="#F5F5F5">
    <select name="userstatus">
    <option value="未激活">未激活</option>
    <?php
    $result=$db->select("select * from usergroup where 1=1");
    while($arr=mysql_fetch_array($result)){
    echo "<option value=\"$arr[status]\">".$arr[status]."</option>";
    }
    ?>
    </select></td></tr>
    <tr><td bgcolor="#EDEDED">姓名包含:</td>
    <td align="right" bgcolor="#F5F5F5"><input type="text" name="username" size="40"></td></tr><tr><td bgcolor="#EDEDED">借书证号包含:</td>
    <td align="right" bgcolor="#F5F5F5"><input type="text" name="usercard" size="40"></td></tr><tr><td bgcolor="#EDEDED">所在班级:</td>
    <td align="right" bgcolor="#F5F5F5"><input type="text" name="userclass" size="40"></td></tr>
    </table></td></tr></table><br><center>
    <input type="submit" name="searchmember" value="搜索用户"> &nbsp; 
    </center></form>
    <?php
    }else{      if( isset($_GET['page']) ){
                    $page = intval( $_GET['page'] );
              }
             else{
                    $page = 1;
             }
        $sql="user_status='$_POST[userstatus]'";
            
            if($_POST[userclass]){
      $sql=$sql." and user_class like '%$_POST[userclass]%' ";
      } 
            if($_POST[username]) {
    $sql=$sql." and user_name like '%$_POST[username]%'";

            if($_POST[usercard]) {
    $sql=$sql." and user_card like '%$_POST[usercard]%'";
    } $queryString=$sql;
     
    $sql = "select * from userinfo where $queryString  ";
    $per=5;
    $total=@mysql_num_rows($db->select($sql));
    $sql = $sql."limit ". ($page-1)*$per .", $per";
    $result=mysql_query($sql);
    while($arr=mysql_fetch_array($result)){

    echo $arr[user_name];
    echo "<br>";


    }echo Pagination($total,$per);
    }
    ?>
    为什么分页的结果显示出来了,但是点第二页的时候就显示最开始的fenye.php的内容?
    我的查询和显示都是在fenye.php
    小弟跪求解决方法,请大哥们帮忙看下或者调试下吧,我的qq:23385424,
      

  7.   

    ...这有什么技术外泄的呀?你们宿舍的人人品有问题!!<?php
    require("config.php");
    require("./include/db_mysql.php");
    require("./include/global.php");
    $db=new db_mysql;
    $db->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0);
    session_start();
    if(empty($_POST['searchmember']) and empty($_SESSION['searchmember'])) {?>
    <br>
    <br><form method='post' action='fenye.php' ecnctype=multipart/form-data>
    <table cellspacing="0" cellpadding="0" border="0" width="80%" align="center">
    <tr><td bgcolor="#89959b">
    <table border="0" cellspacing="1" cellpadding="4" width="100%"><tr><td class="header" colspan="2">搜索您要编辑的用户</td></tr>
    <tr><td bgcolor="#EDEDED">所在用户组:</td>
    <td align="right" bgcolor="#F5F5F5">
    <select name="userstatus">
    <option value="未激活">未激活</option>
    <?php
    $result=$db->select("select * from usergroup where 1=1");
    while($arr=mysql_fetch_array($result)){
    echo "<option value=\"$arr[status]\">".$arr[status]."</option>";
    }
    ?>
    </select></td></tr>
    <tr><td bgcolor="#EDEDED">姓名包含:</td>
    <td align="right" bgcolor="#F5F5F5"><input type="text" name="username" size="40"></td></tr><tr><td bgcolor="#EDEDED">借书证号包含:</td>
    <td align="right" bgcolor="#F5F5F5"><input type="text" name="usercard" size="40"></td></tr><tr><td bgcolor="#EDEDED">所在班级:</td>
    <td align="right" bgcolor="#F5F5F5"><input type="text" name="userclass" size="40"></td></tr>
    </table></td></tr></table><br><center>
    <input type="submit" name="searchmember" value="搜索用户"> &nbsp;
    </center></form>
    <?php
    }else {
    $sql="user_status='$_POST[userstatus]'";//不知道你这句有什么用
    if (!empty($_POST['searchmember'])
    {
    $_SESSION['searchmember']=$_POST['searchmember'];
    if($_POST['userclass']){
    $_SESSION['userclass']=$_POST['userclass'];
    $sql=$sql." and user_class like '%$_POST[userclass]%' ";
    }
    if($_POST['username']) {
    $_SESSION['username']=$_POST['username'];
    $sql=$sql." and user_name like '%$_POST[username]%'";
    }
    if($_POST['usercard']) {
    $_SESSION['usercard']=$_POST['usercard'];
    $sql=$sql." and user_card like '%$_POST[usercard]%'";
    }
    }
    else
    {
    if($_SESSION['userclass']){
    $sql=$sql." and user_class like '%$_POST[userclass]%' ";
    }
    if($_SESSION['username']) {
    $sql=$sql." and user_name like '%$_POST[username]%'";
    }
    if($_SESSION['usercard']) {
    $sql=$sql." and user_card like '%$_POST[usercard]%'";
    }
    }if( isset($_GET['page']) ){
    $page = intval( $_GET['page'] );
    }
    else{
    $page = 1;
    }$queryString=$sql;$sql = "select * from userinfo where $queryString ";
    $per=5;
    $total=@mysql_num_rows($db->select($sql));
    $sql = $sql."limit ". ($page-1)*$per .", $per";
    $result=mysql_query($sql);
    while($arr=mysql_fetch_array($result)){echo $arr[user_name];
    echo "<br>";
    }echo Pagination($total,$per);
    }
    ?>
      

  8.   

    上面这个有点错...这个应该没什么问题了试试看...有什么错误说一下...我只是照着你的代码改改...没测试过..<?php
    require("config.php");
    require("./include/db_mysql.php");
    require("./include/global.php");
    $db=new db_mysql;
    $db->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0);
    session_start();
    if(empty($_POST['searchmember']) and empty($_SESSION['searchmember'])) {?>
    <br>
    <br><form method='post' action='fenye.php' ecnctype=multipart/form-data>
    <table cellspacing="0" cellpadding="0" border="0" width="80%" align="center">
    <tr><td bgcolor="#89959b">
    <table border="0" cellspacing="1" cellpadding="4" width="100%"><tr><td class="header" colspan="2">搜索您要编辑的用户</td></tr>
    <tr><td bgcolor="#EDEDED">所在用户组:</td>
    <td align="right" bgcolor="#F5F5F5">
    <select name="userstatus">
    <option value="未激活">未激活</option>
    <?php
    $result=$db->select("select * from usergroup where 1=1");
    while($arr=mysql_fetch_array($result)){
    echo "<option value=\"$arr[status]\">".$arr[status]."</option>";
    }
    ?>
    </select></td></tr>
    <tr><td bgcolor="#EDEDED">姓名包含:</td>
    <td align="right" bgcolor="#F5F5F5"><input type="text" name="username" size="40"></td></tr><tr><td bgcolor="#EDEDED">借书证号包含:</td>
    <td align="right" bgcolor="#F5F5F5"><input type="text" name="usercard" size="40"></td></tr><tr><td bgcolor="#EDEDED">所在班级:</td>
    <td align="right" bgcolor="#F5F5F5"><input type="text" name="userclass" size="40"></td></tr>
    </table></td></tr></table><br><center>
    <input type="submit" name="searchmember" value="搜索用户"> &nbsp;
    </center></form>
    <?php
    }else {
    $sql="user_status='$_POST[userstatus]'";//不知道你这句有什么用
    if (!empty($_POST['searchmember'])
    {
    $_SESSION['searchmember']=$_POST['searchmember'];
    if($_POST['userclass']){
    $_SESSION['userclass']=$_POST['userclass'];
    $sql=$sql." and user_class like '%$_POST[userclass]%' ";
    }
    if($_POST['username']) {
    $_SESSION['username']=$_POST['username'];
    $sql=$sql." and user_name like '%$_POST[username]%'";
    }
    if($_POST['usercard']) {
    $_SESSION['usercard']=$_POST['usercard'];
    $sql=$sql." and user_card like '%$_POST[usercard]%'";
    }
    }
    else
    {
    if($_SESSION['userclass']){
    $sql=$sql." and user_class like '%$_SESSION[userclass]%' ";
    }
    if($_SESSION['username']) {
    $sql=$sql." and user_name like '%$_SESSION[username]%'";
    }
    if($_SESSION['usercard']) {
    $sql=$sql." and user_card like '%$_SESSION[usercard]%'";
    }
    }if( isset($_GET['page']) ){
    $page = intval( $_GET['page'] );
    }
    else{
    $page = 1;
    }$queryString=$sql;$sql = "select * from userinfo where $queryString ";
    $per=5;
    $total=@mysql_num_rows($db->select($sql));
    $sql = $sql."limit ". ($page-1)*$per .", $per";
    $result=mysql_query($sql);
    while($arr=mysql_fetch_array($result)){echo $arr['user_name'];
    echo "<br>";
    }echo Pagination($total,$per);
    }
    ?>
      

  9.   

    太感谢您了!谢谢!
    但是
    我试了下出现这个错误
    Parse error: parse error, unexpected '{' in H:\tsg\test3.php on line 46
    if (!empty($_POST['searchmember'])
    {
    就是这里,但是我仔细的看了下,没发现有什么地方不对啊!太感谢您了!
    虽然我还没有解决这个问题
      

  10.   

    有错......if (!empty($_POST['searchmember'])
    改为
    if (!empty($_POST['searchmember']))
      

  11.   

    哎~!
    还是不行啊,
    http://gun.x117.net/tsg/fenye.php这个页面就是结果,但是点第二页不能出来东西啊
      

  12.   

    <?php
    /*
     ********************************************************************
     *  Editor           :  EditPlus+ 2.11                              *
     ******************************************************************** +------------------------------------------------------------------+
     |  PHP Version 4                                                   |
     +------------------------------------------------------------------+
     |  Copyright (C) 2004-2005 All Right Reseved Pc Rookie's           |
     +------------------------------------------------------------------+
     |  Notices:                                                        |
     |  If you found any error in the source code. Then I'll hope you s-|
     |end Bug email to us. So we'll thank you very much.                |
     |                                                                  |
     |                                                                  |
     |                                                                  |
     +------------------------------------------------------------------+
     |  Website         :   http://www.5down6.net                       |
     |  Author          :   Pc Rookie's                                 |
     |  Contact Email   :   [email protected]                            |
     |  LastModify      :   2004/11/12                                  |
     +------------------------------------------------------------------+
     +------------------------------------------------------------------+
     |  FileName        :   DB.php                                      |
     ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     |  Function        :   Database independent query interface        |
     +------------------------------------------------------------------+
    */class DB
    {
    var $Host        = "";   //数据库主机
    var $Database    = "";   //数据库
    var $User        = "";   //用户名
    var $Password    = "";   //密码 var $Auto_Free   = 0;    //设置为1程序结束会执行mysql_free_result()
    var $Debug       = 1;    //设置为0不显示调试信息
    var $Halt_On_Err = "yes";/*设置为"yes"终止错误并显示信息;
                               设置为"no"忽略错误;
       设置为"report"忽略错误,但是会报告错误.
                             */
    var $PConnect    = 0;    //设置为1数据库将使用mysql_pconnect持久连接

    var $linkID      = 0;    //链接标识
    var $queryID     = 0;    //查询结果标识 var $queryRow    = 0;    //SQL影响的行 //数据库链接方法
        /*
      返回值:
             链接资源标识
    */
    function DB($Host = "", $User = "", $Password = "", $Database = "")
    {
    //检查各项参数是否为空
    if(!($this -> Host == "") && !($this -> User == "") && !($this -> Database== ""))
    {
    //不为空!
    $Host     = $this -> Host;
    $User     = $this -> User;
    $Password = $this -> Password;
    $Database = $this -> Database;
    }
    else
    {
    //为空!子类定义的参数不完整
    die(SUB_CLASS_PARAMETER_IS_NOT_FULL);
    }

    //成功链接到数据库否
    if($this -> linkID == 0)
    {
    //尚未链接到数据库!链接方式选择持久链接还是普通链接
    if($this -> PConnect)
    {
    //持久链接
    $this -> linkID = @mysql_pconnect($Host, $User, $Password);
    }
    else
    {
    //普通链接
    $this -> linkID = @mysql_connect($Host, $User, $Password);
    }

    //成功链接到数据库否
    if(!$this -> linkID)
    {
    //链接失败!输出错误信息
    DB::mysql_err_msg();
    }
    else
    {
    //链接服务器成功!打开数据库失败否
    if(!@mysql_select_db($this -> Database))
    {
    //数据库不存在则建立
    if(!@mysql_query("create database ".$this -> Database));
    {
    //打开数据库失败!输出错误信息
    DB::mysql_err_msg();
    }
    }
    }
    }
    //返回成功的链接标识
    return $this -> linkID;
    } //SQL语句执行方法
    /*
      返回值:
             SQL语句影响的总行数
             SQL对任何行没产生影响则返回字符串
    */
    function query($SQL = "")
    {
    //SQL语句为空否
    if($SQL == "")
    //为空!SQL语句为空
    die(SQL_ERR_MSG_SQL_IS_EMPTY);
    else
    {
    //不为空!执行SQL并将结果标识赋给$queryID
    $this -> queryID = @mysql_query($SQL);
    //SQL执行成功否
    if(!$this -> queryID)
    {
    //失败!输出错误信息
    DB::mysql_err_msg();
    }
    else
    {
    //成功!是SELECT语句否
    if(eregi("select",$SQL))
    {
    //是(SELECT)
    $this -> queryRow = @mysql_num_rows($this -> queryID);
    }
    else
    {
    //不是(是INSERT、DELETE、UPDATE)
    $this -> queryRow = @mysql_affected_rows();
    }
    //响应SQL语句的记录数为0否
    if(!($this -> queryRow))
    //返回无记录响应提示信息
    return $this -> queryRow = NOT_ANY_REC;
    }
    }
    } //获取查询操作结果集
    /*
      返回值: 
             数组Key为数据库字段名的二维数组
    */
    function rs($seek)
    {
    //查询结果记录集为0否
    if($this -> queryRow)
    {
    //结果不为0;有符合条件记录
    //按行生成记录结果集
    @mysql_data_seek($this->queryID,$seek);
    $result =  mysql_fetch_object($this -> queryID);
    //按照查询结果记录集的字段总数
    for($j = 0; $j < mysql_num_fields($this -> queryID); $j++)
    {
    //依次获取字段名存入数组
    $fields = mysql_field_name($this -> queryID, $j);
    //按照[Key] => [Fields]、[Value] => [Value]赋值
    $rs[$fields] = $result -> $fields;
    }
    //返回数组
    return $rs;
    }
    }}
    //获取分页参数的方法
    /*
      返回值:
             数组(SQL影响记录数, 定义每页显示记录数, 当前页, 总页数, 每页开始标记, 每页结束标记)
     使用:list函数获[推荐]
          list($total_rec, $page_size, $page, $total_page, $page_start, $page_end) = $obj -> splitPage($page_size, $page);   直接获取[不推荐]
    */
    function splitPage($page_size = 15,$page = 1)
    {
    //判断当前页面为第一页否
    $page ? $page = $page : $page = 1;
    //判断总记录数超过一页否
    if($page_size > $this -> queryRow)
    {
    //记录不多于一页,设置总页数
    $total_page = 1;
    //当前页起始标记值
    $page_start = 0;
    //当前页结束标记值
    $page_end = $this -> queryRow;
    }
    else
    {
    //记录总数多于一页,计算总页数
    $total_page = ceil($this -> queryRow/$page_size);
    //当前页起始标记值
    $page_start = $page_size*($page-1);
    //当前页结束标记值
    $page_end = $page_size*$page;
    //当前页为末页否
    if($page_end > $this -> queryRow)
    //为末页,更改当前页结束标记值为总记录数
    $page_end  = $this -> queryRow;
    }
    //定位数据库指针
    @mysql_data_seek($this -> queryID, $page_end);
    //返回数组
    return $split = array($this -> queryRow, $page_size, $page, $total_page, $page_start, $page_end);
    } //释放资源方法
    function free()
    {
    @mysql_free_result($this ->queryID);
    $this -> queryID = 0;
    } //错误处理方法
    function mysql_err_msg()
        {
    //获取错误代码
    $this -> errno = @mysql_errno();
    //获取错误信息
    $this -> error = @mysql_error(); //输出错误代码、信息
    $this -> print_mysql_error();
        } //错误信息输出方法[返回字符串]
    function print_mysql_error()
    {

    if($this -> Debug)
    {
    switch($this -> Halt_On_Err)
    {
    case("yes"):
    //终止程序执行并输出错误代码、信息
    die($this -> errno.":".$this -> error);
    break;
    case("no"):
    break;
    default:
    //输出错误代码、信息
    echo $this -> errno.":".$this -> error;
    break;
    }
    }
    }
    ?>
      

  13.   

    例子
    <?php
    include("DB.inc");
    class soft extends DB                                         
    {                                                               
         //Declare your MySQL Server Parameter                       
         var $Host     = "127.0.0.1"; #Host
     var $Database = "www";       #Database
         var $User     = "mysql";     #User                          
         var $Password = "";          #Password                           var $Debug    = 0;           #No Display Debug Information  
    }    $db = new soft;//截取指定字符串长度(不会将汉字截开)!
    function fixlenstr($str,$len)
    {
    $str = (string)$str;
    $len = (int)$len;
    $strlen = strlen($str);
    if($len>$strlen) $len = $strlen;
    $i = 0;
    $fixlen = 0;
    while($i<$len)
    {
    $chr = $str[$i];
    $i++;
    if(ord($chr)<0x80) $fixlen++;
    elseif($i<$len)
    {
    $i++;
    $fixlen += 2;
    }
    } return $len>=$strlen ? substr($str,0,$fixlen) : substr($str,0,$fixlen)."...";
    }
    //首页分类最新更新10条
    function getNewUpdate10($scid)
    {
    global $db;
        $sql = "SELECT ID, Name FROM down_final_class,down_info WHERE down_final_class.SCID=$scid AND down_info.FCID=down_final_class.FCID ORDER BY ID DESC"; $db -> query($sql);    if($db->queryRow)
    {
    $db -> query($sql);
    $page_size = 10;
    $page = 1; list($total_rec, $page_size, $page, $total_page, $page_start, $page_end) = $db -> splitPage($page_size, $page); for($i = $page_start; $i < $page_end; $i++)
    {
    $rs = $db -> rs($i);

    print("<li><a href=\"detail.php?id=$rs[ID]\" title=\"$rs[Name]\">".fixlenstr($rs[Name],27)."</a></li>");
    } if($db -> queryRow >= $page_size)
    print("<li class=\"more\"><a href=\"list.php?scid=$scid\">更多...</a></li>");
    }
    else
    {
    print("<li>目前该类尚无任何资源!</li>");
    }
    }
    ?>
      

  14.   

    奇怪了....我再看了一次我改的代码..没发现什么错误...难道你的服务器不能用SESSION??
    不然你干脆用GET的方式传递参数好了...
      

  15.   

    我用javascript写的代码,也遇到过这样的问题。好像通过session不行,是不是因为java里面无法嵌入php语句?每次点击下一页,都是一个超级连接,而不能触发一个php函数!怎么办
      

  16.   

    用JS肯定不行...但是我那种方法是可行的....
    下面就是使用SESSION的分页实例http://www.yubeinet.com/mobile/search.xhtml.php
      

  17.   

    另外一个站上的朋友给了我一个例子,我已经弄好了,谢谢大家。
    <?php
    if (! mysql_connect('localhost', 'root', '')) {
            die('Can NOT connect to MySQL Server');
    } elseif (! mysql_select_db('test')) {
            die('Can NOT select Database "test" ');
    }// ==========================================
    // 函数声明
    // ==========================================
    function paginate($query, $keyword, $pageno) {
            if (! $result = mysql_query($query)) {
                    die('SQL ERROR!');
            }
            $rows_found = mysql_num_rows($result); // 一共有多少条符合条件的记录
            $rows = 5; // 每页显示 5 条
            $pages = ceil($rows_found / $rows); // 总页数(总记录数 / 每页记录数,向后取整数)
            if (! isset($pageno)) {
                    $pageno = 1;
            }
            $offset = $pageno * $rows - $rows; // 当前页的首记录偏移量        // 需要由函数返回的变量
            $paginate['query'] = $query.' limit '.$offset.','.$rows; // 对当前页应显示记录的查询
            $paginate['rows_found'] = $rows_found;
            $paginate['pageno'] = $pageno;
            $paginate['pages'] = $pages;
            $paginate['pagenoList'] = '';
            for ($i=1; $i<=$pages; $i++) {
                    if ($pageno == $i) {
                            $paginate['pagenoList'] .= ' '.$i.' ';
                    } else {
                            $paginate['pagenoList'] .= ' <a href="index.php?keyword='.$keyword.'&pageno='.$i.'">'.$i.'</a> ';
                    }
            }        // 返回变量
            return $paginate;
    }// ==========================================
    // 处理查询表单的提交行为
    // ==========================================
    if ($keyword) {
            $query = 'select * from test where XM like "%'.$keyword.'%"'; // 检索符合条件的记录
            $paginate = paginate($query, $keyword, $pageno);
    }// ==========================================
    // HTML
    // ==========================================
    ?>
    <form method="get" action="index.php">
    <input type="text" name="keyword" value="<?php echo $keyword; ?>">
    <input type="submit" name="submit" value="search">
    </form><p>
    <?php
    if ($paginate['rows_found'] && $paginate['pageno']) {
            echo '找到'.$paginate['rows_found'].'条,当前页为第'.$paginate['pageno'].'页';
    }
    ?>
    </p><ul id="queryResultList">
    <?php
    if ($result = mysql_query($paginate['query'])) {
            while ($row = mysql_fetch_array($result)) {
                    echo '<li>'.$row['XM'].'</li>';
            }
    }
    ?>
    </ul><div id="pagenoList"><?php echo $paginate['pagenoList']?></div>