<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
	<channel>
		<title>金麦网络</title>
		<link>http://www.kingmx.com</link>
		<copyright>Copyright (C) 2006 金麦网络-Kingmx.com All Rights Reserved.</copyright>
		<item>
			<title>通过实例讲解来学习ASP中的函数</title>
			<link>http://www.kingmx.com/article.php?id=17689</link>
			<pubDate>2007-8-8</pubDate>
			<description><![CDATA[
Array()
作用:返回一个数组
语法:Array(list)
适用的类型:字符，数字均可

结果:建立了一个包含7个元素的数组myArray
myArray("Sunday","Monday", ... ... "Saturday") 
CInt()
作用:将一个表达式转化为数字类型
语法:CInt(表达式)
适用的类型:任何有效的字符均可

结果:236
转化字符"234"为数字234，如果字符串为空，则返回0值 
CreateObject()
作用: 建立和返回一个已注册的ACTIVEX组件的实例。
　语法: CreateObject(objName) 
适用的类型: objName 是任何一个有效、已注册的ACTIVEX组件的名字. 

CStr()
作用: 转化一个表达式为字符串.
语法: CStr(expression) 
适用类型: expression 是任何有效的表达式 
]]></description>
		</item>
		<item>
			<title>ASP根据视频格式正确的播放的函数</title>
			<link>http://www.kingmx.com/article.php?id=17688</link>
			<pubDate>2007-8-8</pubDate>
			<description><![CDATA[
　　在给客户做个程序时,突然遇到个问题,就是产品页用户提交视频播放文件时,如何根据提交的网址内的视频格式进行正确的播放呢....郁闷了一会,想好了思路,说动手就动手...
　　思路是先取得文件的类型,并根据类型选择不同的网页播放器代码..三下五去二.....同时为了代码在以后的复用性,写成了通用的调用函数.方便以后在别的系统中调用..
　　现发布源代码如下:
Sub SelPlay(strUrl,strWidth,StrHeight)
Dim Exts,isExt
If strUrl  "" Then
   isExt = LCase(Mid(strUrl,InStrRev(strUrl, ".") 1))
Else
   isExt = ""
End If
Exts = "avi,wmv,asf,mov,rm,ra,ram"
If Instr(Exts,isExt)=0 Then
 Response.write "非法视频文件"
Else
 Select Case isExt
  Case "avi","wmv","asf","mov"
   Response.write "]]></description>
		</item>
		<item>
			<title>技巧：用ASP在线创建Word与Excel文档</title>
			<link>http://www.kingmx.com/article.php?id=17317</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
 ASP具备动态输出任一Office应用程序文件格式的功能。在开始编写代码之前，我们首先需要做的就是设置正确的文件类型，因为浏览器需要知道如何处理文件。第二步是编辑文件名称，我们可以使用HTML和CSS来创建Word文档或Excel文档的样式。
     下面这段例子代码可用于在线创建Word文档。
]]></description>
		</item>
		<item>
			<title>ACCESS作为网站数据库的弊端</title>
			<link>http://www.kingmx.com/article.php?id=17311</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
现在网上绝大多数网站都是ACCESS ASP的形式，因为ACCESS结构简单容易处理，而且也能满足多数的网站程序要求。
　　ACCESS是小型数据库，既然是小型就有他根本的局限性，以下几种情况下数据库基本上会吃不消：
　　1。数据库过大，一般ACCESS数据库达到50M左右的时候性能会急剧下降！
　　2。网站访问频繁，经常达到100人左右的在线。
　　3。记录数过多，一般记录数达到10万条左右的时候性能就会急剧下降！
（注：以上3条只是我们多年以来的经验结果，并不只绝对值，具体视情况不同浮动较大）
　　ACCESS论坛（如动网）大了以后就很容易出现数据库方面的问题，当你的论坛数据库在30M以上，帖子5万左右，在线也在100人左右的时候，你的论坛基本上都在处理数据库上花时间，这个时候很可能就会出现数据库吃不消的情况。
　　一般症状是所有涉及数据库的页面，突然运行都慢的出奇（执行时间达到5秒以上甚至几十秒），涉及HTML和纯ASP运算的页面都正常，等过一段时间（约10分钟或更长）以后又突然恢复。这个时候你可以用一般ASP探针测试一下，如果服务器的运算时间正常，而你的帖字量又比较大，就是数据库方面的问题了。
　　解决方法：
由于这是ACCESS本身的局限性，所以解决的方法除了减少数据量和更换大型的数据库论坛以外也没什么好办法，也就是现在常说的论坛危机，也是大型的论坛都不是ACCESS的原因。我们推荐以下方法：
　1。临时解决办法：定期删除多余的数据、压缩数据库，限制论坛灌水，甚至限制论坛注册。如果是动网论坛，可以使用论坛自带的分表储存功能，会有较好的效果
　2。比较长远办法：更换论坛和数据库，一般都采用动网sql商业版本 MSSQL 的方案来解决，不过这个需要比较大的投资。因为mssql2000和ACCESS相比需要更多的资源，光是占内存上，就可以达到每一个在线1M以上的程度，如果你的SQL论坛有100人在线就会吃掉服务器至少150M以上内存。 
]]></description>
		</item>
		<item>
			<title>用ASP打造一个小型的网页BBS系统</title>
			<link>http://www.kingmx.com/article.php?id=17312</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
传统的网页BBS大多是采用CGI模式实现的，它的实现要求编程者既要掌握编程语言如Perl或C等，又要了解关于CGI模式的各项技术内容，因此要制作自己的网页BBS确实困难不小。ASP（Active Server Pages 动态服务器主页）的出现，使我们眼前一亮，能不能利用ASP实现网页BBS呢？回答当然是肯定的。ASP的诱人之处就在于它提供了一种简单易学的脚本，并带有许多内置的对象，从而提供了一条简捷的编程之路。 
该BBS主要由用户注册(浏览器端)、用户注册（服务器端）、加帖子（浏览器端）、加帖子（服务器端）、帖子具体内容的显示和回复以及所有帖子的显示六个部分组成，其中用户信息存放在数据库author.mdb中，帖子存放在数据库bbs.mdb中。它们均为ACCESS数据库，结构分别如表1、表2所示。 
表1 author.mdb 
字段名 数据类型 长度 说明 
Authname 文本 24 用户名 
Password 文本 10 密码 
表2 bbs.mdb 
字段名 　数据类型　 长度　 说明 
ID 文本 　 4 　帖子的编号 
Authname　 文本 　24　 用户名 
Subject 文本 80 主题 
Content 备注 　 内容 
Adddate 日期/时间 加贴的日期 
Visitnum　 数字 　长整型　 访问人数 
Answernum　 文本 4 所回复帖子的编号 
（缺省为本身的编号） 
Addtime 　日期/时间 加贴的时间 
Topnum 文本 　4 第一层回复帖子的编号 
具体实现方法如下所示，其中asp文件和数据库存放在“/hosp/asp"中，其它htm 
文件存放在“/hosp"文件中，img文件存放在“/hosp/images"。 
1、 用户注册（浏览器端）login.htm:由用户输入相关信息，通过表单传送到服 
务器。 

以下是引用片段：
  
 register a new user  
  

  
为了标识方便，请您注册一个用户名称  
用户：
  
密码：
  
  
  
返回论坛
  
  
 

2、 用户注册（服务器端）Register.asp：利用REQUEST.FORM("表单栏位名")接收表单信息，采用ADO技术与数据库author.mdb连接，并将表单信息存入author.mdb中。 

以下是引用片段：
  
 存用户信息   
  
]]></description>
		</item>
		<item>
			<title>利用ASP代码实现对 IP 的访问限制</title>
			<link>http://www.kingmx.com/article.php?id=17309</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
这是以前用ASP写的，本想改成ASP.net的给大家，后来想大家能看懂算法就行了。IP比对的关键是IP地址的线性化，下面就是代码。 
'可以进入的ip 
'218.7.44.0 - 218.7.45.253 
'61.180.240.0 - 61.180.240.253 
 
'202.118.208.0 - 202.118.223.253 
' 
'218.7.44.0 3657903103 
'218.7.45.253 3657903612 
' 
'61.180.240.0 1035268095 
'61.180.240.253 1035268348 
' 
'202.118.208.0 3396784127 
'202.118.223.253 3396788220 


ip=request.servervariables(]]></description>
		</item>
		<item>
			<title>更正确的asp冒泡排序</title>
			<link>http://www.kingmx.com/article.php?id=17306</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
网上搜到的代码，千篇一律是这个
Function Sort(ary)
Dim KeepChecking,I,FirstValue,SecondValue
 KeepChecking = TRUE 
Do Until KeepChecking = FALSE 
 KeepChecking = FALSE 
 For I = 0 to UBound(ary) 
  If I = UBound(ary) Then Exit For 
   If ary(I) > ary(I 1) Then 
    FirstValue = ary(I) 
    SecondValue = ary(I 1) 
    ary(I) = SecondValue 
    ary(I 1) = FirstValue 
    KeepChecking = TRUE 
   End If 
 Next 
Loop 
 Sort = ary 
End Function 
存在错误。。。。。。
测试一下就知道
s="11,3,1"
s=sort(split(s,","))
for i=0 to ubound(s)
response.write s(i) ]]></description>
		</item>
		<item>
			<title>ASP网站的漏洞分解以及入侵防范方法</title>
			<link>http://www.kingmx.com/article.php?id=17301</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
如何更好的达到防范黑客攻击，本人提一下个人意见！第一，免费程序不要真的就免费用，既然你可以共享原码，那么攻击者一样可以分析代码。如果在细节上注意 防范，那样你站点的安全性就大大的提高了。即使出现了SQL Injection这样的漏洞，攻击者也不可能马上拿下你的站点。 
　　由于ASP的方便易用，越来越多的网站后台程序都使用ASP脚本语言。但是， 由于ASP本身存在一些安全漏洞，稍不小心就会给黑客提供可乘之机。事实上，安全不仅是网管的事，编程人员也必须在某些安全细节上注意，养成良好的安全习 惯，否则会给自己的网站带来巨大的安全隐患。目前，大多数网站上的ASP程序有这样那样的安全漏洞，但如果编写程序的时候注意一点的话，还是可以避免的。
　　1、用户名与口令被破解
　　攻击原理：用户名与口令，往往是黑客们最感兴趣的东西，如果被通过某种方式看到源代码，后果是严重的。
　　防范技巧：涉及用户名与口令的程序最好封装在服务器端，尽量少在ASP文件里出现，涉及与数据库连接的用户名与口令应给予最小的权限。出现次数多的用户 名与口令可以写在一个位置比较隐蔽的包含文件中。如果涉及与数据库连接，在理想状态下只给它以执行存储过程的权限，千万不要直接给予该用户修改、插入、删 除记录的权限。 
　　2、验证被绕过
　　攻击原理：现在需要经过验证的ASP程序大多是在页面头部加一个判断语句，但这还不够，有可能被黑客绕过验证直接进入。
　　防范技巧：需要经过验证的ASP页面，可跟踪上一个页面的文件名，只有从上一页面转进来的会话才能读取这个页面。
　　3、inc文件泄露问题
　　攻击原理：当存在ASP的主页正在制作且没有进行最后调试完成以前，可以被某些搜索引擎机动追加为搜索对象。如果这时候有人利用搜索引擎对这些网页进行查找，会得到有关文件的定位，并能在浏览器中查看到数据库地点和结构的细节，并以此揭示完整的源代码。
　　防范技巧：程序员应该在网页发布前对它进行彻底的调试；安全专家则需要加固ASP文件以便外部的用户不能看到它们。首先对.inc文件内容进行加密，其 次也可以使用.asp文件代替.inc文件使用户无法从浏览器直接观看文件的源代码。inc文件的文件名不要使用系统默认的或者有特殊含义容易被用户猜测 到的名称，尽量使用无规则的英文字母。
　　4、自动备份被下载
　　攻击原理：在有些编辑ASP程序的工具中，当创建或者 修改一个ASP文件时，编辑器自动创建一个备份文件，比如：UltraEdit就会备份一个.bak文件，如你创建或者修改了some.asp，编辑器会 自动生成一个叫some.asp.bak文件，如果你没有删除这个bak文件，攻击者可以直接下载some.asp.bak文件，这样some.asp的 源程序就会被下载。
　　防范技巧：上传程序之前要仔细检查，删除不必要的文档。对以BAK为后缀的文件要特别小心。
　　5、特殊字符
　　攻击原理：输入框是黑客利用的一个目标，他们可以通过输入脚本语言等对用户客户端造成损坏；如果该输入框涉及数据查询，他们会利用特殊查询语句，得到更 多的数据库数据，甚至表的全部。因此必须对输入框进行过滤。但如果为了提高效率仅在客户端进行输入合法性检查，仍有可能被绕过。
　　防范 技巧：在处理类似留言板、BBS等输入框的ASP程序中，最好屏蔽掉HTML、JavaScript、VBScript语句，如无特殊要求，可以限定只允 许输入字母与数字，屏蔽掉特殊字符。同时对输入字符的长度进行限制。而且不但要在客户端进行输入合法性检查，同时要在服务器端程序中进行类似检查。
　　6、数据库下载漏洞
　　攻击原理：在用Access做后台数据库时，如果有人通过各种方法知道或者猜到了服务器的Access数据库的路径和数据库名称，那么他也能够下载这个Access数据库文件，这是非常危险的。
　　防范技巧：
　　(1)为你的数据库文件名称起个复杂的非常规的名字，并把它放在几层目录下。所谓 "非常规"， 打个比方说，比如有个数据库要保存的是有关书籍的信息， 可不要给它起个"book.mdb"的名字，而要起个怪怪的名称，比如d34ksfslf.mdb， 并把它放在如./kdslf/i44/studi/的几层目录下，这样黑客要想通过猜的方式得到你的Access数据库文件就难上加难了。
　　(2)不要把数据库名写在程序中。有些人喜欢把DSN写在程序中，比如： 

以下是引用片段：
　　DBPath = Server.MapPath("cmddb.mdb") 
　　conn.Open "driver={Microsoft Access Driver (*.mdb)}；dbq=" ]]></description>
		</item>
		<item>
			<title>Asp编程实现计算页面执行时间</title>
			<link>http://www.kingmx.com/article.php?id=17298</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
页面执行时间：就是从这页的开始执行一直到这页执行完毕所用的时间。
许多网站的首页的页尾都会显示一个页面执行时间，下面说说如何实现：
首先在一个网页的开头定义一个变量：
dim startime
startime=timer()
在显示页面执行时间的地方，这个地方应该是页尾的地方：
dim endtime
endtime=timer()
页面执行时间：毫秒
大家试试吧 !
]]></description>
		</item>
		<item>
			<title>实例代码解析：用ASP设计购物推车</title>
			<link>http://www.kingmx.com/article.php?id=17296</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
什么是购物推车？ 
　　你一定去过超级市场吧。在那里你可以推着推车，将中意的商品放进推车，或者把推车里的商品取出来重新放到货架，最后你推着推车去结账。 
　　那么，在网上超市，客户也应该可以在浏览商品目录时，将中意的商品放进"电子推车"。电子推车是超级市场推车的电子化。在网上商店里，这种电子推车又称为"购物推车"，英文是Shopping Cart。
　　购物推车的设计目标 
　　从程序员的观点来看，购物推车是维护购物者商品选购、允许察看、允许修改的一个对象。购物推车本身是一个非常简单的程序，但开发者要考虑它将连接到商品目录子系统、订单子系统、客户账号子系统、站点管理子系统等等，形成功能完整的网上商店。 
　　下面是购物推车的设计目标： 
1、 持续性：购物推车应该从它的前一次会话中记住其内容。 
2、 购物推车和客户相关，而不是和客户的电脑相关。客户可以从另外的电脑或浏览器来访问购物推车。 
3、 当新的商品被加入推车或者从推车去掉时，推车的内容可以被显示给用户。 
4、 推车可以容纳很多甚至无限的商品。 
系统设计/流程设计 
　　在编写我们的购物推车之前，我们看看它的系统架构和流程。 
　　如果客户从商品目录中选择了一件商品，这时我们传递客户的请求到proxy.asp，同时传递的是动作变量"增加商品"。Proxy.asp读取这个变量，并决定执行购物推车的哪个动作。这些动作包括：增加商品、更新商品数量、移除商品或者察看购物推车。 
　　有些动作被作为内部调用。如创建推车之前，我们需要检查推车是否已经存在（CheckCart）。在增加、删除或者更新商品及其数量时，我们要确认此商品是否已经存在于我们的购物推车之中(CheckItem)。下面我们将为购物推车设计8个方法，分别是： 
ViewItem 察看推车 
CheckCart 检查推车 
CreateCart 创建推车 
AddItem(ID, Qty), 增加商品 
RemoveItem（ID） 删除商品 
UpdateItem(ID, Qty), 更新数量 
RemoveAll 全部清空 
CheckItem(ID) 商品检查 
　　购物推车的设计 
　　购物推车需要三个要素：一个VBScript 5的类class CartKit，一个多维数组mudCart，一个session变量Session("Cart")。 
　　这个VBScript 类，我们称为CartKit，包含了8个方法，如上表所示。在本文我们只用了ID和Qty，分别表示商品编号和数量。 
　　这样我们就可以用一个二维数组来表达这个推车，象下面这样： 
商品编号 商品数量 
ID-1 23 
ID-3 10 
ID-23 6 
ID-2 1 
然后我们把这个二维数组保存到session变量中就可以了。 
购物推车类CartKit的设计 
请下载：CartKit.asp 
CreateCart设计： 
请看程序代码： 
Class CartKit 
REM 开始类CartKit的定义 
Sub CreateCart() 
　IF IsArray(Session("Cart")) = false THEN 
　　Dim mudCart(19,1) 
　　Session("Cart") = mudCart 
　END IF 
End Sub
其中：Session("Cart")保存的就是推车的内容。如果推车不存在，我们就定义一个二维数组mudCart来表达推车，并将它保存到session("Cart")中。 
CheckCart设计： 
本函数判断Cart是否已经创建。比较简单。 
Function CheckCart() 
IF IsArray(Session("Cart")) THEN 
　　CheckCart=True 
　ELSE 
　　CheckCart=False 
　END IF 
End Function
CheckItem设计： 
请看代码： 
Function CheckItem(ID) 
IF CheckCart=True THEN 
　　varMudCart = Session("Cart") 
　　FOR i = LBound(varMudCart)TO UBound(varMudCart) 
　IF varMudCart(i,0) = ID THEN 
　　CheckItem=TRUE 
　Exit Function 
　ELSEIF varMudCart(i,0)  ID THEN 
　　CheckItem=FALSE 
　END IF 
　　NEXT 
　END IF 
End Function
首先判断推车是否存在。然后将商品的编号ID和购物推车中的商品编号逐一比较。如果有相等的，返回真。否则为假。
AddItem(ID,Qty)设计： 
请参考本文的附件CartKit.asp，这里介绍的函数我们把它们封装到一个名为CartKit的class中。下面的代码段首先创建了一个CartKit对象，然后检查推车是否已经存在。如果不存在，就创建推车并新增商品；否则，检查商品编号是否已经存在于Cart中。如果是，就更新数量；否则，新增商品。 
Function AddItem(ID, Qty) 
Set CartObj = New CartKit 
varCartStatus = CartObj.CheckCart 
　IF varCartStatus=false THEN 
　　CartObj.CreateCart 
　　mudCart=Session("Cart") 
　　mudCart(0,0)=ID 
　　mudCart(0,1)=Qty 
　　Session("Cart")=mudCart 
　　　Exit Function 
　ELSEIF varCartStatus=true THEN 
　IF CartObj.CheckItem(ID) = true THEN 
　　CartObj.UpdateItem ID,Qty 
　ELSEIF cartObj.CheckItem(ID) = false THEN 
　　mudCart = Session("Cart") 
　FOR i = LBound(mudCart) TO UBound(mudCart) 
　IF mudCart(i,0) = "" THEN 
　　mudCart(i,0) = ID 
　　mudCart(i,1) = Qty 
　　Session("Cart") = mudCart 
　Exit Function 
　END IF 
　NEXT 
　END IF 
　END IF 
End Function 
UpdateItem设计： 
Function UpdateItem(ID, Qty) 
mudCart = Session("Cart") 
　FOR i = LBound(mudCart) TO UBound(mudCart) 
　　IF mudCart(i,0) = ID THEN 
　　　mudCart(i,1) = Qty 
　　　Session("cart")=mudCart 
　　　Exit Function 
　　END IF 
　NEXT 
End Function 
ViewItem设计： 
Function ViewItem() 
mudCart=Session("Cart") 
IF isArray(mudCart) THEN 
%> 
Item Name 
Item Quantity 
]]></description>
		</item>
		<item>
			<title>代码实例：用Asp编程实现QQ的在线情况查询</title>
			<link>http://www.kingmx.com/article.php?id=17295</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
这段程序的方法是利用XMLHTTP来读取腾讯网站的相应HTML代码获取QQ的头像，根据这个想法，我们还可以抓取很多其他网站的信息，如天气预报、新闻等等。 
      ＜script language="JavaScript"＞  
　　＜!--  
　　function getFaceImg（QQcode）  
　　{  
　　var Re=new RegExp（"^[1-9]{1}\d $","g"）;  
　　if （!QQcode　　!Re.test（QQcode）） return;  
　　var URL="http://search.tencent.com/cgi-bin/friend/oicq_find?oicq_no=" QQcode;  
　　var http=new ActiveXObject（"Microsoft.XMLHTTP"）;  
　　http.open（"GET",URL,false,"",""）;  
　　http.setRequestHeader（"CONTENT-TYPE","text/html; Charset=gb2312"）;  
　　http.send（）;  
　　  
　　if （http.status!=200） return;  
　　  
　　var webStr=http.responseText;  
　　Re=new RegExp（""（http://img.tencent.com/face/[^"] ）"","ig"）;  
　　if （Re.test（webStr））  
　　return "＜a href="http://search.tencent.com/cgi-bin/friend/user_show_info?ln=" QQcode "" target=_blank title="QQ:" QQcode ""＞＜img src="" RegExp.$1 "" width=16 height=16 border=0＞＜/a＞";  
　　http=null;  
　　}  
　　document.write（"我的QQ状态：" getFaceImg（"44723461"））;  
　　//--＞  
　　＜/script＞
]]></description>
		</item>
		<item>
			<title>ASP与存储过程实践(实例)</title>
			<link>http://www.kingmx.com/article.php?id=17294</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
