CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  PHP

关于分页的查询问题..熟悉的人帮个忙吧..

楼主gundamzaku(Z钢弹)2004-12-03 09:58:51 在 Web 开发 / PHP 提问

我做一个表的分页.因为需要统计页数.所以要算出共有多少数据.  
   
  先用一条查询语句select   count(*)   from   表   查出该表共有多少条数据.  
  然后再select   *   from   表   limit   X,XX   做分页.  
   
  可是这样会花两次去查询.  
  是否有更优化的办法?  
  不知道做过分页的朋友是怎么样去优化这个?? 问题点数:0、回复次数:13Top

1 楼butcher2002(我又出来捣乱了)回复于 2004-12-03 10:15:15 得分 0

你这种思路是根本错误的  
   
  你可以搜索一下以前的分页做法,很多Top

2 楼uGain(uGain.org)回复于 2004-12-03 10:15:36 得分 0

不可避免,除非你一次将所有数据全读出来,放在数组里,然后通过数组计算页数和实现分页。  
  不过人个觉得没这个必要。Top

3 楼lienzhu(李强)回复于 2004-12-03 10:19:24 得分 0

基本分页代码  
   
  page=request.querystring("page")  
  if   page=""   then    
  page=1  
  else  
        if   isnumeric(page)   then  
                if   page<1   then  
                      page=1  
                end   if  
      else  
              page=1  
      end   if  
  end   if  
  set   rs=server.createobject("ADODB.Recordset")  
  sql="select   *   from   youtable"  
  rs.open   sql,conn,3  
  rs.pagesize=40   '设置每页显示的数量  
  TotalRecord=rs.recordcount   '得到记录数  
  TotalPage=rs.pagecount   '得到页数  
  if   cint(page)>cint(TotalPage)   then  
  page=TotalPage  
  End   if  
  if   not   rs.Eof   then  
  rs.absolutepage=page  
  for   x=1   to   40  
  if   rs.Eof   then   exit   for  
  %>  
  <tr>  
  <td><%=rs("id")%></td>  
  </tr>  
  <%  
  rs.movenext  
  next  
  end   if  
  rs.close  
  set   rs=nothing  
  Top

4 楼gundamzaku(Z钢弹)回复于 2004-12-03 10:39:35 得分 0

我思路错了??啊..  
   
  lienzhu(李强)..这个是ASP的代码吧..Top

5 楼xuzuning(唠叨)回复于 2004-12-03 11:11:26 得分 0

你的思路并不错。尽管两次查询会多一点时间,但影响并不大。  
  如果你确实想在查询时不用select   count(*)   from   表   的话,也可以在插入和删除时执行此操作并将结果保存在文件中。使用时include进来就可以了。毕竟只有在插入和删除后才会影响到count(*)的值,而插入和删除操作远比查询要少。  
  当然当查询条件是动态改变时就只好每次count(*)了  
   
  Top

6 楼gundamzaku(Z钢弹)回复于 2004-12-03 11:13:34 得分 0

老大.受我一拜Top

7 楼wxq4100798(aa)回复于 2004-12-03 11:23:15 得分 0

嘿嘿,偶都是查两次的Top

8 楼javame_sukeen(阿轻)回复于 2004-12-05 12:48:24 得分 0

我也是,嘻嘻Top

9 楼PcVSBirds(pc_birds)回复于 2004-12-05 14:59:11 得分 0

使用limits不太好每次都会到数据库中查询获取数据  
  分页基本思路就是取出所有符合条件的纪录暂时缓存  
  然后依次计算出总页数,每页首纪录末纪录。然后使用  
  指针定位函数并每纪录进行移动指针定位即可Top

10 楼PcVSBirds(pc_birds)回复于 2004-12-05 15:02:21 得分 0

有一个封装类包含这个方法,前面有的如下看看吧  
   
  <?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       :       crackfan@126.com                                                         |  
    |     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()  
  {  
  //查询结果记录集为0否  
  if($this   ->   queryRow)  
  {  
  //结果不为0;有符合条件记录  
  //按行生成记录结果集  
  $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;  
  }  
  }  
  }  
  ?>  
  Top

11 楼navis(让你试着了解我)回复于 2004-12-06 14:31:11 得分 0

我的条件查询分页思路是:  
  1、如果是第一次查询  
        先count(*)    
        再select   *   from    
        保存$recorder_count   =   count(*)的值  
  2、以后的各页就  
        读取$recorder_count   的值  
        再select   *   from    
        保存$recorder_count   =   count(*)的值  
   
  这样在平均效率上就能提高很多  
   
  Top

12 楼gundamzaku(Z钢弹)回复于 2004-12-13 09:38:19 得分 0

懂了..谢谢~~~~~~~~  
   
  我明白了.关于分页的代码我都交给ADODB去做了  
  呵呵~  
   
  PcVSBirds(pc_birds)   如果我有几百万条的记录.我也全部先取出进行缓存么?  
   
  将缓存放在内存中会不会内存吃紧?Top

13 楼PcVSBirds(pc_birds)回复于 2004-12-20 16:36:02 得分 0

你可以优化你的sql语句呀  
  limit好象更差Top

相关问题

  • 查询后分页
  • oracle查询分页显示
  • 如何做查询分页?
  • 查询后分页技术
  • 查询分页的问题
  • 查询分页问题
  • 查询分页问题
  • 查询后分页的问题,总出错,大家帮忙看看
  • 条件查询中的分页问题
  • 查询结果的分页显示,help????

关键词

  • 语句
  • 数据库
  • 数据
  • mysql
  • database
  • db
  • 分页
  • 数组
  • 标记
  • queryrow

得分解答快速导航

  • 帖主:gundamzaku

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo