【ASP】对数据库查询的内容分页显示算法的改进

上次写的《【ASP】数据库查询的内容分页显示》(点击打开链接)中的实现算法虽然能够在一个特定的表中实现了预想的效果,

但是这一算法移植到其他系统之后,发现通用性不强

首先此分页算法的具体实施是通过数据库后台的ID号的区分每一页的,

在一些表中,如果查询出来的ID结果是乱序的,此算法则会失效。

同时,翻页的链接是写死的,没有实现宏,来确定此页的名称。

所以,必须通过大量的修改,实现此算法,但是根本的思想还是没变的,也算是【ASP】数据库查询的内容分页显示v2吧!

一、基本思想

1.页面的名称可以通过程序取到,那么此页面放到任意一个位置,被修改成任意的文件名,算法也不会失效。

2.还是设定好的upper与lower,total,pages,但计算方式有所改变。

3.具体是每一页都查询全表记录,然后,在前台判定那个范围是应该算出的。

二、制作过程

所实现的功能与《【ASP】数据库查询的内容分页显示》(点击打开链接)是没有区别的

但是,整体代码变化更变了不少。具体请看每一行的注释。

<!--asp页面必须要有此句,否则页面乱码-->
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!--页面使用utf-8否则容易乱码-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>翻页</title>
</head>
<!--取到本页的文件名,为后面翻页的超级链接所使用-->
<%
pagename=Mid(Request.ServerVariables("SCRIPT_NAME"),InStrRev(Request.ServerVariables("SCRIPT_NAME"),"/")+1)
%>

<body>
<h1>名单:</h1>
<!--如果首次进入此页面,则默认id与per为0与1-->
<%
id=Request.QueryString("id")
if id="" then
id=0
end if
%>

<%
per=Request.QueryString("per")
if per="" then
per=1
end if
%>
<!--lower与upper的计算方式改变了。主要是输出判断从后台数据库改变为前台。-->
<!--每一页,后台数据库都把整张表送过来,但只输出一部分-->
<%
lower=0
upper=0
lower=cint(id)*cint(per)
upper=cint(id)*cint(per)+cint(per)-1
%>


<%
db="../Database.mdb"
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};pwd=admin;dbq=" & Server.MapPath(db) 
%>
<!--这里的pages计算方式,根据总记录数total除以每页显示条数per,并取上限得出,-->
<!--由于asp没有取上限函数,所以只能加0.999999……这一无限不循环小数取整数部分得出-->
<!--查询每页的数目应该用另一个查询变量rs2,区分查全表变量rs-->
<%
Set rs2 = Server.CreateObject( "ADODB.Recordset" )
sql = "select count(*) as total from test;"
rs2.open sql,conn,1,3
total=rs2("total")
pages=int(cint(total)/cint(per)+0.9)
%>
<!--基于上限的计算方式,如果最后一条记录应该是少于总数加上每页显示数目。-->
<%
if cint(upper)<cint(total)+cint(per) and cint(id)>-1 then
%>

<%
Set rs = Server.CreateObject( "ADODB.Recordset" )
sql = "select * from test;"
rs.open sql,conn,1,3
%>
<%
if (rs.bof and rs.eof) then
%>

暂无
<!--asp中初始化变量i的默认值为0-->
<!--如果i在上限与下限之外就不做任何事,否则输出-->
<%
else
do while not rs.eof
if cint(i)<cint(lower) or cint(i)>cint(upper) then
else
%>
<table>
  <tr>
    <td><%=rs("id")%></a></td>
    <td><%=rs("username")%></td>
    <td><%=rs("password")%></td>
  </tr>
</table>
<%
end if
i=i+1
rs.movenext
loop
%>

<!--计算好upper,lower,page,之后就没有太多的改动了。-->

第
<select id="page">
<%
t=0
do while cint(t)<cint(pages)
%>
<%if (cint(t)=cint(id)) then%>
<option value="<%=t+1%>" selected="selected"><%=t+1%></option>
<%
else
%>
<option value="<%=t+1%>"><%=t+1%></option>
<%
end if
%>
<%
t=t+1
loop
%>

</select>/<%=cint(pages)%>
页

<input type="button" onclick="gopage()" value="转到该页"/>

每页显示<a href="<%=pagename%>?id=<%=(id)%>&per=1">1</a>|<a href="<%=pagename%>?id=<%=(id)%>&per=2">2</a>|<a href="<%=pagename%>?id=<%=(id)%>&per=3">3</a>条记录
<a href="<%=pagename%>?id=<%=(id-1)%>&per=<%=(per)%>">上一页</a>
<a href="<%=pagename%>?id=<%=(id+1)%>&per=<%=(per)%>">下一页</a>
<%
end if
%>
<%
rs.close
set rs=nothing
%>
<%
else
%>
暂无 <a href="javascript:history.go(-1)">返回</a>
<%
end if
%>
<%
rs2.close
set rs2=nothing
conn.close
set conn=nothing
%>

</body>
</html>

<script>
function gopage() {
var id=document.getElementById("page").value-1;
window.location.href = "<%=pagename%>?id="+id+"&per=<%=(per)%>";
} 
</script>


 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。