ASP与存储过程(Stored Procedures)的文章不少，但是我怀疑作者们是否真正实践过。我在初学时查阅过大量相关资料，发现其中提供的很多方法实际操作起来并不是那么回事。对于简单的应用，这些资料也许是有帮助的，但仅限于此，因为它们根本就是千篇一律，互相抄袭，稍微复杂点的应用，就全都语焉不详了。
    现在，我基本上通过调用存储过程访问SQL Server，以下的文字虽不敢保证绝对正确，但都是实践的总结，希望对大家能有帮助。
    存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。
    定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句，只不过这组语句是放在数据库中的(这里我们只谈SQL Server)。如果我们通过创建存储过程以及在ASP中调用存储过程，就可以避免将SQL语句同ASP代码混杂在一起。这样做的好处至少有三个：
    第一、大大提高效率。存储过程本身的执行速度非常快，而且，调用存储过程可以大大减少同数据库的交互次数。
    第二、提高安全性。假如将SQL语句混合在ASP代码中，一旦代码失密，同时也就意味着库结构失密。
    第三、有利于SQL语句的重用。
    在ASP中，一般通过command对象调用存储过程，根据不同情况，本文也介绍其它调用方法。为了方便说明，根据存储过程的输入输出，作以下简单分类：
    1. 只返回单一记录集的存储过程
    假设有以下存储过程(本文的目的不在于讲述T-SQL语法，所以存储过程只给出代码，不作说明)：
    /*SP1*/
    CREATE PROCEDURE dbo.getUserList
    as
    set nocount on
    begin
       select * from dbo.[userinfo]
    end
    go
    以上存储过程取得userinfo表中的所有记录，返回一个记录集。通过command对象调用该存储过程的ASP代码如下:
    '**通过Command对象调用存储过程**
    DIM MyComm,MyRst
    Set MyComm = Server.CreateObject("ADODB.Command")
    MyComm.ActiveConnection = MyConStr          'MyConStr是数据库连接字串
    MyComm.CommandText      = "getUserList"     '指定存储过程名
    MyComm.CommandType      = 4                 '表明这是一个存储过程
    MyComm.Prepared         = true              '要求将SQL命令先行编译
    Set MyRst = MyComm.Execute
    Set MyComm = Nothing
    存储过程取得的记录集赋给MyRst，接下来，可以对MyRst进行操作。
    在以上代码中，CommandType属性表明请求的类型，取值及说明如下：
      -1   表明CommandText参数的类型无法确定
      1    表明CommandText是一般的命令类型
      2    表明CommandText参数是一个存在的表名称
      4    表明CommandText参数是一个存储过程的名称
    还可以通过Connection对象或Recordset对象调用存储过程，方法分别如下：
    '**通过Connection对象调用存储过程**
    DIM MyConn,MyRst
    Set MyConn = Server.CreateObject("ADODB.Connection")
    MyConn.open MyConStr                            'MyConStr是数据库连接字串
    Set MyRst  = MyConn.Execute("getUserList",0,4)  '最后一个参断含义同CommandType
    Set MyConn = Nothing
    '**通过Recordset对象调用存储过程**
    DIM MyRst
    Set MyRst = Server.CreateObject("ADODB.Recordset")
    MyRst.open "getUserList",MyConStr,0,1,4
    'MyConStr是数据库连接字串,最后一个参断含义与CommandType相同
    2. 没有输入输出的存储过程
    请看以下存储过程：
    /*SP2*/
    CREATE PROCEDURE dbo.delUserAll
    as
    set nocount on
    begin
       delete from dbo.[userinfo]
    end
    go
    该存储过程删去userinfo表中的所有记录，没有任何输入及输出，调用方法与上面讲过的基本相同，只是不用取得记录集：
    '**通过Command对象调用存储过程**
    DIM MyComm
    Set MyComm = Server.CreateObject("ADODB.Command")
    MyComm.ActiveConnection = MyConStr          'MyConStr是数据库连接字串
    MyComm.CommandText      = "delUserAll"      '指定存储过程名
    MyComm.CommandType      = 4                 '表明这是一个存储过程
    MyComm.Prepared         = true              '要求将SQL命令先行编译
    MyComm.Execute                              '此处不必再取得记录集
    Set MyComm = Nothing
    当然也可通过Connection对象或Recordset对象调用此类存储过程，不过建立Recordset对象是为了取得记录集，在没有返回记录集的情况下，还是利用Command对象吧。
    3. 有返回值的存储过程
    在进行类似SP2的操作时，应充分利用SQL Server强大的事务处理功能，以维护数据的一致性。并且，我们可能需要存储过程返回执行情况，为此，将SP2修改如下：
    /*SP3*/
    CREATE PROCEDURE dbo.delUserAll
    as
    set nocount on
    begin
       BEGIN TRANSACTION
       delete from dbo.[userinfo]
       IF @@error=0
          begin
             COMMIT TRANSACTION
             return 1
          end
       ELSE
          begin
             ROLLBACK TRANSACTION
             return 0
          end
       return
    end
    go
    以上存储过程，在delete顺利执行时，返回1，否则返回0，并进行回滚操作。为了在ASP中取得返回值，需要利用Parameters集合来声明参数：
    '**调用带有返回值的存储过程并取得返回值**
    DIM MyComm,MyPara
    Set MyComm = Server.CreateObject("ADODB.Command")
    MyComm.ActiveConnection = MyConStr          'MyConStr是数据库连接字串
    MyComm.CommandText      = "delUserAll"      '指定存储过程名
    MyComm.CommandType      = 4                 '表明这是一个存储过程
    MyComm.Prepared         = true              '要求将SQL命令先行编译
    '声明返回值
    Set Mypara = MyComm.CreateParameter("RETURN",2,4)
    MyComm.Parameters.Append MyPara
    MyComm.Execute
    '取得返回值
    DIM retValue
    retValue = MyComm(0)    '或retValue = MyComm.Parameters(0)
    Set MyComm = Nothing
    在MyComm.CreateParameter("RETURN",2,4)中，各参数的含义如下：
    第一个参数("RETURE")为参数名。参数名可以任意设定，但一般应与存储过程中声明的参数名相同。此处是返回值，我习惯上设为"RETURE"；
    第二个参数(2)，表明该参数的数据类型，具体的类型代码请参阅ADO参考，以下给出常用的类型代码：
    adBigInt: 20 ;
    adBinary : 128 ;
    adBoolean: 11 ;
    adChar: 129 ;
    adDBTimeStamp: 135 ;
    adEmpty: 0 ;
    adInteger: 3 ;
    adSmallInt: 2 ;
    adTinyInt: 16 ;
    adVarChar: 200 ;
    对于返回值，只能取整形，且-1到-99为保留值；
    第三个参数(4)，表明参数的性质，此处4表明这是一个返回值。此参数取值的说明如下：
    0 : 类型无法确定； 1: 输入参数；2: 输入参数；3：输入或输出参数；4: 返回值
    以上给出的ASP代码，应该说是完整的代码，也即最复杂的代码，其实
    Set Mypara = MyComm.CreateParameter("RETURN",2,
    MyComm.Parameters.Append MyPara
    可以简化为
    MyComm.Parameters.Append MyComm.CreateParameter("RETURN",2,4)
    甚至还可以继续简化，稍后会做说明。
    对于带参数的存储过程，只能使用Command对象调用(也有资料说可通过Connection对象或Recordset对象调用，但我没有试成过)。
    4. 有输入参数和输出参数的存储过程
    返回值其实是一种特殊的输出参数。在大多数情况下，我们用到的是同时有输入及输出参数的存储过程，比如我们想取得用户信息表中，某ID用户的用户名，这时候，有一个输入参数----用户ID，和一个输出参数----用户名。实现这一功能的存储过程如下：
    /*SP4*/
    CREATE PROCEDURE dbo.getUserName
       @UserID int,
       @UserName varchar(40) output
    as
    set nocount on
    begin
       if @UserID is null return
       select @UserName=username
           from dbo.[userinfo]
           where userid=@UserID
       return
    end
    go
    调用该存储过程的ASP代码如下：
    '**调用带有输入输出参数的存储过程**
    DIM MyComm,UserID,UserName
    UserID = 1
    Set MyComm = Server.CreateObject("ADODB.Command")
    MyComm.ActiveConnection = MyConStr          'MyConStr是数据库连接字串
    MyComm.CommandText      = "getUserName"     '指定存储过程名
    MyComm.CommandType      = 4                 '表明这是一个存储过程
    MyComm.Prepared         = true              '要求将SQL命令先行编译
    '声明参数
    MyComm.Parameters.append MyComm.CreateParameter("@UserID",3,1,4,UserID)
    MyComm.Parameters.append MyComm.CreateParameter("@UserName",200,2,40)
    MyComm.Execute
    '取得出参
    UserName = MyComm(1)
    Set MyComm = Nothing
    在以上代码中，可以看到，与声明返回值不同，声明输入参数时需要5个参数，声明输出参数时需要4个参数。声明输入参数时5个参数分别为：参数名、参数数据类型、参数类型、数据长度、参数值。声明输出参数时，没有最后一个参数：参数值。
    需要特别注意的是：在声明参数时，顺序一定要与存储过程中定义的顺序相同，而且各参数的数据类型、长度也要与存储过程中定义的相同。
    如果存储过程有多个参数，ASP代码会显得繁琐，可以使用with命令简化代码：
    '**调用带有输入输出参数的存储过程(简化代码)**
    DIM MyComm,UserID,UserName
    UserID = 1
    Set MyComm = Server.CreateObject("ADODB.Command")
    with MyComm
       .ActiveConnection = MyConStr          'MyConStr是数据库连接字串
       .CommandText      = "getUserName"     '指定存储过程名
       .CommandType      = 4                 '表明这是一个存储过程
       .Prepared         = true              '要求将SQL命令先行编译
       .Parameters.append .CreateParameter("@UserID",3,1,4,UserID)
       .Parameters.append .CreateParameter("@UserName",200,2,40)
       .Execute
    end with
    UserName = MyComm(1)
    Set MyComm = Nothing
    假如我们要取得ID为1到10，10位用户的用户名，是不是要创建10次Command对象呢？不是的。如果需要多次调用同一存储过程，只需改变输入参数，就会得到不同的输出：
    '**多次调用同一存储过程**
    DIM MyComm,UserID,UserName
    UserName = ""
    Set MyComm = Server.CreateObject("ADODB.Command")
    for UserID = 1 to 10
       with MyComm
          .ActiveConnection = MyConStr          'MyConStr是数据库连接字串
          .CommandText      = "getUserName"     '指定存储过程名
          .CommandType      = 4                 '表明这是一个存储过程
          .Prepared         = true              '要求将SQL命令先行编译
          if UserID = 1 then
             .Parameters.append .CreateParameter("@UserID",3,1,4,UserID)
             .Parameters.append .CreateParameter("@UserName",200,2,40)
             .Execute
          else
             '重新给入参赋值(此时参数值不发生变化的入参以及出参不必重新声明)
             .Parameters("@UserID") = UserID
             .Execute
          end if
       end with
       UserName = UserName   MyComm(1)   ","    '也许你喜欢用数组存储
    next
    Set MyComm = Nothing
    通过以上代码可以看出：重复调用同一存储过程时，只需为值发生改变的输入参数重新赋值即可，这一方法在有多个输入输出参数，且每次调用时只有一个输入参数的值发生变化时，可以大大减少代码量。
    5. 同时具有返回值、输入参数、输出参数的存储过程
    前面说过，在调用存储过程时，声明参数的顺序要与存储过程中定义的顺序相同。还有一点要特别注意：如果存储过程同时具有返回值以及输入、输出参数，返回值要最先声明。
    为了演示这种情况下的调用方法，我们改善一下上面的例子。还是取得ID为1的用户的用户名，但是有可能该用户不存在(该用户已删除，而userid是自增长的字段)。存储过程根据用户存在与否，返回不同的值。此时，存储过程和ASP代码如下：
    /*SP5*/
    CREATE PROCEDURE dbo.getUserName
       --为了加深对"顺序"的印象，将以下两参数的定义顺序颠倒一下
       @UserName varchar(40) output,
       @UserID int
    as
    set nocount on
    begin
       if @UserID is null return
       select @UserName=username
           from dbo.[userinfo]
           where userid=@UserID
       if @@rowcount>0
          return 1
       else
          return 0
       return
    end
    go
    '**调用同时具有返回值、输入参数、输出参数的存储过程**
    DIM MyComm,UserID,UserName
    UserID = 1
    Set MyComm = Server.CreateObject("ADODB.Command")
    with MyComm
       .ActiveConnection = MyConStr          'MyConStr是数据库连接字串
       .CommandText      = "getUserName"     '指定存储过程名
       .CommandType      = 4                 '表明这是一个存储过程
       .Prepared         = true              '要求将SQL命令先行编译
       '返回值要最先被声明
       .Parameters.Append .CreateParameter("RETURN",2,4)
       '以下两参数的声明顺序也做相应颠倒
       .Parameters.append .CreateParameter("@UserName",200,2,40)
       .Parameters.append .CreateParameter("@UserID",3,1,4,UserID)
       .Execute
    end with
    if MyComm(0) = 1 then
       UserName = MyComm(1)
    else
       UserName = "该用户不存在"
    end if
    Set MyComm = Nothing
    6. 同时返回参数和记录集的存储过程
    有时候，我们需要存储过程同时返回参数和记录集，比如在利用存储过程分页时，要同时返回记录集以及数据总量等参数。以下给出一个进行分页处理的存储过程：
    /*SP6*/
    CREATE PROCEDURE dbo.getUserList
       @iPageCount int OUTPUT,   --总页数
       @iPage int,               --当前页号
       @iPageSize int            --每页记录数
    as
    set nocount on
    begin
       --创建临时表
       create table #t (ID int IDENTITY,   --自增字段
                        userid int,
                        username varchar(40))
       --向临时表中写入数据
       insert into #t
          select userid,username from dbo.[UserInfo]
             order by userid
       --取得记录总数
       declare @iRecordCount int
       set @iRecordCount = @@rowcount
       --确定总页数
       IF @iRecordCount%@iPageSize=0
          SET @iPageCount=CEILING(@iRecordCount/@iPageSize)
       ELSE
          SET @iPageCount=CEILING(@iRecordCount/@iPageSize) 1
       --若请求的页号大于总页数，则显示最后一页
       IF @iPage > @iPageCount
          SELECT @iPage = @iPageCount
       --确定当前页的始末记录
       DECLARE @iStart int    --start record
       DECLARE @iEnd int      --end record
       SELECT @iStart = (@iPage - 1) * @iPageSize
       SELECT @iEnd = @iStart   @iPageSize   1
       --取当前页记录
       select * from #t where ID>@iStart and ID=cint(pagecount) then pagenow=pagecount
    end if
    Set MyComm = Nothing
    '以下显示记录
    if recordcount = 0 then
       Response.Write "无记录"
    elseif recordcount > 0 then
       MyRst.open
       do until MyRst.EOF
       ......
       loop
       '以下显示分页信息
       ......
    else  'recordcount=-1
       Response.Write "参数错误"
    end if
    对于以上代码，只有一点需要说明：同时返回记录集和参数时，若要取得参数，需先将记录集关闭，使用记录集时再将其打开。
    7. 返回多个记录集的存储过程
    本文最先介绍的是返回记录集的存储过程。有时候，需要一个存储过程返回多个记录集，在ASP中，如何同时取得这些记录集呢？为了说明这一问题，在userinfo表中增加两个字段：usertel及usermail，并设定只有登录用户可以查看这两项内容。
    /*SP7*/
    CREATE PROCEDURE dbo.getUserInfo
       @userid int,
       @checklogin bit
    as
    set nocount on
    begin
       if @userid is null or @checklogin is null return
       select username
          from dbo.[usrinfo]
          where userid=@userid
       --若为登录用户，取usertel及usermail
       if @checklogin=1
          select usertel,usermail
             from dbo.[userinfo]
             where userid=@userid
       return
    end
    go
    以下是ASP代码：
    '**调用返回多个记录集的存储过程**
    DIM checklg,UserID,UserName,UserTel,UserMail
    DIM MyComm,MyRst
    UserID = 1
    'checklogin()为自定义函数，判断访问者是否登录
    checklg = checklogin()
    Set MyComm = Server.CreateObject("ADODB.Command")
    with MyComm
       .ActiveConnection = MyConStr          'MyConStr是数据库连接字串
       .CommandText      = "getUserInfo"     '指定存储过程名
       .CommandType      = 4                 '表明这是一个存储过程
       .Prepared         = true              '要求将SQL命令先行编译
       .Parameters.append .CreateParameter("@userid",3,1,4,UserID)
       .Parameters.append .CreateParameter("@checklogin",11,1,1,checklg)
       Set MyRst = .Execute
    end with
    Set MyComm = Nothing
    '从第一个记录集中取值
    UserName = MyRst(0)
    '从第二个记录集中取值
    if not MyRst is Nothing then
       Set MyRst = MyRst.NextRecordset()
       UserTel  = MyRst(0)
       UserMail = MyRst(1)
    end if
    Set MyRst = Nothing
    以上代码中，利用Recordset对象的NextRecordset方法，取得了存储过程返回的多个记录集。
    至此，针对ASP调用存储过程的各种情况，本文已做了较为全面的说明。最后说一下在一个ASP程序中，调用多个存储过程的不同方法。
    在一个ASP程序中，调用多个存储过程至少有以下三种方法是可行的：
    1. 创建多个Command对象
    DIM MyComm
    Set MyComm = Server.CreateObject("ADODB.Command")
    '调用存储过程一
    ......
    Set MyComm = Nothing
    Set MyComm = Server.CreateObject("ADODB.Command")
    '调用存储过程二
    ......
    Set MyComm = Nothing
    ......
    2. 只创建一个Command对象，结束一次调用时，清除其参数
    DIM MyComm
    Set MyComm = Server.CreateObject("ADODB.Command")
    '调用存储过程一
    .....
    '清除参数(假设有三个参数)
    MyComm.Parameters.delete 2
    MyComm.Parameters.delete 1
    MyComm.Parameters.delete 0
    '调用存储过程二并清除参数
    ......
    Set MyComm = Nothing
    此时要注意：清除参数的顺序与参数声明的顺序相反，原因嘛，我也不知道。
    3. 利用Parameters数据集合的Refresh方法重置Parameter对象
    DIM MyComm
    Set MyComm = Server.CreateObject("ADODB.Command")
    '调用存储过程一
    .....
    '重置Parameters数据集合中包含的所有Parameter对象
    MyComm.Parameters.Refresh
    '调用存储过程二
    .....
    Set MyComm = Nothing
    一般认为，重复创建对象是效率较低的一种方法，但是经测试(测试工具为Microsoft Application Center Test)，结果出人意料：
    方法2 >= 方法1 >> 方法3
    方法2的运行速度大于等于方法1(最多可高4%左右)，这两种方法的运行速度远大于方法3(最多竟高达130%)，所以建议在参数多时，采用方法1，在参数较少时，采用方法2。
    花了一天的时间，终于把我对于在ASP中调用存储过程的一些粗浅的经验形成了文字。这其中，有些是我只知其果而不明其因的，有些可能是错误的，但是，这些都是经过我亲身实践的。各位看官批判地接受吧。有不同意见，希望一定向我指明，先谢了。
]]></description>
		</item>
		<item>
			<title>AJAX技术 vs 传统的ASP无刷新技术</title>
			<link>http://www.kingmx.com/article.php?id=17290</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
