|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
ASP由于使用了COM组件所以它会变的十分强大,但是这样的强大由于WindowsNT系统最初的设计问题而会引发大量的安全问题。只要在这样的组件或是操作中一不注意,哪么外部攻击就可以取得相当高的权限而导致网站瘫痪或者数据丢失;分页克日一向在研讨怎样才干写出高小的分页算法,也许收拾了一下,思绪以下:
起首数据库里必要有一个主动编号字段(ID)。然后第一次会见的时分,掏出一切纪录,定制好每页的纪录数PageSize,盘算出页数,然后依据页数创建一个一维数组PageId(PageCount),PageId(0)保留纪录初试前提,然后对应每一个元素保留每页对应的ID界限码
(
1,ID界限码:假如数据库纪录ID纪录序列以下1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
假定必要依照ID按次排序的话,PageSize=5,Pagecount=4,PageId(4)
数组PageId的值分离为PageId(0)=1,PageId(1)=5,PageId(2)=10,PageId(3)=15,PageId(4)=16
当会见第i页的时分就间接找[PageId(i-1),PageId(i))之间的纪录,如许能够包管每次取的纪录都只是PageSize笔记录。
假定必要依照ID倒序分列的话,
数组PageId的值分离为PageId(0)=16,PageId(1)=12,PageId(2)=7,PageId(3)=2,PageId(4)=1,当会见第i页的时分就间接查找ID属于[PageId(i-1),PageId(i))
)
将数组PageId()保留在Application()中,以便会见,如许,只是第一次会见分页程序的时分便初始化Application()。代码部分以下:(上面称为新程序)
<%
Time1=Timer()
DimConn
SetConn=Server.CreateObject("Adodb.Connection")
Conn.open"Driver={MicroSoftAccessDriver(*.mdb)};Dbq="&Server.MapPath("db.mdb")
DimPage,PageCounts,PageId,PageList
DimRs,Sql
DimIsInit,i
IsInit=False标记为,用来判别Application("PageId")是不是初始化
PageList=20设置每页显现20条数据
SetRs=Server.CreateObject("Adodb.Recordset")
Page=Request.QueryString("Page")注重页码必要反省范例
IfIsEmpty(Application("PageId"))Then假如Application("PageId")还未初始化,则先辈行初始化
Response.Write("Initapp!<br>")
Sql="Select*FromtestOrderByIdDesc"假定这里是依照ID倒序分列
Rs.openSql,Conn,1,1失掉纪录集工具
IfNot(Rs.EoforRs.Bof)Then
Rs.PageSize=PageList设置每页纪录数
PageCounts=Rs.PageCount
ReDimPageId(PageCounts)从头界说数组PageId
Fori=0ToPageCounts入手下手给数组PageId()赋值
IfRs.eofThenExitFor
PageId(i)=Rs("ID")
Rs.Move(PageList)
Next
Rs.MoveLast
PageId(PageCounts)=Rs("ID")
Application.Lock()
Application("PageId")=PageId
Application.UnLock()
EndIf
Rs.Close
EndIf
IdStart=Clng(Application("PageId")(Page-1))
IdEnd=Clng(Application("PageId")(Page))
Sql="Select*fromtestwhereid<="&IdStart&"andid>"&IdEnd&""
Rs.openSql,Conn,1,1
WhileNotRs.eof
Response.Write(rs(0)&"--"&rs(1))
Rs.MoveNext
Wend
Rs.Close
SetRs=Nothing
Conn.Close
SetConn=Nothing
Fori=1ToUbound(Application("PageId"))
Response.Write("<ahref=Test1.asp?Page="&i&">"&i&"</a> ")
Next
Time2=Timer()
Response.Write("<br>"&(Time2-Time1)*1000)
Application.Contents.Remove("PageId")
%>
传统分页代码以下:(上面称为旧程序)
<%
Time1=Timer()
DimConn
SetConn=Server.CreateObject("Adodb.Connection")
Conn.open"Driver={MicroSoftAccessDriver(*.mdb)};Dbq="&Server.MapPath("db.mdb")
DimPage,PageCounts,PageList
DimRs,Sql
PageList=20
Page=Request.QueryString("Page")
SetRs=Server.CreateObject("Adodb.Recordset")
Sql="Select*fromtestorderbyiddesc"
Rs.OpenSql,Conn,1,1
IfPage=""ThenPage=1
IfNot(Rs.eofOrRs.Bof)Then
Rs.PageSize=PageList
PageCounts=Rs.PageCount
Rs.AbsolutePage=Page
EndIf
Fori=1toPageList
IfRs.eofThenExitFor
Response.Write(Rs(0)&"-----"&Rs(1)&"<br>")
Rs.MoveNext
next
Fori=1ToPageCounts
Response.Write("<ahref=Test.asp?Page="&i&">"&i&"</a> ")
Next
Time2=Timer()
Response.Write("<br>"&(Time2-Time1)*1000)
%>
实在,整体的头脑就是,创建一个Application("PageId")全局数组,每一个元素都保留页面所区纪录的ID区间,好比,Application("PageId")(0)保留第一个元素的ID,然后Application("PageId")(1)保留下一页的第一个ID…………顺次类推,当必要会见第i页的时分,就间接查找ID在[Application("PageId")(i-1),Application("i"))内里的纪录集,如许,每次只用查找必要的纪录数,而不</p>源代码保护方面其实现在考虑得没那么多了..NET也可以反编译.ASP写得复杂的话别人能看得懂的话.他也有能力自己写了.这方面担心的倒不太多.纵观现在网上可以下载的那些所谓BBS还有什么网站等等的源代码 |
|