Ajax技术的优势到底在哪里呢，不明白。看一个最简单的例子，假设用户注册的时候,判断用户输入的名字是否已经被占用，假设输入数字1：显示"OK"(表示正确,可以使用)；输入其他字符:显示"Error" (表示错误,已经被占用)。 
   
  　　用ajax技术实现 
   
  　　代码: t.htm 
   
  ＜script＞ 
  function f(){ 
  var req =new ActiveXObject("Microsoft.XMLHTTP"); 
  req.open("GET","t.asp?t1=" t1.value, true); 
  req.onreadystatechange = function(){ 
  　 if (req.readyState == 4) { 
  　 if (req.status == 200) { 
  　　 msg.innerText = req.responseXML.documentElement.tagName; 
  } 
  } 
  } 
  req.send(null); 
  } 
  ＜/script＞ 
  ＜div＞1：显示"OK"; 其他字符:显示"Error"＜/div＞ 
  ＜input id=t1 value=1＞ 
  ＜input type=button value="检测" onclick="javascript:f()"＞ 
  ＜div id=msg＞＜/div＞ 
   
   
  　　代码: 
   
  t.asp 
  ＜% 
  Response.ContentType="text/xml" 
  if request.querystring("t1")="1" then 
  response.write("＜OK/＞") 
  else 
  response.write("＜ERROR/＞") 
  end if 
  %＞ 
   
  　　传统的asp无刷新技术 
   
  　　代码t.htm 
   
  ＜script＞ 
  function f(){ 
  document.getElementById("o").src="t.asp?t1=" t1.value 
  } 
  ＜/script＞ 
  ＜div＞1：显示"OK"; 其他字符:显示"Error"＜/div＞ 
  ＜input id=t1 name=1 value=1＞ 
  ＜input type=button value="检测" onclick="javascript:f()"＞ 
  ＜div id=msg＞＜/div＞ 
  ＜iframe src="t.asp" style="display:none" id=o＞＜/iframe＞ 
   
  　　代码t.asp 
   
  ＜% 
  if request.querystring="" then response.end 
  ss="ERROR" 
  if request.querystring("t1")="1" then ss="OK" 
  %＞ 
  ＜script＞parent.msg.innerText="＜%=ss%＞"＜/script＞ 
   
  　　两者都是无刷新提取服务器(数据库)数据并实时显示在客户段，那为什么现在都要用 ajax呢，还要考虑中文编码等麻烦问题。ajax到底好在哪里,请高手详细说说,我可是一知半解,还没有领会到 ajax的妙处。 
   
  　　在这里,我们暂时只讨论 ajax 调用同域下的asp文件(也就是说自己写的asp程序)，小偷程序,偷取新闻,天气预报等应用技术暂时不讨论 
  ，例子写得很简,没有进行错误处理等,仅为讨论之用。 
]]></description>
		</item>
		<item>
			<title>asp简单的ajax留言板(采用三层模式)</title>
			<link>http://www.kingmx.com/article.php?id=17291</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
好久没有写过asp了,这回写个留言板还真觉得有点难度,竞然写了整整一天,哈哈. 
  就只有留言其它的都什么也没写,采用三层结构(不知道算不算,本来对三层的概念很糊涂) 
   
  演示www.zj55.com的留言板,希望各位大哥大姐如果发现有漏洞的话请在这里告诉我,千万不要黑我的网站,在这里小弟先谢过了. 
   
  index.asp 
   
   
   
   
]]></description>
		</item>
		<item>
			<title>新手入门：防范SQL注入攻击的新办法</title>
			<link>http://www.kingmx.com/article.php?id=17289</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
近段时间由于修改一个ASP程序(有SQL注入漏洞)，在网上找了很多相关的一些防范办法，都不近人意，所以我将现在网上的一些方法综合改良了一下，写出这个ASP函数，供大家参考。
以下是引用片段：
Function SafeRequest(ParaName)  
Dim ParaValue  
ParaValue=Request(ParaName) 
if IsNumeric(ParaValue) = True then 
SafeRequest=ParaValue 
exit Function 
elseIf Instr(LCase(ParaValue),"select ") > 0 or Instr(LCase(ParaValue),"insert ") > 0 or Instr(LCase(ParaValue),"delete from") > 0 or Instr(LCase(ParaValue),"count(") > 0 or Instr(LCase(ParaValue),"drop table") > 0 or Instr(LCase(ParaValue),"update ") > 0 or Instr(LCase(ParaValue),"truncate ") > 0 or Instr(LCase(ParaValue),"asc(") > 0 or Instr(LCase(ParaValue),"mid(") > 0 or Instr(LCase(ParaValue),"char(") > 0 or Instr(LCase(ParaValue),"xp_cmdshell") > 0 or Instr(LCase(ParaValue),"exec master") > 0 or Instr(LCase(ParaValue),"net localgroup administrators") > 0  or Instr(LCase(ParaValue)," and ") > 0 or Instr(LCase(ParaValue),"net user") > 0 or Instr(LCase(ParaValue)," or ") > 0 then 
 Response.Write "" 
 Response.Write "alert('非法的请求!');"  '发现SQL注入攻击提示信息 
 Response.Write "location.href='http://blog.knowsky.com/';"  '发现SQL注入攻击转跳网址 
 Response.Write "" 
 Response.end 
else 
SafeRequest=ParaValue 
End If 
End function 
使用SafeRequest函数替换你的Request
]]></description>
		</item>
		<item>
			<title>ASp使用AspJpeg组件制作透明文字水印</title>
			<link>http://www.kingmx.com/article.php?id=17286</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
技术支持：
　　 1、aspjpeg能对图片水印进行透明度调整，不能对文字水印调整，
　　 2、aspjpeg支持Binary，可以Jpeg.OpenBinary读取，可以Jpeg.sendBinary,也可Jpeg.Binary赋值
思路：
　　 1、把原始的图片数据二进制度赋值给TempA，
　　 2、将文字水印处理后的图片数据二进制赋值给TempB，
　　 3、以TempB作为"图片水印"，附加在TempA上，调整透明度，输出就ok了
思路很简单，代码也很简单：
]]></description>
		</item>
		<item>
			<title>ASP的内置对象Server</title>
			<link>http://www.kingmx.com/article.php?id=17280</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
　　Server 对象提供对服务器上的方法和属性的访问 , 其中大多数方法和属性是作为实用程序的功能服务。（IIS HELP翻译）有了 Server 对象，你就可以在服务器上启动 ActiveX 对象例程，并使用 Active Server 服务提供象 HTML 和 URL 编码这样的函数。
　　一，Script.ScriptTimeout
　　在脚本运行超过一段时间之后，即作超时处理。服务器一般的默认脚本运行时间是90秒。你可以从“Internet信息服务”中“默认Web站点”的属性弹出框中看出，你也可以自己设定。

　　呵呵，上面的可不是，900秒了。应该是“主目录”标签中的“配置”对话框中，WINXP一样。


在理解脚本运行时间之前，先来看一个程序，主要功能就是进行计算网页执行时间的。

startime=timer()
//以下为网页内容
for i= 1 to 5000 step 20
document.write("]]></description>
		</item>
		<item>
			<title>旧技新学:十天学会ASP之第一天</title>
			<link>http://www.kingmx.com/article.php?id=17276</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
    学习目的：安装调试ASP的环境，写出第一个HELLO WORLD程序。
    首先我们来安装WINSOWS2000自带的IIS作为服务器。（WINSOWS98的PWS也可以，但是不推荐，安装大致和2000相同，这里就不详细说了。）

先是控制面板－添加或删除程序。

然后是添加删除windows组件－选中IIS组件前面的勾

装好以后打开控制面板中的管理工具，会发现多了两个图标，打开IIS管理器

选择默认WEB站点，然后右键属性或者直接按快捷键

大家不要头痛，里面只有三个页面需要修改，先是WEB站点，如果用户有固定IP，可以分配一个IP

接下来在注目录中选择一个自己硬盘上面的文件夹存放网站，选中读取、写入。

在文档中添加默认的页面，比如打www.sina.com.cn新浪就是调用了一个默认文档

    接下来也是最关键的：1、在刚才你定义的一个文件夹里面新建一个文件，可以用记事本建立一个TXT文件然后改名为ASP，里面的内容如下
    response.write就是显示的意思，前后的是asp的标记符号，在这里面的信息都由服务器处理。保存以后就可以在浏览器里面运行这个文件了。127.0.0.1（=localhost）是本机的IP，后面再直接加上建立的那个文件名字就可以了，之所以我图片上面还有一个example，那是因为我建立了一个虚拟目录，这个不知道不要紧，我们往下走，具体深入的东西大家自己慢慢研究，必尽我们的目的就是快速掌握嘛。
]]></description>
		</item>
		<item>
			<title>旧技新学:十天学会ASP之第九天</title>
			<link>http://www.kingmx.com/article.php?id=17277</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
    学习目的：基本的SESSION组件，总结response，request组件。
    首先，有会员系统的任何程序都会用到检测是不是用户已经登陆这个步骤。这就用到了SESSION组件，下面我们 看一个代码来说明。
    这句话的意思就是在session里面定义一个islogin字符串变量，值为"yes"，直接可以赋值，不需要声明。是不是很简单？
    如果我们做管理员登陆系统的话，首先是一段检测是不是管理员
if 是 then
session("isadmin")=yes"
else
session("isadmin")="no"
end if
    在每一个需要管理员才能看的页面最前面加上
    这样一般用户就无法打开这个页面。解释一下response.redirect，它是转向的意思，后面的"login.htm"就是转向的文件。这样没有登陆的管理员是无法看到后面的内容的。
下面总结一下
    response组件基本就是用到response.write ()，response.redirect() 分别是写字符串和转向的作用
    request基本就是request.form()，request.querystring() 分别是接受post,get方法传来的信息
    今天就说到这里了，最后我的示范是一个登陆系统大家可以研究一下，基本就是上面的知识点比较简单的。
]]></description>
		</item>
		<item>
			<title>旧技新学:十天学会ASP之第八天</title>
			<link>http://www.kingmx.com/article.php?id=17275</link>
			<pubDate>2007-6-22</pubDate>
			<description><![CDATA[
    学习目的：学会数据库的基本操作4（修改记录）
    先来看代码：
]]></description>
		</item>
	</channel>
 </rss>
