<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Wordpress外贸企业主题, Wp企业主题, wordpress企业主题, wordpress主题定制,  PHP代码, ASP代码, 精选JS代码, WORDPRESS, 网站SEO,Flash焦点广告,JS焦点广告,CSS技巧 &#124; 九创主题 &#187; ASP</title>
	<atom:link href="http://www.3code.cn/tag/asp-tag/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.3code.cn</link>
	<description>Wordpress外贸企业主题, Wp企业主题, wordpress企业主题, wordpress主题定制,  PHP代码,ASP代码,精选JS代码,WORDPRESS,网站SEO,Flash焦点广告,JS焦点广告,CSS技巧</description>
	<lastBuildDate>Thu, 09 Feb 2012 01:52:35 +0000</lastBuildDate>
	<language>zh-cn</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>ASP网站漏洞解析及黑客入侵防范方法(3)</title>
		<link>http://www.3code.cn/asp-hk-3/</link>
		<comments>http://www.3code.cn/asp-hk-3/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 10:26:12 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[asp安全]]></category>
		<category><![CDATA[asp数据库]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1594</guid>
		<description><![CDATA[再提醒各位论坛站长一句，小心你们的文件上传：为什么论坛程序被攻破后主机也随之被攻击者占据。原因就在……对！ASP 木马！一个绝对可恶的东西。病毒么？非也.把个文件随便放到你论坛的程序中，您老找去吧。不吐血才怪哦。如何才能防止ASP木马被上传到服务器呢？方法很简单，如果你的论坛支持文件上传，请设定好你要上传的文件格式，我不赞成使用可更改的文件格式，直接从程序上锁定，只有图象文件格式，和压缩文件就完全可以，]]></description>
			<content:encoded><![CDATA[<p>8、ASP木马</p>
<p>  　　已经讲到这里了，再提醒各位论坛站长一句，小心你们的文件上传：为什么论坛程序被攻破后主机也随之被攻击者占据。原因就在……对！ASP 木马！一个绝对可恶的东西。病毒么？非也.把个文件随便放到你论坛的程序中，您老找去吧。不吐血才怪哦。如何才能防止ASP木马被上传到服务器呢？方法很简单，如果你的论坛支持文件上传，请设定好你要上传的文件格式，我不赞成使用可更改的文件格式，直接从程序上锁定，只有图象文件格式，和压缩文件就完全可以，多给自己留点方便也就多给攻击者留点方便。怎么判断格式，我这里收集了一个，也改出了一个，大家可以看一下：</p>
<p>  　　程序体（10）</p>
<p>  　　’判断文件类型是否合格<br />
  　　Private Function CheckFileExt (fileEXT)<br />
  　　dim Forumupload<br />
  　　Forumupload="gif,jpg,bmp,jpeg"<br />
  　　Forumupload=split(Forumupload,",")<br />
  　　for i=0 to ubound(Forumupload)<br />
  　　if lcase(fileEXT)=lcase(trim(Forumupload(i))) then<br />
  　　CheckFileExt=true<br />
  　　exit Function<br />
  　　else<br />
  　　CheckFileExt=false<br />
  　　end if<br />
  　　next<br />
  　　End Function<br />
  　　‘验证文件内容的合法性</p>
<p>  set MyFile = server.CreateObject ("Scripting.FileSystemObject")<br />
  　　set MyText = MyFile.OpenTextFile (sFile, 1) ’ 读取文本文件<br />
  　　sTextAll = lcase(MyText.ReadAll): MyText.close<br />
  　　’判断用户文件中的危险操作<br />
  　　sStr ="8　.getfolder　.createfolder　.deletefolder　.createdirectory　<br />
  　　.deletedirectory"<br />
  　　sStr = sStr &#038; "　.saveas　wscript.shell　script.encode"<br />
  　　sNoString = split(sStr,"　")<br />
  　　for i = 1 to sNoString(0)<br />
  　　if instr(sTextAll, sNoString(i)) ＜＞ 0 then<br />
  　　sFile = Upl.Path &#038; sFileSave: fs.DeleteFile sFile<br />
  　　Response.write "＜center＞＜br＞＜big＞"&#038; sFileSave &#038;"文件中含有与操作目录等有关的命令"&#038;_<br />
  　　"＜br＞＜font color=red＞"&#038; mid(sNoString(i),2) &#038;"＜/font＞，为了安全原因，＜b＞不能上传。＜b＞"&#038;_"＜/big＞＜/center＞＜/html＞"<br />
  　　Response.end<br />
  　　end if<br />
  　　next</p>
<p>  　　把他们加到你的上传程序里做一次验证，那么你的上传程序安全性将会大大提高.</p>
<p>  　　什么？你还不放心？拿出杀手锏，请你的虚拟主机服务商来帮忙吧。登陆到服务器，将PROG ID 中的"shell.application"项和"shell.application.1"项改名或删除。再将”WSCRIPT.SHELL”项和”WSCRIPT.SHELL.1”这两项都要改名或删除。呵呵，我可以大胆的说，国内可能近半以上的虚拟主机都没改过。只能庆幸你们的用户很合作，否则……我删，我删，我删删删……</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/asp-hk-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP网站漏洞解析及黑客入侵防范方法(2)</title>
		<link>http://www.3code.cn/asp-hk-2/</link>
		<comments>http://www.3code.cn/asp-hk-2/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 10:23:45 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[ASP函数]]></category>
		<category><![CDATA[asp数据库]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1592</guid>
		<description><![CDATA[为你的数据库文件名称起个复杂的非常规的名字，并把它放在几层目录下。所谓 “非常规”，打个比方说，比如有个数据库要保存的是有关书籍的信息，可不要给它起个“book.mdb”的名字，而要起个怪怪的名称，比如d34ksfslf.mdb，并把它放在如./kdslf/i44/studi/的几层目录下，这样黑客要想通过猜的方式得到你的Access数据库文件就难上加难了。]]></description>
			<content:encoded><![CDATA[<p>6、数据库下载漏洞</p>
<p>  　　攻击原理：在用Access做后台数据库时，如果有人通过各种方法知道或者猜到了服务器的Access数据库的路径和数据库名称，那么他也能够下载这个Access数据库文件，这是非常危险的。</p>
<p>  　　防范技巧：</p>
<p>  　　（1）为你的数据库文件名称起个复杂的非常规的名字，并把它放在几层目录下。所谓 “非常规”，打个比方说，比如有个数据库要保存的是有关书籍的信息，可不要给它起个“book.mdb”的名字，而要起个怪怪的名称，比如d34ksfslf.mdb，并把它放在如./kdslf/i44/studi/的几层目录下，这样黑客要想通过猜的方式得到你的Access数据库文件就难上加难了。</p>
<p>  　　（2）不要把数据库名写在程序中。有些人喜欢把DSN写在程序中，比如：</p>
<p>  　　DBPath = Server.MapPath（“cmddb.mdb”）<br />
  　　conn.Open “driver={Microsoft Access Driver （*.mdb）}；dbq=” &#038; DBPath</p>
<p>  　　假如万一给人拿到了源程序，你的Access数据库的名字就一览无余了。因此建议你在ODBC里设置数据源，再在程序中这样写：</p>
<p>  　　conn.open“shujiyuan”</p>
<p>  　　（3）使用Access来为数据库文件编码及加密。首先在“工具→安全→加密/解密数据库”中选取数据库（如：employer.mdb），然后按确定，接着会出现“数据库加密后另存为”的窗口，可存为：“employer1.mdb”。</p>
<p>  　　要注意的是，以上的动作并不是对数据库设置密码，而只是对数据库文件加以编码，目的是为了防止他人使用别的工具来查看数据库文件的内容。</p>
<p>  　　接下来我们为数据库加密，首先打开经过编码了的 employer1.mdb，在打开时，选择“独占”方式。然后选取功能表的“工具→安全→设置数据库密码”，接着输入密码即可。这样即使他人得到了 employer1.mdb文件，没有密码他也是无法看到 employer1.mdb中的内容。</p>
<p>  　　7、防范远程注入攻击</p>
<p>  　　这类攻击在以前应该是比较常见的攻击方式,比如POST攻击,攻击者可以随便的改变要提交的数据值已达到攻击目的.又如:COOKIES 的伪造,这一点更值得引起程序编写者或站长的注意，不要使用COOKIES来做为用户验证的方式,否则你和把钥匙留给贼是同一个道理.</p>
<p>  　　比如:</p>
<p>  　　If trim(Request. cookies ("uname"))="fqy" and Request.cookies("upwd") =”fqy#e3i5.com” then<br />
  　　……..more………<br />
  　　End if</p>
<p>  　　我想各位站长或者是喜好写程序的朋友千万别出这类错误,真的是不可饶恕.伪造COOKIES 都多少年了，你还用这样的就不能怪别人跑你的密码.涉及到用户密码或者是用户登陆时,你最好使用session 它才是最安全的.如果要使用COOKIES就在你的COOKIES上多加一个信息,SessionID,它的随机值是64位的,要猜解它,不可能.例:</p>
<p>  　　if not (rs.BOF or rs.eof) then<br />
  　　login="true"<br />
  　　Session("username"&#038;sessionID) = Username<br />
  　　Session("password"&#038; sessionID) = Password<br />
  　　‘Response.cookies(“username”)= Username<br />
  　　‘Response.cookies(“Password”)= Password</p>
<p>  　　下面我们来谈谈如何防范远程注入攻击,一般的攻击都是将单表提交文件拖到本地,将Form ACTION=”chk.asp” 指向你服务器中处理数据的文件即可.如果你全部的数据过滤都在单表页上，那么恭喜你，你将已经被脚本攻击了.</p>
<p>  　　怎么才能制止这样的远程攻击?好办,请看代码如下: 程序体(9)</p>
<p>  　　＜%<br />
  　　server_v1=Cstr(Request.ServerVariables("HTTP_REFERER"))<br />
  　　server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))<br />
  　　if mid(server_v1,8,len(server_v2))＜＞server_v2 then<br />
  　　response.write "＜br＞＜br＞＜center>"<br />
  　　response.write " "<br />
  　　response.write "你提交的路径有误，禁止从站点外部提交数据请不要乱改参数！"<br />
  　　response.write "</p>
<p>  "<br />
  　　response.end<br />
  　　end if<br />
  　　%></p>
<p>  ‘个人感觉上面的代码过滤不是很好，有一些外部提交竟然还能堂堂正正的进来,于是再写一个.</p>
<p>  　　‘这个是过滤效果很好,建议使用.</p>
<p>  　　if instr(request.servervariables("http_referer"),"http://"&#038;request.servervariables("host") )<1 then response.write "处理 URL 时服务器上出错。</p>
<p>  　　如果您是在用任何手段攻击服务器，那你应该庆幸，你的所有操作已经被服务器记录，我们会第一时间通知公安局与国家安全部门来调查你的IP. "</p>
<p>  　　response.end<br />
  　　end if<br />
  　　程序体(9)</p>
<p>  　　本以为这样就万事大吉了，在表格页上加一些限制,比如maxlength啦,等等..但天公就是那么不作美,你越怕什么他越来什么.你别忘了,攻击者可以突破sql注入攻击时输入框长度的限制.写一个SOCKET程序改变HTTP_REFERER？我不会。网上发表了这样一篇文章：</p>
<p>  　　------------len.reg-----------------<br />
  　　Windows Registry Editor Version 5.00<br />
  　　[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\扩展(&#038;E)]<br />
  　　@="C:\Documents and Settings\Administrator\桌面\len.htm"<br />
  　　"contexts"=dword:00000004<br />
  　　-----------end----------------------<br />
  　　-----------len.htm------------------<br />
  　　<br />
  　　----------end-----------------------</p>
<p>  　　用法:先把len.reg导入注册表(注意文件路径)</p>
<p>  　　然后把len.htm拷到注册表中指定的地方.</p>
<p>  　　打开网页,光标放在要改变长度的输入框上点右键,看多了一个叫扩展的选项了吧</p>
<p>  　　单击搞定! 后记:同样的也就可以对付那些限制输入内容的脚本了.</p>
<p>  　　怎么办？我们的限制被饶过了，所有的努力都白费了？不，举起你de键盘，说不。让我们继续回到脚本字符的过滤吧，他们所进行的注入无非就是进行脚本攻击。我们把所有的精力全都用到ACTION以后的页面吧，在chk.asp页中，我们将非法的字符全部过滤掉，结果如何？我们只在前面虚晃一枪，叫他们去改注册表吧，当他们改完才会发现，他们所做的都是那么的徒劳。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/asp-hk-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP网站漏洞解析及黑客入侵防范方法(1)</title>
		<link>http://www.3code.cn/asp-hk/</link>
		<comments>http://www.3code.cn/asp-hk/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 10:21:32 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[ASP函数]]></category>
		<category><![CDATA[asp安全]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1590</guid>
		<description><![CDATA[由于ASP的方便易用，越来越多的网站后台程序都使用ASP脚本语言。但是，由于ASP本身存在一些安全漏洞，稍不小心就会给黑客提供可乘之机。事实上，安全不仅是网管的事，编程人员也必须在某些安全细节上注意，养成良好的安全习惯，否则会给自己的网站带来巨大的安全隐患。目前，大多数网站上的ASP程序有这样那样的安全漏洞，但如果编写程序的时候注意一点的话，还是可以避免的。]]></description>
			<content:encoded><![CDATA[<p>如何更好的达到防范黑客攻击，本人提一下个人意见！第一，免费程序不要真的就免费用，既然你可以共享原码，那么攻击者一样可以分析代码。如果在细节上注意防范，那样你站点的安全性就大大的提高了。即使出现了SQL Injection这样的漏洞，攻击者也不可能马上拿下你的站点。</p>
<p>  　　由于ASP的方便易用，越来越多的网站后台程序都使用ASP脚本语言。但是，由于ASP本身存在一些安全漏洞，稍不小心就会给黑客提供可乘之机。事实上，安全不仅是网管的事，编程人员也必须在某些安全细节上注意，养成良好的安全习惯，否则会给自己的网站带来巨大的安全隐患。目前，大多数网站上的ASP程序有这样那样的安全漏洞，但如果编写程序的时候注意一点的话，还是可以避免的。</p>
<p>  　　1、用户名与口令被破解</p>
<p>  　　攻击原理：用户名与口令，往往是黑客们最感兴趣的东西，如果被通过某种方式看到源代码，后果是严重的。</p>
<p>  　　防范技巧：涉及用户名与口令的程序最好封装在服务器端，尽量少在ASP文件里出现，涉及与数据库连接的用户名与口令应给予最小的权限。出现次数多的用户名与口令可以写在一个位置比较隐蔽的包含文件中。如果涉及与数据库连接，在理想状态下只给它以执行存储过程的权限，千万不要直接给予该用户修改、插入、删除记录的权限。</p>
<p>  　　2、验证被绕过</p>
<p>  　　攻击原理：现在需要经过验证的ASP程序大多是在页面头部加一个判断语句，但这还不够，有可能被黑客绕过验证直接进入。<br />
  　　防范技巧：需要经过验证的ASP页面，可跟踪上一个页面的文件名，只有从上一页面转进来的会话才能读取这个页面。</p>
<p>  　　3、inc文件泄露问题</p>
<p>  　　攻击原理：当存在ASP的主页正在制作且没有进行最后调试完成以前，可以被某些搜索引擎机动追加为搜索对象。如果这时候有人利用搜索引擎对这些网页进行查找，会得到有关文件的定位，并能在浏览器中查看到数据库地点和结构的细节，并以此揭示完整的源代码。</p>
<p>  　　防范技巧：程序员应该在网页发布前对它进行彻底的调试；安全专家则需要加固ASP文件以便外部的用户不能看到它们。首先对.inc文件内容进行加密，其次也可以使用.asp文件代替.inc文件使用户无法从浏览器直接观看文件的源代码。inc文件的文件名不要使用系统默认的或者有特殊含义容易被用户猜测到的名称，尽量使用无规则的英文字母。</p>
<p>  　　4、自动备份被下载</p>
<p>  　　攻击原理：在有些编辑ASP程序的工具中，当创建或者修改一个ASP文件时，编辑器自动创建一个备份文件，比如：UltraEdit就会备份一个.bak文件，如你创建或者修改了some.asp，编辑器会自动生成一个叫some.asp.bak文件，如果你没有删除这个bak文件，攻击者可以直接下载some.asp.bak文件，这样some.asp的源程序就会被下载。</p>
<p>  　　防范技巧：上传程序之前要仔细检查，删除不必要的文档。对以BAK为后缀的文件要特别小心。</p>
<p>  　　5、特殊字符</p>
<p>  　　攻击原理：输入框是黑客利用的一个目标，他们可以通过输入脚本语言等对用户客户端造成损坏；如果该输入框涉及数据查询，他们会利用特殊查询语句，得到更多的数据库数据，甚至表的全部。因此必须对输入框进行过滤。但如果为了提高效率仅在客户端进行输入合法性检查，仍有可能被绕过。</p>
<p>  　　防范技巧：在处理类似留言板、BBS等输入框的ASP程序中，最好屏蔽掉HTML、JavaScript、VBScript语句，如无特殊要求，可以限定只允许输入字母与数字，屏蔽掉特殊字符。同时对输入字符的长度进行限制。而且不但要在客户端进行输入合法性检查，同时要在服务器端程序中进行类似检查。 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/asp-hk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP取出HTML里面的图片地址的函数</title>
		<link>http://www.3code.cn/asp-html-img/</link>
		<comments>http://www.3code.cn/asp-html-img/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 10:18:19 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[ASP函数]]></category>
		<category><![CDATA[ASP字符串]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1588</guid>
		<description><![CDATA[以下是取出HTML里面的图片地址的函数：主要原理就是用正则判断 <img> 的<src>属性。这在采集程序中将非常有用。]]></description>
			<content:encoded><![CDATA[<p>以下是取出HTML里面的图片地址的函数：</p>
<p>主要原理就是用正则判断 &lt;img&gt; 的&lt;src&gt;属性。这在采集程序中将非常有用。<br />
<strong><br />
函数如下：<br />
</strong><br />
以下是引用片段：<br />
Function ShowPic(str)<br />
Set objRegExp = New Regexp'设置配置对象<br />
objRegExp.IgnoreCase = True'忽略大小写<br />
objRegExp.Global = True'设置为全文搜索<br />
objRegExp.Pattern = "&lt;img.+?&gt;"<br />
<strong>'为了确保能准确地取出图片地址所以分为两层配置：首先找到里面的&lt;img&gt;标签，然后再取出里面的图片地址后面的getimgs函数就是实现后一个功能的。 </strong><br />
strs=trim(str)<br />
Set Matches =objRegExp.Execute(strs)'开始执行配置<br />
For Each Match in Matches<br />
RetStr = RetStr &amp;getimgs( Match.Value )'执行第二轮的匹配<br />
Next<br />
ShowPic = RetStr<br />
End Function<br />
Function getimgs(str)<br />
getimgs=""<br />
Set objRegExp1 = New Regexp<br />
objRegExp1.IgnoreCase = True<br />
objRegExp1.Global = True<br />
objRegExp1.Pattern = "http://.+?"""'取出里面的地址<br />
set mm=objRegExp1.Execute(str)<br />
For Each Match1 in mm<br />
getimgs=getimgs&amp;left(Match1.Value,len(Match1.Value)-1)&amp;"||"'把里面的地址串起来备用<br />
next<br />
End Function<br />
'取得图片内容<br />
function getHTTPPage(url)<br />
on error resume next<br />
dim http<br />
set http=server.createobject("MSXML2.XMLHTTP")'使用xmlhttp的方法来获得图片的内容<br />
Http.open "GET",url,false<br />
Http.send()<br />
if Http.readystate&lt;&gt;4 then<br />
exit function<br />
end if<br />
getHTTPPage=Http.responseBody<br />
set http=nothing<br />
if err.number&lt;&gt;0 then err.Clear<br />
end function<br />
'保存图片<br />
function saveimage(from,tofile)<br />
dim geturl,objStream,imgs<br />
geturl=trim(from)<br />
imgs=gethttppage(geturl)'取得图片的具休内容的过程<br />
Set objStream = Server.CreateObject("ADODB.Stream")'建立ADODB.Stream对象，必须要ADO 2.5以上版本<br />
objStream.Type =1'以二进制模式打开<br />
objStream.Open<br />
objstream.write imgs'将字符串内容写入缓冲<br />
objstream.SaveToFile server.mappath(tofile),2'-将缓冲的内容写入文件<br />
objstream.Close()'关闭对象<br />
set objstream=nothing<br />
end function</p>
<p><strong>'调用实例 </strong><br />
Dim strpic,i,fname<br />
strpic = ShowPic("&lt;DIV align=center&gt;&lt;IMG src=""http://img.knowsky.com/img/knowskylogo.gif"" border=0&gt;&lt;/DIV&gt;")<br />
strpic = Split(strpic,"||")<br />
If UBound(strpic) &gt; 0 Then<br />
For i = 0 To UBound(strpic) - 1<br />
'保存图片<br />
fname=cstr(i&amp;mid(strpic(i),instrrev(strpic(i),".")))<br />
saveimage(strpic(i),fname)<br />
Next<br />
Else<br />
End If</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/asp-html-img/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP调用数据库中视图及存储过</title>
		<link>http://www.3code.cn/asp-ado/</link>
		<comments>http://www.3code.cn/asp-ado/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 10:15:57 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[asp数据库]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1586</guid>
		<description><![CDATA[ASP提供内建对象，这些对象使用户更容易收集通过浏览器请求发送的信息、响应浏览器以及存储用户信息。包括Application、 Request、Response、Server、Session 和ObjectContext 对象。其中最为常用的为Request、Response 和Server三个对象，它们分别用于从浏览器请求信息、向浏览器发送信息和访问服务器上对象的属性和方法。]]></description>
			<content:encoded><![CDATA[<p>一、前言</p>
<p>ASP (Active Server Pages) 是服务器端的脚本编写环境，它由微软公司的IIS3.0以上版本支持。它可用来创建动态 Web 页或生成功能强大的 Web应用程序。ASP页是包括 HTML 标记、文本和脚本命令的文件。ASP页可调用ActiveX组件来执行任务，例如连接到数据库或进行商务计算。通过ASP，可为您的Web页添加交互内容 或用HTML页构成整个Web应用程序，这些应用程序使用HTML页作为您的客户的界面。</p>
<p>二、ASP模型</p>
<p>浏览器从Web服务器上请求 .asp文件时，ASP 脚本开始运行。然后Web服务器调用ASP，ASP全面读取请求的文件，执行所有脚本命令，并将Web页传送给浏览器。</p>
<p>ASP提供了一个在HTML页中使用现有脚本语言如 Microsoft VBScript 和 Microsoft JScript 的框架。</p>
<p>ASP提供内建对象，这些对象使用户更容易收集通过浏览器请求发送的信息、响应浏览器以及存储用户信息。包括Application、 Request、Response、Server、Session 和ObjectContext 对象。其中最为常用的为Request、Response 和Server三个对象，它们分别用于从浏览器请求信息、向浏览器发送信息和访问服务器上对象的属性和方法。</p>
<p>三、ADO</p>
<p>ASP和后台数据库连接使用微软的ADO(ActiveX Data Objects)，ADO是一项容易使用并且可扩展的将数据库访问添加到Web页的技术。可以使用ADO去编写紧凑简明的脚本以便连接到Open Database Connectivity(ODBC)兼容的数据库和 OLE DB兼容的数据源。</p>
<p>ADO包含7个内置对象，它们分别为Connection、Command、RecordSet、Fields、Error、Parameters和Properties。通过这些对象，ASP可以完成对后台数据库的所有操作。</p>
<p>四、ASP调用视图和存储过程</p>
<p>在一般的MIS应用中，会有大量的报表，此时我们可以在后台数据库编写相应的视图或存储过程，用ASP通过ADO调用以完成报表工作。下面用一个例子说明相应的操作过程。</p>
<p>1.创建 ODBC DSN 文件</p>
<p>在创建数据库脚本之前，必须提供一条使ADO定位、标识和与数据库通讯的途径。数据库驱动程序使用Data Source Name (DSN) 定位和标识特定的ODBC兼容数据库，将信息从 Web 应用程序传递给数据库。</p>
<p>2. 调用数据库视图</p>
<p>访问数据库信息的第一步是和数据库源建立连接。ADO提供Connection对象，可以使用该对象建立和管理应用程序和 ODBC数据库之间的连接。</p>
<p>&lt;%<br />
Set Dataconn = Server.CreateObject("ADODB.Connection") '建立连接对象<br />
Dataconn.Open "DSN=SinoTrans;SERVER=APP_SERVER;<br />
UID=sa;PWD=;APP=Microsoft (R) Developer Studio;WSID=APP_SERVER;Regional=Yes"<br />
Set cmdTemp = Server.CreateObject("ADODB.Command") '建立命令对象<br />
Set rst= Server.CreateObject("ADODB.Recordset") '建立记录集对象<br />
cmdTemp.CommandText = "Customers "<br />
cmdTemp.CommandType = 2<br />
Set cmdTemp.ActiveConnection = DataConn<br />
rst.Open cmdTemp, , 1, 3 '生成查询结果<br />
%&gt;</p>
<p>此时，Customers为视图，从视图中查询数据与从基表中查询数据的方法是相同的。</p>
<p>3.调用数据库存储过程</p>
<p>&lt;%<br />
Set Dataconn = Server.CreateObject("ADODB.Connection") '建立连接对象<br />
Dataconn.Open "DSN=SinoTrans;SERVER=APP_SERVER;UID=sa;<br />
PWD=;APP=Microsoft (R) Developer Studio;WSID=APP_SERVER;Regional=Yes"<br />
Set cmdTemp = Server.CreateObject("ADODB.Command") '建立命令对象<br />
Set rst = Server.CreateObject("ADODB.Recordset") '建立记录集对象<br />
cmdTemp.CommandText = "dbo.pd_test" '存储过程名称<br />
cmdTemp.CommandType = 4 '命令类别为4,表示为存储过程<br />
Set cmdTemp.ActiveConnection = Dataconn<br />
Set tmpParam = cmdTemp.CreateParameter("Return Value", 3, 4, 4)<br />
cmdTemp.Parameters.Append tmpParam<br />
Set tmpParam = cmdTemp.CreateParameter("@BeginDate", 135, 1, 16, riqi)<br />
'创建输入参数对象<br />
cmdTemp.Parameters.Append tmpParam<br />
rst.Open cmdTemp, , 1, 3    '生成查询结果<br />
%&gt;</p>
<p>这里调用的存储过程为pd_test，这种是ADO中提供的标准方法，但存在一个问题，就是当在存储过程中有两个以上的SELECT语句，但 从逻辑上又不可能同时执行的时候，ADO会提示你存储过程中SELECT语句太多，解决方法是直接用ADO的CONNECTION对象的EXECUTE方 法直接执行存储过程，如下：</p>
<p>&lt;%<br />
Set Dataconn = Server.CreateObject("ADODB.Connection") '建立连接对象<br />
Dataconn.Open "DSN=SinoTrans;SERVER=APP_SERVER;UID=sa;PWD=;<br />
APP=Microsoft (R) Developer Studio;WSID=APP_SERVER;Regional=Yes"<br />
ss = "EXECUTE dbo.pd_test " &amp; "'" &amp; riqi1 &amp; "'"<br />
Set rs = dataconn.Execute(ss)<br />
%&gt;</p>
<p>有关ASP和ADO使用的详细信息，请参阅 Microsoft ActiveX Data Objects (ADO) 和Active Server Pages（ASP）的详细参考。</p>
<p>五、结束语</p>
<p>在B/S结构的开发中，我们可以把一些商业规则或复杂查询用存储过程在DBMS中编写，然后用ASP中的ADO对象调用，完成原来C/S结构中的传统功能。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/asp-ado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP函数库</title>
		<link>http://www.3code.cn/asp-functions-9/</link>
		<comments>http://www.3code.cn/asp-functions-9/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 10:13:39 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[ASP函数]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1584</guid>
		<description><![CDATA[ASP函数库]]></description>
			<content:encoded><![CDATA[<p>'**************************************************<br />
'函数ID：0043[解密字符加解密]<br />
'函数名：exmw<br />
'作 用：解密字符加解密<br />
'参 数：nmw  ---- 加密的字符<br />
'返回值：解密加密后的字符<br />
'示 例：<br />
'**************************************************<br />
Public Function exmw(ByVal nmw)<br />
exmw=""<br />
On Error GoTo 0<br />
On Error Resume Next<br />
Dim keya,keyb,newStr,temp<br />
nmw=DecodeCookie(nmw)<br />
keya=Mid(nmw,2,1)<br />
keyb=Mid(nmw,1,1)<br />
bLowChr=ChrB(AscB(MidB(keya, 1, 1)) Xor 128)<br />
bHigChr=ChrB(AscB(MidB(keya, 2, 1)) Xor 18)<br />
keya=bLowChr &amp; bHigChr<br />
bLowChr=ChrB(AscB(MidB(keyb, 1, 1)) Xor 100)<br />
bHigChr=ChrB(AscB(MidB(keyb, 2, 1)) Xor 20)<br />
keyb=bLowChr &amp; bHigChr<br />
Str=StrReverse(Mid(nmw,3,len(nmw)))<br />
newStr=""<br />
temp=""<br />
For i=1 to len(Str)<br />
temp=Mid(Str,i,1)<br />
bLowChr=AscB(MidB(temp, 1, 1)) Xor asc(keya)<br />
bHigChr=AscB(MidB(temp, 2, 1)) Xor asc(keyb)<br />
newStr=newStr &amp; ChrB(bLowChr) &amp; ChrB(bHigChr)<br />
Next<br />
If Err.Number = 0 Then<br />
exmw=newStr<br />
End If<br />
On Error GoTo 0<br />
End Function<br />
'**************************************************<br />
'函数ID：0044[创建数据表]<br />
'函数名：CreatTable<br />
'作 用：创建数据表<br />
'参 数：ConnStrs    ---- 数据库链接字串<br />
'参 数：Tabnamestr  ---- 数据表名称<br />
'参 数：CvArrstr    ---- 字段表 (写法： Fname1#Type#Len#Defvalue|Fname1#Type#Len#Defvalue|...) 最后一个不要写“|”<br />
'参 数：SqlType     ---- Sql语句类型 (0 Access 1 Mssqlserver)<br />
' Fname,Type,Len,Defvalue 说明：字段名称,字段类型,字段长度,默认值<br />
'字段类型 Type C/c 字符 T/t 文本 I/i 二进制 D/d 日期 M/m 关键字(字符型) A/a 关键字自动编号(数值型) N/n 数值(float) Z/z 数值(int)<br />
'返回值：如果建立成功返回 True 否则 False<br />
'示 例：CreatTable(basicDB(3),"cs","fa#t##|fb#c#20#a|fc#n##5",0)<br />
'**************************************************<br />
Public Function CreatTable(ByVal ConnStrs,ByVal Tabnamestr,ByVal CvArrstr,ByVal SqlType)<br />
CreatTable=False<br />
On Error GoTo 0<br />
On Error Resume Next<br />
Dim filsarry,NeFilarry,Filstr,spfstr,templx,def_kh_l,def_kh_r,TempSqlStr<br />
def_kh_l=""<br />
def_kh_r=""<br />
Filstr=""<br />
spfstr=""<br />
TempSqlStr=""<br />
filsarry=Split(CvArrstr,"|")<br />
For ai = LBound(filsarry) To UBound(filsarry)<br />
NeFilarry=Split(filsarry(ai),"#")<br />
templx=""<br />
If UCase(NeFilarry(1))="C" Then templx="varchar(" &amp; NeFilarry(2) &amp; ")"<br />
If UCase(NeFilarry(1))="T" Then templx="TEXT"<br />
If UCase(NeFilarry(1))="I" Then templx="image"<br />
If UCase(NeFilarry(1))="D" Then templx="datetime"<br />
If UCase(NeFilarry(1))="M" Then templx="varchar(" &amp; NeFilarry(2) &amp; ") NOT NULL PRIMARY KEY"<br />
If UCase(NeFilarry(1))="A" Then templx="Int IDENTITY (1,1) NOT NULL PRIMARY KEY"<br />
If UCase(NeFilarry(1))="N" Then templx="Float"<br />
If UCase(NeFilarry(1))="Z" Then templx="Int"<br />
If SqlType =1 Then<br />
def_kh_l="('"<br />
def_kh_r="')"<br />
End If<br />
If Trim(NeFilarry(3))&lt;&gt;"" Then templx=templx &amp;" DEFAULT " &amp; def_kh_l &amp; Trim(NeFilarry(3)) &amp; def_kh_r<br />
If ai&lt;&gt;UBound(filsarry) Then<br />
spfstr= spfstr &amp; "[" &amp; NeFilarry(0) &amp; "] " &amp; templx &amp;","<br />
Else<br />
spfstr= spfstr &amp; "[" &amp; NeFilarry(0) &amp; "] " &amp; templx<br />
End If<br />
Next<br />
TempSqlStr="CREATE TABLE ["&amp;Trim(Tabnamestr)&amp;"] (" &amp; spfstr &amp; ")"<br />
set fu_Conn=server.createobject("ADODB.Connection")<br />
fu_Conn.open ConnStrs<br />
fu_Conn.Execute TempSqlStr<br />
fu_Conn.Close<br />
Set fu_Conn=Nothing<br />
If Err.Number = 0 Then<br />
CreatTable=True<br />
End If<br />
On Error GoTo 0<br />
End Function<br />
'**************************************************<br />
'函数ID：0045[在数据库中插入字段值]<br />
'函数名：InterTbValue<br />
'作 用：创建数据表<br />
'参 数：ConnStrs    ---- 数据库链接字串<br />
'参 数：Tabnamestr  ---- 数据表名称<br />
'参 数：CvArrstr    ---- 字段表 (写法： Fname1#Value|Fname2#Value|...) 最后一个不要写“|”<br />
'参 数：SqlType     ---- Sql语句类型 (0 Access 1 Mssqlserver)<br />
' Fname,Value 说明：字段名称,字段值<br />
'返回值：如果插入成功返回 True 否则 False<br />
'示 例：InterTbValue(basicDB(3),"cs","fa#t|fb#c|fc#n#")<br />
'**************************************************<br />
Public Function InterTbValue(ByVal ConnStrs,ByVal Tabnamestr,ByVal CvArrstr,ByVal SqlType)<br />
InterTbValue=False<br />
On Error GoTo 0<br />
On Error Resume Next<br />
Dim def_kh_l,def_kh_r,Filarray,Valuearray,Temparraya,Temparrayb,TempSqlStr1<br />
def_kh_l  =""<br />
def_kh_r  =""<br />
Temparraya=Split(CvArrstr,"|")<br />
For fai = LBound(Temparraya) To UBound(Temparraya)<br />
Temparrayb=Split(Temparraya(fai),"#")<br />
If (fai&lt;&gt; UBound(Temparraya)) Then<br />
Filarray  =Filarray &amp; "[" &amp; Temparrayb(0) &amp; "],"<br />
Valuearray=Valuearray &amp; "'" &amp; Temparrayb(1) &amp; "',"<br />
Else<br />
Filarray  =Filarray &amp; "[" &amp; Temparrayb(0) &amp; "]"<br />
Valuearray=Valuearray &amp; "'" &amp; Temparrayb(1) &amp; "'"<br />
End If<br />
Next<br />
TempSqlStr1="INSERT INTO [" &amp; Tabnamestr &amp; "] (" &amp; Filarray &amp; ") VALUES (" &amp; Valuearray &amp; ")"<br />
set fu1_Conn=server.createobject("ADODB.Connection")<br />
fu1_Conn.open ConnStrs<br />
fu1_Conn.Execute TempSqlStr1<br />
fu1_Conn.Close<br />
Set fu1_Conn=Nothing<br />
If Err.Number = 0 Then<br />
InterTbValue=True<br />
End If<br />
On Error GoTo 0<br />
End Function<br />
'**************************************************<br />
'函数ID：0046[Cookie防乱码写入时用]<br />
'函数名：CodeCookie<br />
'作 用：Cookie防乱码写入时用<br />
'参 数：str  ---- 字符串<br />
'返回值：整理后的字符串<br />
'示 例：<br />
'**************************************************<br />
Public Function CodeCookie(str)<br />
If isNumeric(str) Then str=Cstr(str)<br />
Dim newstr<br />
newstr=""<br />
For i=1 To Len(str)<br />
newstr=newstr &amp; ascw(mid(str,i,1))<br />
If i&lt;&gt; Len(str) Then newstr= newstr &amp; "a"<br />
Next<br />
CodeCookie=newstr<br />
End Function<br />
'**************************************************<br />
'函数ID：0047[Cookie防乱码读出时用]<br />
'函数名：DecodeCookie<br />
'作 用：Cookie防乱码读出时用<br />
'参 数：str  ---- 字符串<br />
'返回值：整理后的字符串<br />
'示 例：<br />
'**************************************************<br />
Public Function DecodeCookie(str)<br />
DecodeCookie=""<br />
Dim newstr<br />
newstr=Split(str,"a")<br />
For i = LBound(newstr) To UBound(newstr)<br />
DecodeCookie= DecodeCookie &amp; chrw(newstr(i))<br />
Next<br />
End Function<br />
'**************************************************<br />
'函数ID：0048[检测用户名和密码是否正确]<br />
'函数名：DecodeCookie<br />
'作 用：检测用户名和密码是否正确<br />
'参 数：ConnStrs    ---- 数据库链接字串<br />
'参 数：Tabnamestr  ---- 数据表名称<br />
'参 数：Tumc        ---- 用户名称字段名称<br />
'参 数：Cumc        ---- 用户名称<br />
'参 数：TCumm       ---- 用户密码字段名称<br />
'参 数：Cumm        ---- 用户密码<br />
'参 数：TUid        ---- 用户ID（标识）字段名称<br />
'返回值：检测成功返回 用户ID 否则 空字符串<br />
'示 例：<br />
'**************************************************<br />
Public Function CKUSMCMM(ByVal ConnStrs,ByVal Tabnamestr,ByVal Tumc,ByVal Cumc,ByVal Tumm,ByVal Cumm,ByVal TUid)<br />
CKUSMCMM=""<br />
On Error GoTo 0<br />
On Error Resume Next<br />
Set sfu_Conn=server.createobject("ADODB.Connection")<br />
Set sfu_Rs  =server.createobject("ADODB.Recordset")<br />
sfu_Conn.open ConnStrs<br />
sfu_sql_str="select " &amp; TUid &amp; "," &amp; Tumc &amp; "," &amp; Tumm &amp; " from " &amp; Tabnamestr<br />
sfu_Rs.open sfu_sql_str,sfu_Conn,1,1<br />
If sfu_Rs.RecordCount &gt;0 Then<br />
Do While Not sfu_Rs.Eof<br />
If (sfu_Rs(Tumc)=Cumc) AND (exmw(sfu_Rs(Tumm))=Cumm) Then<br />
CKUSMCMM=sfu_Rs(TUid)<br />
Exit Do<br />
End If<br />
sfu_Rs.MoveNext<br />
Loop<br />
End If<br />
sfu_Rs.Close<br />
sfu_Conn.Close<br />
Set sfu_Rs = Nothing<br />
Set sfu_Conn=Nothing<br />
On Error GoTo 0<br />
End Function<br />
'**************************************************<br />
'函数ID：0049[生成时间的整数]<br />
'函数名：GetMyTimeNumber()<br />
'作 用：生成时间的整数<br />
'参 数：lx  ---- 时间整数的类型<br />
' lx=0 到分钟 lx=1 到小时 lx=2 到天 lx=3 到月<br />
'返回值：生成时间的整数值(最小到分钟)<br />
'示 例：<br />
'**************************************************<br />
Public Function GetMyTimeNumber(lx)<br />
If lx=0 Then GetMyTimeNumber=Year(Date)*12*30*24*60+Month(Date)*30*24*60+Day(Date)*24*60+Hour(Time)*60+Minute(Time)<br />
If lx=1 Then GetMyTimeNumber=Year(Date)*12*30*24+Month(Date)*30*24+Day(Date)*24+Hour(Time)<br />
If lx=2 Then GetMyTimeNumber=Year(Date)*12*30+Month(Date)*30+Day(Date)<br />
If lx=3 Then GetMyTimeNumber=Year(Date)*12+Month(Date)<br />
End Function<br />
'**************************************************<br />
'函数ID：0050[获得栏目的所有子栏目字符串并用","隔开]<br />
'函数名：GTLMfunLM<br />
'作 用：获得栏目的所有子栏目字符串并用","隔开<br />
'参 数：LMid          ---- 栏目代码<br />
'参 数：ConnStrArray  ---- 栏目数据链接串<br />
'返回值：子栏目字符串并用","隔开<br />
'示 例：hh="数据表链接字串|父栏目字段名|栏目字段名|表名"<br />
'示 例：GTLMfunLM(22,basicDB(3) &amp; "|FTitId|TitId|TITS")<br />
'**************************************************<br />
Public Function GTLMfunLM(ByVal LMid,ByVal ConnStrArray)<br />
Dim LMstrxx,zdbz,Nlm<br />
zdbz=False<br />
LMstrxx=""<br />
aTempstr=GTLMfunLM_whil(LMid,ConnStrArray)<br />
LMstrxx=LMstrxx &amp; aTempstr<br />
If InStrRev(aTempstr,",") &gt; 0 Then<br />
Do While Not zdbz<br />
bTempstr=GTLMfunLM_Fj(aTempstr,ConnStrArray)<br />
LMstrxx=LMstrxx &amp; bTempstr<br />
If bTempstr="" Then zdbz=True<br />
aTempstr=bTempstr<br />
Loop<br />
Else<br />
LMstrxx=aTempstr<br />
End If<br />
LMstrxx=Trim(LMstrxx)<br />
If LMstrxx&lt;&gt;"" Then If Mid(LMstrxx,Len(LMstrxx),1) = ","  Then LMstrxx=Mid(LMstrxx,1,Len(LMstrxx)-1)<br />
GTLMfunLM=LMstrxx<br />
End Function<br />
Public Function GTLMfunLM_whil(ByVal LMidstr,ByVal ConnStrArray)<br />
ppTemp=Split(ConnStrArray,"|")<br />
GTLMfunLM_whil=""<br />
Set telm_Conn=server.createobject("ADODB.Connection")<br />
Set telm_Rs  =server.createobject("ADODB.Recordset")<br />
telm_Conn.open ppTemp(0)<br />
telm_sql_str="SELECT " &amp; ppTemp(1) &amp; "," &amp; ppTemp(2) &amp; " FROM " &amp; ppTemp(3) &amp; " WHERE (" &amp; ppTemp(1) &amp; "='" &amp; LMidstr &amp; "')"<br />
telm_Rs.open telm_sql_str,telm_Conn,1,1<br />
If telm_Rs.RecordCount &gt;0 Then<br />
Do While Not telm_Rs.Eof<br />
GTLMfunLM_whil=GTLMfunLM_whil &amp; Trim(telm_Rs(ppTemp(2))) &amp; ","<br />
telm_Rs.MoveNext<br />
Loop<br />
End If<br />
telm_Rs.Close<br />
telm_Conn.Close<br />
Set telm_Rs = Nothing<br />
Set telm_Conn=Nothing<br />
End Function<br />
Public Function GTLMfunLM_Fj(ByVal str,ByVal ConnStrArray)<br />
Dim templjid<br />
templjid=""<br />
If Trim(str)&lt;&gt;"" Then<br />
fjTemp=Split(str,",")<br />
For i = LBound(fjTemp) To UBound(fjTemp)<br />
If Trim(fjTemp(i))&lt;&gt;"" Then<br />
templjid=templjid &amp; GTLMfunLM_whil(fjTemp(i),ConnStrArray)<br />
End If<br />
Next<br />
End If<br />
GTLMfunLM_Fj=templjid<br />
End Function</p>
<p>%&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/asp-functions-9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP使用MYSQL数据库全攻略</title>
		<link>http://www.3code.cn/asp-mysql/</link>
		<comments>http://www.3code.cn/asp-mysql/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 10:10:04 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[asp数据库]]></category>
		<category><![CDATA[PHP数据库操作]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1579</guid>
		<description><![CDATA[MYSQL数据库以它短小、方便、速度快、免费等优点成为很多网站目前首选数据库，但一般都是用PHP+MYSQL相结合来开发各种动态页面，其实ASP也可以使用MYSQL数据库开发动态页面，小弟我也是刚刚学会，不敢独享，所以特写了这篇文章供大伙参考。]]></description>
			<content:encoded><![CDATA[<p>MYSQL数据库以它短小、方便、速度快、免费等优点成为很多网站目前首选数据库，但一般都是用PHP+MYSQL相结合来开发各种动态页面，其实ASP也可以使用MYSQL数据库开发动态页面，小弟我也是刚刚学会，不敢独享，所以特写了这篇文章供大伙参考。</p>
<p>我的环境是WINDOWS98+PWS4.0+mysql-3.23.32-win+PHP4<br />
必要的软件：PWS4.0（呵呵，废话）<br />
mysql-3.23.32-win（这个是最新版的）<br />
myodbc-2.50.36-dll（这个是最重要的，MYSQL ODBC的驱动程序，可以到www.mysql.com下载）<br />
第一步：安装MYSQL ODBD的驱动程序，将下载的myodbd-2.50.46-dll文件复制到windows\system目录下(windows2000<br />
是winnt/system32)<br />
然后建立一新文件，扩展名为reg（就是注册表文件）,将以下内容复制到该文件中。<br />
REGEDIT4</p>
<p>[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\myodbc driver]<br />
"UsageCount"=dword:00000002<br />
"Driver"="C:\\WINDOWS\\System\\myodbc.dll"<br />
"Setup"="C:\\WINDOWS\\System\\myodbc.dll"<br />
"SQLLevel"="1"<br />
"FileUsage"="0"<br />
"DriverODBCVer"="02.50"<br />
"ConnectFunctions"="YYY"<br />
"APILevel"="1"<br />
"CpTimeout"="120"<br />
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers]<br />
"myodbc driver"="installed"</p>
<p>保存后双击该文件，将上面代码注册到WINDOWS注册表中。<br />
如果安装在windows2000中,则Driver和Setup主键的值要做相应改变，这里我想就不用多说了。<br />
如果成功，在控制面板/ODBD数据源的驱动程序里将看到myodbd driver这一项！</p>
<p>第二步：建立ASP文件链接数据库。<br />
这里有两种方法，一种是在ODBC数据源中建立一个系统DSN。后来我发现不建立也可以在ASP中使用MYSQL,方<br />
法在下文将讲道。<br />
打开控制面板/ODBD数据源，选择系统DSN,然后添加一个新的DSN,驱动程序选择myodbd driver,会出现一个对<br />
话框供输入mysql<br />
相关信息。<br />
Windows DSN name: 所要建立DSN的名称<br />
Mysql Host (name or ip):Mysql服务器的名称或者是IP地址，通常填localhost<br />
Mysql database name:需要使用数据库的名称，数据库在Mysql管理程序中建立。这里我们使用一个例子。数<br />
据库名：hc188<br />
里面有数据表：user 数据表有两个字段分别是：username和password,随便插入几个<br />
数据。<br />
user:链接数据库的用户名，我填的是root超级用户<br />
password:链接数据库用户密码，如果没有，可以不填<br />
Port(if not 3306)：Mysql在服务器的端口，如果不填默认为3306<br />
SQL command on connect:使用sql命令链接数据库，这项可以不填<br />
填写完毕后选择OK保存。</p>
<p>下面链接数据库的ASP代码！</p>
<p>&lt;%<br />
strConnection = "dsn=hc188;driver={myodbd driver};server=localhost;uid=root;pwd=;database=hc188"<br />
Set adoDataConn = Server.CreateObject("ADODB.Connection")<br />
adoDataConn.Open strConnection</p>
<p>strQuery = "SELECT * FROM user"<br />
Set rs = adoDataConn.Execute(strQuery)<br />
If Not rs.BOF Then<br />
%&gt;<br />
&lt;TABLE&gt;<br />
&lt;TR&gt;<br />
&lt;TD&lt;b&gt;username&lt;/b&gt;&lt;/TD&gt;<br />
&lt;TD&gt;&lt;b&gt;password&lt;/b&gt;&lt;/TD&gt;<br />
&lt;/TR&gt;<br />
&lt;%<br />
Do While Not rs.EOF<br />
%&gt;<br />
&lt;TR&gt;<br />
&lt;TD&gt;&lt;%=rs("username")%&gt;&lt;/TD&gt;<br />
&lt;TD&gt;&lt;%=rs("password")%&gt;&lt;/TD&gt;<br />
&lt;/TR&gt;<br />
&lt;%<br />
rs.MoveNext<br />
Loop<br />
%&gt;<br />
&lt;/TABLE&gt;<br />
&lt;%<br />
Else<br />
Response.Write("Sorry, no data found.")<br />
End If</p>
<p>rs.Close<br />
adoDataConn.Close<br />
Set adoDataConn = Nothing<br />
Set rsEmailData = Nothing<br />
%&gt;</p>
<p>第二种方法：我在使用中想过如果不建立系统DSN，是否也可以使用MYSQL数据库呢？结果是可以的。<br />
方法很简单，把上面ASP代码第二行代码改为：<br />
strconnection="DefaultDir=;Driver={myodbc driver};database=hc188"</p>
<p>我奇怪的发现，这种方法连用户名和密码都不需要就可以使用。是不是MYSQL的一个BUG呢？</p>
<p>以上代码全部经测试通过！</p>
<p>到此，全文结束了，是不是很简单呢！希望能帮上你！</p>
<p>做人要厚道，请注明转自酷网动力(www.ASPCOOL.COM)。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/asp-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP删除文件</title>
		<link>http://www.3code.cn/asp-deletefile-2/</link>
		<comments>http://www.3code.cn/asp-deletefile-2/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 18:22:17 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1575</guid>
		<description><![CDATA[ASP删除文件]]></description>
			<content:encoded><![CDATA[<p>set fso = createobject("scripting.filesystemobject")<br />
fso.deletefile(server.mappath("images\download\picture\" &amp; 文件名))<br />
set fso = nothing</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/asp-deletefile-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>概述ASP.NET -事件</title>
		<link>http://www.3code.cn/%e4%ba%8b%e4%bb%b6-asp-net/</link>
		<comments>http://www.3code.cn/%e4%ba%8b%e4%bb%b6-asp-net/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 09:48:57 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[asp.net]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1540</guid>
		<description><![CDATA[概述ASP.NET -事件
Previous Page Next Page 事件句柄（event handler）是一种针对给定事件来执行代码的子例程。

ASP.NET - 事件句柄
请看下面的代码：
<%]]></description>
			<content:encoded><![CDATA[<p><strong>概述ASP.NET -事件</strong><br />
Previous Page Next Page 事件句柄（event handler）是一种针对给定事件来执行代码的子例程。<br />
<strong></strong></p>
<p><strong>ASP.NET - 事件句柄</strong><br />
请看下面的代码：<br />
&lt;%<br />
lbl1.Text="The date and time is " &amp; now()<br />
%&gt;<br />
&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;form runat="server"&gt;<br />
&lt;h3&gt;&lt;asp:label id="lbl1" runat="server" /&gt;&lt;/h3&gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;上面的代码什么时候会被执行？答案是：“我不知道. . .”<br />
Page_Load 事件<br />
Page_Load 事件是众多 ASP.NET 可理解的事件之一。Page_Load 事件会在页面加载时被触发，然后 ASP.NET 会自动调用子例程 Page_Load，并执行其中的代码：<br />
&lt;script runat="server"&gt;<br />
Sub Page_Load<br />
lbl1.Text="The date and time is " &amp; now()<br />
End Sub<br />
&lt;/script&gt;</p>
<p>&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;form runat="server"&gt;<br />
&lt;h3&gt;&lt;asp:label id="lbl1" runat="server" /&gt;&lt;/h3&gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;注释：该 Page_Load 事件不包含对象引用或事件参数！</p>
<p><strong>Page.IsPostBack 属性</strong><br />
Page_Load 子例程会在页面每次加载时运行。如果您仅希望在页面第一次加载时执行 Page_Load 子例程中的代码，您可以使用 Page.IsPostBack 属性。如果 Page.IsPostBack 属性为 false，则页面第一次被载入，如果为 true，则页面传回服务器（例如，通过点击表单上的按钮）：</p>
<p>&lt;script runat="server"&gt;<br />
Sub Page_Load<br />
if Not Page.IsPostBack then<br />
lbl1.Text="The date and time is " &amp; now()<br />
end if<br />
End Sub</p>
<p>Sub Submit(s As Object, e As EventArgs)<br />
lbl2.Text="Hello World!"<br />
End Sub<br />
&lt;/script&gt;</p>
<p>&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;form runat="server"&gt;<br />
&lt;h3&gt;&lt;asp:label id="lbl1" runat="server" /&gt;&lt;/h3&gt;<br />
&lt;h3&gt;&lt;asp:label id="lbl2" runat="server" /&gt;&lt;/h3&gt;<br />
&lt;asp:button text="Submit" onclick="submit" runat="server" /&gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;上面的例子仅在页面初次加载时创建 "The date and time is...." 这条消息。当用户点击 Submit 按钮时，submit 子例程将在第二个 label 创建 "Hello World!"，但第一个 label 中的日期和时间不会改变。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/%e4%ba%8b%e4%bb%b6-asp-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>祥解常用Response对象的使用</title>
		<link>http://www.3code.cn/response-use/</link>
		<comments>http://www.3code.cn/response-use/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 02:39:47 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1419</guid>
		<description><![CDATA[祥解常用Response对象的使用
每一个程序语言或开发工具都有一定的函数与用户进行沟通，Asp同样如此。在Asp中负责将信息传递给用户的对象就是Response对象。 Response对象用于动态响应客户端请求（Request），并将动态生成的响应结果返回到客户端浏览器中，使用Response对象可以直接发送信息给浏览器、重定向浏览器到另一个 URL 或设置 cookie 的值等等。 Response对象在asp编程中非常广泛，也是一种非常好用的工具。下面我们来具体看看Response对象]]></description>
			<content:encoded><![CDATA[<p><strong>祥解常用Response对象的使用</strong><br />
每一个程序语言或开发工具都有一定的函数与用户进行沟通，Asp同样如此。在Asp中负责将信息传递给用户的对象就是Response对象。Response对象用于动态响应客户端请求（Request），并将动态生成的响应结果返回到客户端浏览器中，使用Response对象可以直接发送信息给浏览器、重定向浏览器到另一个 URL 或设置 cookie 的值等等。 Response对象在asp编程中非常广泛，也是一种非常好用的工具。下面我们来具体看看Response对象：<br />
<strong>语法:</strong><br />
<strong>Response.collection|property|method<br />
一、集合</strong><br />
Response 对象只有一个集合 --Cookies，Cookies数据集合允许将数据设置在客户端的浏览器中。若指定的 cookie 不存在，则创建它。若存在，则自动更新数据。<br />
<strong>语法:</strong>Response.Cookies(Cookie)[Key.Attribute]<br />
这里的 cookie 是指定 cookie 的名称。而如果指定了 key，则该 cookie 就是一个字典。attribute 指定 cookie 自身的有关信息。attribute 参数可以是下列之一 :<br />
Domain 只写。若被指定，则 cookie 将被发送到对该域的请求中去。<br />
Expires 只写。指定 cookie 的过期日期。为了在会话结束后将 cookie 存储在客户端磁盘上，必须设置该日期。若此项属性的设置未超过当前日期，则在任务结束后 cookie 将到期。<br />
HasKeys 只读。指定 cookie 是否包含关键字。<br />
Path 只写。若被指定，则 cookie 将只发送到对该路径的请求中。如果未设置该属性，则使用应用程序的路径。<br />
Secure 只写。指定Cookie是否安全。<br />
<strong>示例：</strong><br />
&lt;%<br />
Response.Cookies("wrclub")("weburl")="http://www.wrclub.net"<br />
Response.Cookies("wrclub").path="/wrclub/"<br />
Response.Cookies("wrclub").Expires=#2003-11-30#<br />
%&gt;</p>
<p><strong>二、方法</strong><br />
Response.AddHeader Name,Value<br />
向应答中添加一个新的HTML标题。Name为新HTML标题的名称。Value为该头变量的值。你可以添加任何名称和任何值的HTML标题。它并不替代现有的同名标题。一旦标题被添加，将不能删除。<br />
Response.AppendToLog String<br />
向Web服务器的日志条目的末尾添加一字符串。String为要添加到日志文件中的字符串。<br />
Response.BinaryWrite Data<br />
该方法可以不经任何字符转换就将制定的信息写到HTTP输出，主要用于写非字符串信息（如客户端应用程序所需的二进制数据等）。Data是要发送的数据。<br />
Response.Clear<br />
删除缓冲区的所有HTML输出，但只删除响应正文而不删除响应标题。可以用该方法处理错误情况。需要注意的是，如果Response.Buffer设置为True，则该方法将导致运行是错误。<br />
Response.End<br />
强迫Web服务器停止执行更多的脚本，并发送当前结果，文件中剩余的内容将不被处理。如果Response.Buffer设置为True，则调用Response.end将缓冲输出。<br />
Response.Flush<br />
对于一个缓冲的回应，发送所有的缓冲信息。如果Response.Buffer设置为True，则该方法将导致运行是错误。<br />
Response.Redirect URL<br />
将客户端的浏览器重定向到一个新的Internet地址。Url为新网页的Internet地址。<br />
Response.Write Variant<br />
Response.Write是Response对象最常用的方法，该方法可以向浏览器发送字符串。Variant是一字符串或一个具有字符串值的变量。<br />
<strong><br />
三、属性</strong><br />
Response.Buffer<br />
缓冲一Active Server Page。回应只到某一页结束或Response.Flush或Response.End方法调用时才发送出去。服务器将输出送给客户端后就不能再设置Buffer属性。<br />
Response.CacheControl<br />
指明是否Proxy服务器能缓存Active Server Page。缺省时，其值为FALSE 。当设置其属性为Public时，Proxy服务器可以缓冲由Asp产生的输出。<br />
Response.CharSet(Charsetname)<br />
将字符集名称（如GB）附加到Response对象中content-type标题的后面，用来设置web服务器响应给客户端的文件字符编码。一个可能的值为“ISO_LATIN_1”。<br />
Response.ContentType<br />
指明回应内容的类型。可能的值为text/plain和image/GIF，默认值text/HTML。<br />
Response.Expires<br />
浏览器可以缓存当前页的时间长度，以分钟为单位。</p>
<p>Response.ExpiresAbsolute<br />
浏览器不能再缓存当前页的日期和时间。在未到期之前，可以返回。如果未指定时间，该主页在当天午夜到期；如果未指定日期，则到当天指定时间到期。</p>
<p>True/False = Response.IsClientConnected<br />
属性为只读，指明自上次调用Response.Write之后，客户端是否仍然和服务器连接。该属性允许用户在客户端和服务器没有联接的情况下有更多的控制。例如，在从客户端提出请求起到服务器做出相应，其间要用去很长一段时间的情况下，这就可能有助于确保在继续处理脚本之前客户端仍是连通的。具有值TRUE或FALSE。</p>
<p>Response.PICS (PICS 字符串)<br />
用于添加网页的PICS等级。PICS级别指明某一网页的内容级别，比如暴力或色情的程度等。<br />
Response.Status = "状态描述字符串"<br />
用来设置Web服务器要响应的状态行的值。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/response-use/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP Response.Buffer详细介绍</title>
		<link>http://www.3code.cn/asp-response-buffer/</link>
		<comments>http://www.3code.cn/asp-response-buffer/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 06:11:31 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1519</guid>
		<description><![CDATA[缓冲区是存储一系列的数据的地方，客户端所获得的数据可以从程序的执行结果直接输出，也可以从缓冲区输出。但是这两种方式在速度上是有差异的：在web 中，当一个asp程序被请求的次数不多时，二者基本上没有什么差异，至少我们感觉不出来。但是当有很多人请求一个asp程序时，速度可就不一样了。如果没有缓冲区，那么每个请求asp程序的人的客户端所得到的结果都是asp程序执行一次所得到的结果，而如果预先将asp程序缓冲，那么每个客户端所得到的结果就是缓冲区的结果，不是执行一次程序的结果。比如有1000个用户同时访问一个asp页面，如果这个asp程序没有缓冲，那么程序将被执行一千次，这样服务器的负荷就回加大，从而导致客户端打开页面速度变慢；如果这个asp程序被缓冲了，那么结果就不一样了，每个客户端直接从缓冲区获得数据，服务器将不会因为访问增加而增加程序执行次数，因此客户端打开页面的速度也就比上一种情况要快。这就是Buffer的好处。]]></description>
			<content:encoded><![CDATA[<p><strong>一、Buffer</strong></p>
<p>Buffer从英文直译过来的意思是“缓冲区”，这里我们将它称为缓冲，因为它不仅是个名词，还是个动词。</p>
<p>缓冲区是存储一系列的数据的地方，客户端所获得的数据可以从程序的执行结果直接输出，也可以从缓冲区输出。但是这两种方式在速度上是有差异的：在web 中，当一个asp程序被请求的次数不多时，二者基本上没有什么差异，至少我们感觉不出来。但是当有很多人请求一个asp程序时，速度可就不一样了。如果没有缓冲区，那么每个请求asp程序的人的客户端所得到的结果都是asp程序执行一次所得到的结果，而如果预先将asp程序缓冲，那么每个客户端所得到的结果就是缓冲区的结果，不是执行一次程序的结果。比如有1000个用户同时访问一个asp页面，如果这个asp程序没有缓冲，那么程序将被执行一千次，这样服务器的负荷就回加大，从而导致客户端打开页面速度变慢；如果这个asp程序被缓冲了，那么结果就不一样了，每个客户端直接从缓冲区获得数据，服务器将不会因为访问增加而增加程序执行次数，因此客户端打开页面的速度也就比上一种情况要快。这就是Buffer的好处。</p>
<p><strong>二、如何将asp程序缓冲</strong></p>
<p>这个问题其实很简单，只要在asp程序的第一行加上：<br />
&lt;% Response.Buffer = True %&gt;<br />
就可以了。<br />
这句话的意思就是指明输出页面是否被缓冲，当属性值为True时，服务器将不会向客户端发送任何信息，直到所有程序执行完或者遇到<br />
&lt;% Response.Flush %&gt;或&lt;% Response.End %&gt;<br />
语句，才会释放缓冲区的信息。</p>
<p>运用:提高用户体验<br />
这样我们在运行需要进行复杂运算或循环次数多的程序时,就可又用&lt;% Response.Flush %&gt;输出缓冲区的信息,一边运行一边输出,减少用户等待时间.增强用户体验.</p>
<p><strong>三、总结</strong></p>
<p>Response 的Buffer属性虽然能够提高页面显示速度，但是也要分什么情况。如果你正在制作一个普通的个人主页，访问量不是很高，并且没有什么复杂的执行程序，那么用不用这个属性就不是很重要，因为将数据缓冲也需要一段时间，只不过我们感觉不到罢了；但是如果你正在制作一个大型论坛或者一个产品展示或其他的商务站点，并且访问量很高，那么我建议在程序的第一行加入<br />
&lt;% Response.Buffer = True %&gt;<br />
这句话，因为这样能够让客户在有效的时间内获得更多的数据。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/asp-response-buffer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP判断cookie是否开启</title>
		<link>http://www.3code.cn/asp-cookie-use/</link>
		<comments>http://www.3code.cn/asp-cookie-use/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 06:09:12 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1517</guid>
		<description><![CDATA[判断方法一：
无论何时你在两页之间，有一个非常简单可靠的方法：请求一个SessionID在第一页，传递它到下一页。与这一页请求到的SessionID比较。相同说明客户端浏览器接受Cookies;不同则不接受。很简单吧。
比如你可以在第一页中放一个(hidden field)，并把SessionID写入它。提交后，从页面数据中取出SessionID．像这样：]]></description>
			<content:encoded><![CDATA[<p>判断方法一：<br />
无论何时你在两页之间，有一个非常简单可靠的方法：请求一个SessionID在第一页，传递它到下一页。与这一页请求到的SessionID比较。相同说明客户端浏览器接受Cookies;不同则不接受。很简单吧。<br />
比如你可以在第一页中放一个(hidden field)，并把SessionID写入它。提交后，从页面数据中取出SessionID．像这样：<br />
&lt;form name="Form1" method="post" action="sessions2.asp"&gt;<br />
UserName:&lt;input name="username"&gt;&lt;br&gt;<br />
Password:&lt;input name="userpassword"&gt;<br />
&lt;input type="hidden" name="theSessionID" value="&lt;%=Session.SessionID%&gt;"&gt;&lt;br&gt;<br />
&lt;input type="submit" value="Submit"&gt;<br />
&lt;/form&gt;<br />
在第二页中我们来判断SessionID是否相同。<br />
&lt;%<br />
dim theSessionID<br />
theSessionID = Request.Form("theSessionID")<br />
If theSessionID = Session.SessionID Then<br />
"当二者相等时，则cookie功能开启<br />
Response.Write "Cookie已开启"<br />
Else<br />
"若二者相等时，则cookie功能关闭<br />
Response.Write "Cookie没有开启!"<br />
End If<br />
%&gt;</p>
<p>判断方法二：<br />
也可用这种方法，首先在一个页面里写入一个cookie，如:<br />
&lt;%<br />
Response.Cookies("status")="onoroff"<br />
%&gt;<br />
在第二页里读出此cookie：<br />
&lt;%<br />
if Request.Cookies("status")="" then<br />
"当cookies("status")里没有值时，则cookie功能没有开启<br />
Response.Write "Cookie没有开启!"<br />
else<br />
"当cookies("status")里有值时，则cookie功能开启<br />
Response.Write "Cookie已开启"<br />
end if<br />
%&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/asp-cookie-use/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>怎样用ASP实现网上“五子棋”大赛</title>
		<link>http://www.3code.cn/asp_exaple/</link>
		<comments>http://www.3code.cn/asp_exaple/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 15:21:20 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1514</guid>
		<description><![CDATA[怎样用ASP实现网上“五子棋”大赛

“五子棋”是大家都非常熟悉的一种益智类游戏，相关的游戏软件也非常多，在此我向大家隆重推出一款新的纯“网络版”的五子棋，它利用ASP做为开发环境，因此在Internet上对战的时候无需下载客户端软件，只要你有一个浏览器就可以了。你也可以在局域网上进行这个游戏。
游戏的过程是这样的，我们首先登录，然后可以选择战场，有“金星”、“木星”、“水星”、“火星”、“土星”等五个战场，如果你自认为是一个高手，可以选择金星，否则可以依次选择其它几个星球做为战场。如果这个星]]></description>
			<content:encoded><![CDATA[<p><strong>怎样用ASP实现网上“五子棋”大赛</strong></p>
<p><strong>“五子棋”</strong>是大家都非常熟悉的一种益智类游戏，相关的游戏软件也非常多，在此我向大家隆重推出一款新的纯“网络版”的五子棋，它利用ASP做为开发环境，因此在Internet上对战的时候无需下载客户端软件，只要你有一个浏览器就可以了。你也可以在局域网上进行这个游戏。<br />
游戏的过程是这样的，我们首先登录，然后可以选择战场，有“金星”、“木星”、“水星”、“火星”、“土星”等五个战场，如果你自认为是一个高手，可以选择金星，否则可以依次选择其它几个星球做为战场。如果这个星球上没有擂主，你就应该以擂主的身份进入，然后别人就可以和你进行对战了。当然，如果所有的星球上都已经开始了战争，那么你就只能等一会儿了。<br />
如果你是以擂主身份进入的，你可以等待别人来和你对战，如果你是以攻擂手的身份登录，你可以很快的和擂主展开战斗。开始战斗后，由擂主执黑先行，然后由攻擂手出招，如此这般。当最后决出胜负的时候，会有相应的提示。<br />
该站点有几个主要的文件是：<br />
Index.asp 登录文件：<br />
Index0.asp中间文件：<br />
Match.asp 比赛文件：<br />
Back0.jpg white0.jpg black0.jpg 中间用到的图形文件，分别指的棋盘，白子和黑子，如下图：<br />
在程序的初始化的时候，将棋盘上分成若干的表格，将背景图片放入其中，形成一个棋盘，然后在放上一个棋子后，再将图片换上相应的白子或黑子就可以了。<br />
先看看登录文件：<br />
＜%@ Language=VBScript %＞<br />
＜HTML＞<br />
＜HEAD＞<br />
＜META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"＞<br />
＜title＞星球大战之“五子连珠”大赛！＜/title＞<br />
＜/HEAD＞<br />
＜BODY＞</p>
<p>＜p align=center＞＜font size=6＞星球大战＜/font＞＜/P＞<br />
＜table border=1 width=80% align=center＞<br />
＜tr＞＜td＞星球＜/td＞＜td＞擂主＜/td＞＜td＞大战＜/td＞＜td＞攻擂＜/td＞＜/tr＞<br />
＜tr＞<br />
＜td＞金星＜/td＞<br />
＜td＞<br />
＜%<br />
if application("first1")="" then<br />
%＞<br />
＜form action=index0.asp?flag=First1 method=post＞<br />
＜INPUT id=text1 name=txtFirst1 size=10＞＜INPUT id=submit1 name=submit1<br />
type=submit value=进入＞<br />
＜/form＞<br />
＜%<br />
else<br />
response.write application("first1")<br />
end if<br />
%＞<br />
＜/td＞<br />
＜td＞大战＜/td＞<br />
＜td＞<br />
＜%<br />
if application("second1")="" then<br />
%＞</p>
<p>＜form action=index0.asp?flag=second1 method=post＞<br />
＜INPUT id=text1 name=txtSecond1 size=10＞＜INPUT id=submit1<br />
name=submit1 type=submit value=进入＞<br />
＜/form＞<br />
＜%<br />
else<br />
response.write application("Second1")<br />
end if<br />
%＞<br />
＜/td＞<br />
＜/tr＞</p>
<p>＜tr＞<br />
＜td＞木星＜/td＞<br />
＜td＞<br />
＜%<br />
if application("first2")="" then<br />
%＞<br />
＜form action=index0.asp?flag=First2 method=post＞<br />
＜INPUT id=text1 name=txtFirst2 size=10＞＜INPUT id=submit1 name=submit1<br />
type=submit value=进入＞<br />
＜/form＞<br />
＜%<br />
else<br />
response.write application("first2")<br />
end if<br />
%＞<br />
＜/td＞<br />
＜td＞大战＜/td＞<br />
＜td＞<br />
＜%<br />
if application("second2")="" then<br />
%＞</p>
<p>＜form action=index0.asp?flag=second2 method=post＞<br />
＜INPUT id=text1 name=txtSecond2 size=10＞＜INPUT id=submit1<br />
name=submit1 type=submit value=进入＞<br />
＜/form＞<br />
＜%<br />
else<br />
response.write application("Second2")<br />
end if<br />
%＞<br />
＜/td＞<br />
＜/tr＞</p>
<p>＜tr＞<br />
＜td＞金星＜/td＞<br />
＜td＞<br />
＜%<br />
if application("first3")="" then<br />
%＞<br />
＜form action=index0.asp?flag=First3 method=post＞<br />
＜INPUT id=text1 name=txtFirst3 size=10＞＜INPUT id=submit1 name=submit1<br />
type=submit value=进入＞<br />
＜/form＞<br />
＜%<br />
else<br />
response.write application("first3")<br />
end if<br />
%＞<br />
＜/td＞<br />
＜td＞大战＜/td＞<br />
＜td＞<br />
＜%<br />
if application("second3")="" then<br />
%＞</p>
<p>＜form action=index0.asp?flag=second3 method=post＞<br />
＜INPUT id=text1 name=txtSecond3 size=10＞＜INPUT id=submit1<br />
name=submit1 type=submit value=进入＞<br />
＜/form＞<br />
＜%<br />
else<br />
response.write application("Second3")<br />
end if<br />
%＞<br />
＜/td＞<br />
＜/tr＞</p>
<p>＜tr＞<br />
＜td＞金星＜/td＞<br />
＜td＞<br />
＜%<br />
if application("first4")="" then<br />
%＞<br />
＜form action=index0.asp?flag=First4 method=post＞<br />
＜INPUT id=text1 name=txtFirst4 size=10＞＜INPUT id=submit1 name=submit1<br />
type=submit value=进入＞<br />
＜/form＞<br />
＜%<br />
else<br />
response.write application("first4")<br />
end if<br />
%＞<br />
＜/td＞<br />
＜td＞大战＜/td＞<br />
＜td＞<br />
＜%<br />
if application("second4")="" then<br />
%＞</p>
<p>＜form action=index0.asp?flag=second4 method=post＞<br />
＜INPUT id=text1 name=txtSecond4 size=10＞＜INPUT id=submit1<br />
name=submit1 type=submit value=进入＞<br />
＜/form＞<br />
＜%<br />
else<br />
response.write application("Second4")<br />
end if<br />
%＞<br />
＜/td＞<br />
＜/tr＞</p>
<p>＜tr＞<br />
＜td＞金星＜/td＞<br />
＜td＞<br />
＜%<br />
if application("first5")="" then<br />
%＞<br />
＜form action=index0.asp?flag=First5 method=post＞<br />
＜INPUT id=text1 name=txtFirst5 size=10＞＜INPUT id=submit1 name=submit1<br />
type=submit value=进入＞<br />
＜/form＞<br />
＜%<br />
else<br />
response.write application("first5")<br />
end if<br />
%＞<br />
＜/td＞<br />
＜td＞大战＜/td＞<br />
＜td＞<br />
＜%<br />
if application("second5")="" then<br />
%＞</p>
<p>＜form action=index0.asp?flag=second5 method=post＞<br />
＜INPUT id=text1 name=txtSecond5 size=10＞＜INPUT id=submit1<br />
name=submit1 type=submit value=进入＞<br />
＜/form＞<br />
＜%<br />
else<br />
response.write application("Second5")<br />
end if<br />
%＞<br />
＜/td＞<br />
＜/tr＞<br />
＜/table＞<br />
＜/BODY＞<br />
＜/HTML＞</p>
<p>这个文件不用做过多的说明，就是一个大的表格，大家可以从那里进入，如果某个位置已经被使用，则它会变成该大 侠的名字，不允许重复登录。在登录后进入<br />
index0.asp，这是一个中间交换文件，在里面进行一些变量的处理及赋值，然后再进入match.asp，进行正式的比赛。我们来看一下index0.asp的内容：</p>
<p>＜%@ Language=VBScript %＞<br />
＜%<br />
if Request.Form("txt" &amp; request.querystring("flag"))＜＞"" then<br />
'response.write "in!" &amp; ""<br />
session("nice")=Request.Form("txt" &amp; request.querystring("flag"))<br />
'response.write session("nice") &amp; ""<br />
'response.write application(request.querystring("flag"))<br />
if application(request.querystring("flag"))="" then<br />
application(request.querystring("flag"))=session("nice")<br />
session("class")=right(request.querystring("flag"),1)<br />
if left(request.querystring("flag"),1)="f" then<br />
application(session("nice"))=false<br />
elseif left(request.querystring("flag"),1)="s" then<br />
application(session("nice"))=false<br />
application(application("first" &amp; session("class")))=true<br />
end if<br />
Response.Redirect "match.asp"<br />
end if</p>
<p>end if</p>
<p>%＞<br />
＜HTML＞<br />
＜/HTML＞</p>
<p>该程序中，用session(“nice”)来记录您登录的大名，以后的处理中，很多都要用到它，用它来区分很多的用户。如果您是从擂主的位置进入，则您的权利是<br />
first，否则是second，用session("class")来记录位于哪个战场场，“金”“木”<br />
“水”“火”“土”分别表示为1、2、3、4、5，因为有多个战场可能同时开战，如果不能正确地区分开，则可能导致一片混乱。application(session("nice"))是一个逻辑型变量，用真假来表示您是否可以出棋，如果是假，您要等待一个，如果是真，您就可以下棋了。只有一个战场上的两个人都进入了以后，擂主方可以下棋，而且只有当擂主出子以后，攻擂手才可以下棋。准备好以后，下面就进入赛场，请看文件match.asp</p>
<p>＜html＞<br />
＜head＞<br />
＜meta http-equiv="Content-Type" content="text/html; charset=gb2312"＞<br />
＜meta name="GENERATOR" content="Microsoft FrontPage 4.0"＞<br />
＜meta name="ProgId" content="FrontPage.Editor.Document"＞<br />
＜META http-equiv=refresh content=3＞<br />
＜title＞连珠大赛...＜/title＞<br />
＜/head＞<br />
＜%<br />
Response.Write "擂主:" &amp; application("first" &amp; session("class"))<br />
&amp; "    攻擂：" &amp; application("second" &amp; session<br />
("class"))<br />
if Request.QueryString("pos")＜＞"" then<br />
application("pos" &amp; session("class") &amp; Request.QueryString("pos"))<br />
=true<br />
end if<br />
%＞<br />
＜body＞<br />
＜%<br />
'Response.Write application("aaa")<br />
if application("first" &amp; session("class"))=session("nice") then<br />
color="black"<br />
if Request.QueryString("pos")＜＞"" then<br />
if session("last")="" then session("last")="abc"<br />
if session("last")＜＞ Request.QueryString("pos") then<br />
application(application("first" &amp; session("class")))=false<br />
if application("second" &amp; session("class"))＜＞"" then application<br />
(application("second" &amp; session("class")))=true<br />
session("last")=Request.QueryString("pos")<br />
END IF<br />
end if<br />
else<br />
if application("second" &amp; session("class"))=session("nice") then<br />
color="white"<br />
if Request.QueryString("pos")＜＞"" then<br />
'if session("last")="" then session("last")="abc"<br />
if session("last")＜＞ Request.QueryString("pos") then<br />
application(application("first" &amp; session("class")))=true<br />
application(application("second" &amp; session("class")))=false<br />
session("last")=Request.QueryString("pos")<br />
END IF<br />
end if<br />
else<br />
if application("second" &amp; session("class"))="" then<br />
application("second" &amp; session("class"))=session("nice")<br />
color="white"<br />
if Request.QueryString("pos")＜＞"" then<br />
if session("last")="" then session("last")="abc"<br />
if session("last")＜＞ Request.QueryString("pos") then<br />
application(application("first" &amp; session("class")))=true<br />
application(application("second" &amp; session("class")))=false<br />
session("last")=Request.QueryString("pos")<br />
END IF<br />
end if<br />
else<br />
color=""<br />
end if<br />
end if<br />
end if<br />
Response.Write "＜table width=400 height=400 border=0 cellspacing=0<br />
cellpadding=0＞"<br />
for i=1 to 16<br />
Response.Write "＜tr＞"<br />
for j=1 to 16<br />
if application("pos" &amp; session("class") &amp; cstr(i) &amp; "_" &amp; cstr(j))=""<br />
then<br />
application("color" &amp; session("class") &amp; "_" &amp; Request.QueryString<br />
("pos"))=color<br />
Response.Write "＜td width=25 height=25＞"<br />
'response.write application(application("first" &amp; session("class")))<br />
if application(session("nice"))=true then<br />
response.write "＜a href=match.asp?pos=" &amp; cstr(i) &amp; "_" &amp; cstr(j)<br />
&amp; "＞＜img border=0 src=back0.jpg width=25 height=25＞＜/a＞"<br />
else<br />
response.write "＜img border=0 src=back0.jpg width=25 height=25＞"<br />
end if<br />
response.write "＜/td＞"<br />
else<br />
Response.Write "＜td width=25 height=25＞＜img border=0 src=" &amp;<br />
application("color" &amp; session("class") &amp; "_" &amp; cstr(i) &amp; "_" &amp; cstr<br />
(j)) &amp; "0.jpg width=25 height=25＞＜/td＞" &amp; chr(13)<br />
end if<br />
next<br />
Response.Write "＜/tr＞"<br />
next<br />
Response.Write "＜/table＞"<br />
'判断输赢<br />
if application("first" &amp; session("class"))=session("nice") then<br />
m="black"<br />
h="white"<br />
else<br />
h="black"<br />
m="white"<br />
end if<br />
'横向判断"-"<br />
for i=1 to 15<br />
win=false<br />
loss=false<br />
five_me=0<br />
five_he=0<br />
for j=1 to 15<br />
if application("color" &amp; session("class") &amp; "_" &amp; cstr(i) &amp; "_" &amp; cstr<br />
(j))=m then<br />
five_me=five_me+1<br />
five_he=0<br />
elseif application("color" &amp; session("class") &amp; "_" &amp; cstr(i) &amp; "_" &amp;<br />
cstr(j))=h then<br />
five_me=0<br />
five_he=five_he+1<br />
else<br />
five_me=0<br />
five_he=0<br />
end if<br />
if five_me=5 then<br />
win=true<br />
loss=false<br />
exit for<br />
elseif five_he=5 then<br />
win=false<br />
loss=true<br />
exit for<br />
end if<br />
next<br />
if win or loss then exit for<br />
next<br />
if win then<br />
response.write "你赢了！"<br />
application(application("first" &amp; session("class")))=false<br />
application(application("second" &amp; session("class")))=false<br />
end if<br />
if loss then<br />
response.write "对不起，你输了！"<br />
application(application("first" &amp; session("class")))=false<br />
application(application("second" &amp; session("class")))=false<br />
end if</p>
<p>'列向判断"|"<br />
for j=1 to 15<br />
win=false<br />
loss=false<br />
five_me=0<br />
five_he=0<br />
for i=1 to 15<br />
if application("color" &amp; session("class") &amp; "_" &amp; cstr(i) &amp; "_" &amp; cstr<br />
(j))=m then<br />
five_me=five_me+1<br />
five_he=0<br />
elseif application("color" &amp; session("class") &amp; "_" &amp; cstr(i) &amp; "_" &amp;<br />
cstr(j))=h then<br />
five_me=0<br />
five_he=five_he+1<br />
else<br />
five_me=0<br />
five_he=0<br />
end if<br />
if five_me=5 then<br />
win=true<br />
loss=false<br />
exit for<br />
elseif five_he=5 then<br />
win=false<br />
loss=true<br />
exit for<br />
end if<br />
next<br />
if win or loss then exit for<br />
next<br />
if win then<br />
response.write "你赢了！"<br />
application(application("first" &amp; session("class")))=false<br />
application(application("second" &amp; session("class")))=false<br />
end if<br />
if loss then<br />
response.write "对不起，你输了！"<br />
application(application("first" &amp; session("class")))=false<br />
application(application("second" &amp; session("class")))=false<br />
end if</p>
<p>'斜向判断"/"<br />
for i=1 to 11<br />
win=false<br />
loss=false<br />
five_me=0<br />
five_he=0<br />
for j=i+4 to 1 step -1<br />
if application("color" &amp; session("class") &amp; "_" &amp; cstr(j) &amp; "_" &amp; cstr<br />
(i+5-j))=m then<br />
five_me=five_me+1<br />
five_he=0<br />
elseif application("color" &amp; session("class") &amp; "_" &amp; cstr(j) &amp; "_" &amp;<br />
cstr(i+5-j))=h then<br />
five_me=0<br />
five_he=five_he+1<br />
else<br />
five_me=0<br />
five_he=0<br />
end if<br />
if five_me=5 then<br />
win=true<br />
loss=false<br />
exit for<br />
elseif five_he=5 then<br />
win=false<br />
loss=true<br />
exit for<br />
end if<br />
next<br />
if win or loss then exit for<br />
next<br />
if win then<br />
response.write "你赢了！"<br />
application(application("first" &amp; session("class")))=false<br />
application(application("second" &amp; session("class")))=false<br />
end if<br />
if loss then<br />
response.write "对不起，你输了！"<br />
application(application("first" &amp; session("class")))=false<br />
application(application("second" &amp; session("class")))=false<br />
end if</p>
<p>'斜向判断"\"<br />
for i=1 to 11<br />
win=false<br />
loss=false<br />
five_me=0<br />
five_he=0<br />
for j=12-i to 15<br />
if application("color" &amp; session("class") &amp; "_" &amp; cstr(13-i-j) &amp; "_"<br />
&amp; cstr(j))=m then<br />
five_me=five_me+1<br />
five_he=0<br />
elseif application("color" &amp; session("class") &amp; "_" &amp; cstr(13-i-j)<br />
&amp; "_" &amp; cstr(j))=h then<br />
five_me=0<br />
five_he=five_he+1<br />
else<br />
five_me=0<br />
five_he=0<br />
end if<br />
if five_me=5 then<br />
win=true<br />
loss=false<br />
exit for<br />
elseif five_he=5 then<br />
win=false<br />
loss=true<br />
exit for<br />
end if<br />
next<br />
if win or loss then exit for<br />
next<br />
if win then<br />
response.write "你赢了！"<br />
application(application("first" &amp; session("class")))=false<br />
application(application("second" &amp; session("class")))=false<br />
end if<br />
if loss then<br />
response.write "对不起，你输了！"<br />
application(application("first" &amp; session("class")))=false<br />
application(application("second" &amp; session("class")))=false<br />
end if<br />
%＞<br />
＜/body＞<br />
＜/html＞</p>
<p>如果某点没有棋子，则加上一个超连接，根据擂主与攻擂手的区别放上一个不同颜色的棋子。最后的一段是用来判断输与赢，分为横，列和两个斜线方向。具体内容看一下就可以明白。<br />
最后要说的一点就是global.asa ，这是站点上的一个核心文件，为了在退出棋局后，将位置留给别人，需要在sesison_onend中加入代码进行处理，如下：</p>
<p>＜script language=vbscript runat = server＞<br />
sub application_onstart<br />
session.timeout=1<br />
end sub<br />
sub session_onstart<br />
if application("num")="" then<br />
application("num")=0<br />
end if<br />
application("num")=application("num")+1<br />
end sub<br />
＜/script＞</p>
<p>＜script language=vbscript runat = server＞<br />
sub session_onend<br />
if application("num")="" then<br />
application("num")=0<br />
end if<br />
application("num")=application("num")-1</p>
<p>if application("first1")=session("nice") then<br />
application("first1")=""<br />
elseif application("second1")=session("nice") then<br />
application("second1")=""</p>
<p>elseif application("first2")=session("nice") then<br />
application("first2")=""<br />
elseif application("second2")=session("nice") then<br />
application("second2")=""</p>
<p>elseif application("first3")=session("nice") then<br />
application("first3")=""<br />
elseif application("second3")=session("nice") then<br />
application("second3")=""</p>
<p>elseif application("first4")=session("nice") then<br />
application("first4")=""<br />
elseif application("second4")=session("nice") then<br />
application("second4")=""</p>
<p>elseif application("first5")=session("nice") then<br />
application("first5")=""<br />
elseif application("second5")=session("nice") then<br />
application("second5")=""<br />
end if<br />
for i=1 to 15<br />
for j=1 to 15<br />
application("color" &amp; session("class") &amp; "_" &amp; cstr(i) &amp; "_" &amp; cstr<br />
(J))=""<br />
application("pos" &amp; session("class") &amp; cstr(i) &amp; "_" &amp; cstr(j))=""<br />
next<br />
next<br />
application(session("nice"))=""<br />
end sub<br />
＜/script＞</p>
<p>以上就是几个主要的文件，大家可以一试。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/asp_exaple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>asp错误:Server 对象, ASP 0177 (0x8007007E)</title>
		<link>http://www.3code.cn/asp-server-asp-0177-0x8007007e/</link>
		<comments>http://www.3code.cn/asp-server-asp-0177-0x8007007e/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 15:10:27 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1490</guid>
		<description><![CDATA[今天在本机打开网站时突然出现以下错误：

HTTP 错误 500.100 - 内部服务器错误 - ASP 错误
Internet 信息服务

技术信息（用于支持人员）
• 错误类型：
Server 对象, ASP 0177 (0x8007007E)
8007007e
/QinPu_prison/const.asp, 第 2 行
• 浏览器类型：
]]></description>
			<content:encoded><![CDATA[<p><strong>今天在本机打开网站时突然出现以下错误：</strong></p>
<p>HTTP 错误 500.100 - 内部服务器错误 - ASP 错误<br />
Internet 信息服务</p>
<p>技术信息（用于支持人员）<br />
• 错误类型：<br />
Server 对象, ASP 0177 (0x8007007E)<br />
8007007e<br />
/QinPu_prison/const.asp, 第 2 行<br />
• 浏览器类型：<br />
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)<br />
• 网页：<br />
GET /QinPu_prison/login.asp<br />
• 时间：<br />
2008年7月8日, 23:08:13<br />
• 详细信息：</p>
<p>为什么会出现这个问题呢，如何解决呢？</p>
<p><strong>MDAC组件遭到破坏的原因，请到c:盘搜索mdac.inf<br />
右键安装，需要插入系统光盘，重新装下就OK!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/asp-server-asp-0177-0x8007007e/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asp与Web程序开发中的常见问题</title>
		<link>http://www.3code.cn/asp-web-faq/</link>
		<comments>http://www.3code.cn/asp-web-faq/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 14:13:26 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1461</guid>
		<description><![CDATA[参数：
auto : 　默认的自动算法。布局将基于各单元格的内容。表格在每一单元格读取计算之后才会显示出来。速度很慢
fixed : 　固定布局的算法。在这算法中，水平布局是仅仅基于表格的宽度，表格边框的宽度，单元格间距，列的宽度，而和表格内容无关,此时在＜td＞标签中如果没有 WORD-WRAP: break-word样式,表格中的内容将只能显示一部份,具体看表格的宽度了.word-wrap说明如下:]]></description>
			<content:encoded><![CDATA[<p>Asp及Web开发中的常见问题</p>
<p>＜table style="TABLE-LAYOUT: fixed" width="200" border="0" cellspacing="0" cellpadding="7" bgcolor="#f7f7f7"＞<br />
＜tr＞<br />
＜td style="LEFT: 0px; WIDTH: 100%; WORD-WRAP: break-word"＞<br />
dffadfdaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsfdffadfdasfdffadfdasfdffadfdasfdffadfdasfdffadfdasfd<br />
ffadfdasfdffadfdasfdffadfdasfdffadfdasf<br />
＜/td＞<br />
＜/tr＞<br />
＜/table＞</p>
<p>此处主要是用css样式进行控制在＜table＞标签中有个style="TABLE-LAYOUT: fixed",其说明如下</p>
<p>语法：<br />
table-layout : auto | fixed</p>
<p>参数：<br />
auto : 　默认的自动算法。布局将基于各单元格的内容。表格在每一单元格读取计算之后才会显示出来。速度很慢<br />
fixed : 　固定布局的算法。在这算法中，水平布局是仅仅基于表格的宽度，表格边框的宽度，单元格间距，列的宽度，而和表格内容无关,此时在＜td＞标签中如果没有WORD-WRAP: break-word样式,表格中的内容将只能显示一部份,具体看表格的宽度了.word-wrap说明如下:</p>
<p>语法：<br />
word-wrap : normal | break-word</p>
<p>参数：<br />
normal : 　允许内容顶开指定的容器边界<br />
break-word : 　内容将在边界内换行。如果需要，词内换行（word-break）也会发生</p>
<p>VBSCRIPT标记索引<br />
基本运算<br />
+ 数字加法及字符串连接<br />
- 数字减法<br />
* 数字乘法<br />
/ 数字除法<br />
Mod 求余数<br />
\ 求商数<br />
&amp; 字符串连接<br />
^ 次方<br />
= 相等<br />
＜＞ 不相等<br />
＞= 大于或等于<br />
＞ 大于<br />
＜= 小于或等于<br />
＜ 小于<br />
Not 非<br />
And 且<br />
Or 或<br />
Xor 异或</p>
<p>循环及决策<br />
if ....then 若...则...<br />
if ...then...else 若...则...非<br />
else if... 非若<br />
select case... 群组选择条件<br />
end select<br />
for ... next 计数循环<br />
while...wend 条件循环(一)<br />
do while...loop 条件循环(二)<br />
do...loop while 条件循环(三)<br />
do until...loop 条件循环(四)<br />
do...loop until 条件循环(五)</p>
<p>数学函数<br />
Abs 绝对值<br />
Sgn 正负号<br />
Hex 转换成十六进制<br />
Oct 转换成八进制<br />
Sqr 平方根<br />
Int 取整数<br />
Fix 取整数<br />
Round 取整数<br />
Log 以e为底的对数<br />
Sin 正弦函数<br />
Cos 余弦函数<br />
Tan 正切函数</p>
<p>字符串处理函数<br />
Len 字符串长度<br />
Mid 取部分字符串<br />
Left 从字符串开头取部分字符串<br />
Right 从字符串结尾取部分字符串<br />
Lcase 转换成小写<br />
Ucase 转换成大写<br />
Trim 清除字符串开头及结尾的空格符<br />
Ltrim 清除字符串开头空格符<br />
Rtrim 清除字符串结尾空格符<br />
Replace 替换字符串部分字符<br />
Instr 判断是否包含于另一个字符串(从起始搜寻)<br />
InstrRev 判断是否包含于另一个字符串(从结尾搜寻)<br />
Space 任意字符数的空格符<br />
String 任意字符数的任一字符<br />
StrReverse 反转字符串<br />
Split 以某字符分割字符串</p>
<p>数据类型转换函数<br />
Cint 转换成整形<br />
Cstr 转换成字符串<br />
Clng 转换成常整数<br />
Cbool 转换成布尔函数<br />
Cdate 转换成日期函数<br />
CSng 转换成单精度<br />
CDbl 转换成双精度</p>
<p>日期时间函数<br />
Date 现在日期<br />
Time 现在时间<br />
NOw 现在日期时间<br />
DateAdd 增加日期<br />
DateDiff 两日期差<br />
DateSerial 日期设定<br />
DateValue 日期设定<br />
Year 现在年份<br />
Month 现在月份<br />
Day 现在天<br />
Hour 现在时刻<br />
Minute 现在分钟<br />
Second 现在秒钟<br />
Timer 午夜距现在秒数<br />
TimeSerial 时间设定<br />
TimeValue 时间所属部分<br />
WeekDay 星期名称<br />
MonthName 月份名称</p>
<p>其它函数<br />
Array 产生数组<br />
Asc 字符ASCII码<br />
Chr ASCII码字符<br />
Filter 过滤数组<br />
InputBox 输入窗口<br />
Join 合并数组中的元素<br />
MsgBox 信息窗口<br />
Lbound 数组下界<br />
Ubound 数组上界</p>
<p>指令<br />
Const 设定常数<br />
Dim 定义变量或者数组<br />
Erase 清除数组<br />
ReDim 重新声明数组<br />
Randomize 起始随机数<br />
Rnd 取得随机数</p>
<p>ASP对象</p>
<p>Session对象<br />
IsEmpty 测试Session变量是否存在<br />
TimeOut 设定Session变量生存周期<br />
Abandon 强制清除Session变量</p>
<p>Application对象<br />
IsEmpty 测试Application变量是否存在<br />
Lock 锁定Application变量<br />
Unlock 解除Lock指令的锁定</p>
<p>Cookies对象<br />
Expires 设定Cookies变量的生存周期</p>
<p>Connection对象<br />
Open 打开与数据库的连接<br />
Execute 打开Recordset对象<br />
Close 关闭Connection对象</p>
<p>Recordset对象<br />
movefirst 将记录指针移至第一条<br />
movelast 将记录指针移至最后一条<br />
movenext 将记录指针移至下一条<br />
moveprevious 将记录指针移至上一条<br />
bof 测试是否为recordset的起始<br />
eof 测试是否为recordset的结束<br />
open 打开Recoreset对象<br />
close 关闭recordset对象<br />
fields 读取数据的子对象<br />
fileds.count 字段个数<br />
pagesize 每页记录条数<br />
absolutepage 设定为某页<br />
pagecount 总页数<br />
Absoluteposition 直接跳至某条记录<br />
MicrosoftVBscript运行时错误列表（10进制表示）</p>
<p>error # 5 无效的过程调用或参数<br />
error # 5 无效的过程调用或参数<br />
error # 6 溢出<br />
error # 7 内存不够<br />
error # 9 下标越界<br />
error # 10 该数组为定长的或临时被锁定<br />
error # 11 被零除<br />
error # 13 类型不匹配<br />
error # 14 字符串空间不够<br />
error # 17 不能执行所需的操作<br />
error # 28 堆栈溢出<br />
error # 35 未定义过程或函数<br />
error # 48 加载 DLL 时出错<br />
error # 51 内部错误<br />
error # 52 错误的文件名或号码<br />
error # 53 文件未找到<br />
error # 54 错误的文件模式<br />
error # 55 文件已经打开<br />
error # 57 设备 I/O 错误<br />
error # 58 文件已存在<br />
error # 61 磁盘已满<br />
error # 62 输入超出了文件尾<br />
error # 67 文件过多<br />
error # 68 设备不可用<br />
error # 70 没有权限<br />
error # 71 磁盘没有准备好<br />
error # 74 重命名时不能带有其他驱动器符号<br />
error # 75 路径/文件访问错误<br />
error # 76 路径未找到<br />
error # 91 对象变量未设置<br />
error # 92 For 循环未初始化<br />
error # 94 无效使用 Null<br />
error # 322 不能创建必要的临时文件<br />
error # 424 缺少对象<br />
error # 429 ActiveX 部件不能创建对象<br />
error # 430 类不支持 Automation 操作<br />
error # 432 Automation 操作中文件名或类名未找到<br />
error # 438 对象不支持此属性或方法<br />
error # 440 Automation 操作错误<br />
error # 445 对象不支持此操作<br />
error # 446 对象不支持已命名参数<br />
error # 447 对象不支持当前区域设置选项<br />
error # 448 未找到已命名参数<br />
error # 449 参数是必选项<br />
error # 450 错误的参数个数或无效的参数属性值<br />
error # 451 对象不是一个集合<br />
error # 453 未找到指定的 DLL 函数<br />
error # 455 代码资源锁定错误<br />
error # 457 此键已与该集合的一个元素关联<br />
error # 458 变量使用了一个 VBScript 中不支持的 Automation 类型<br />
error # 462 远程服务器不存在或不可用<br />
error # 481 无效图片<br />
error # 500 变量未定义<br />
error # 501 非法赋值<br />
error # 502 对象不能安全用 Script 编程<br />
error # 503 对象不能安全初始化<br />
error # 504 对象不能安全创建<br />
error # 505 无效的或无资格的引用<br />
error # 506 类没有被定义<br />
error # 507 出现一个意外错误<br />
error # 1001 内存不够<br />
error # 1002 语法错误<br />
error # 1003 缺少 ':'<br />
error # 1005 缺少 '('<br />
error # 1006 缺少 ')'<br />
error # 1007 缺少 ']'<br />
error # 1010 缺少标识符<br />
error # 1011 缺少 '='<br />
error # 1012 缺少 'If'<br />
error # 1013 缺少 'To'<br />
error # 1014 缺少 'End'<br />
error # 1015 缺少 'Function'<br />
error # 1016 缺少 'Sub'<br />
error # 1017 缺少 'Then'<br />
error # 1018 缺少 'Wend'<br />
error # 1019 缺少 'Loop'<br />
error # 1020 缺少 'Next'<br />
error # 1021 缺少 'Case'<br />
error # 1022 缺少 'Select'<br />
error # 1023 缺少表达式<br />
error # 1024 缺少语句<br />
error # 1025 语句未结束<br />
error # 1026 缺少整型常数<br />
error # 1027 缺少 'While' 或 'Until'<br />
error # 1028 缺少 'While' 和 'Until'或语句未结束<br />
error # 1029 缺少 'With'<br />
error # 1030 标识符过长<br />
error # 1031 无效数字<br />
error # 1032 无效字符<br />
error # 1033 未结束的字符串常量<br />
error # 1034 注释未结束<br />
error # 1037 无效使用 'Me' 关键字<br />
error # 1038 'loop' 语句缺少 'do'<br />
error # 1039 无效的 'exit' 语句<br />
error # 1040 循环控制变量 'for' 无效<br />
error # 1041 名称重定义<br />
error # 1042 必须是行中的第一个语句<br />
error # 1043 不能为 non-ByVal 参数赋值<br />
error # 1044 调用子程序时不能使用括号<br />
error # 1045 缺少文字常数<br />
error # 1046 缺少 'In'<br />
error # 1047 缺少 'Class'<br />
error # 1048 必须在一个类的内部定义<br />
error # 1049 在属性声明中缺少 Let , Set 或 Get<br />
error # 1050 缺少 'Property'<br />
error # 1051 在所有属性的规范中，变量的数目必须一致<br />
error # 1052 在一个类中不允许有多个缺省的属性/方法<br />
error # 1053 类的初始化或终止程序没有变量<br />
error # 1054 属性的 set 或 let 必须至少有一个变量<br />
error # 1055 错误的 'Next'<br />
error # 1056 'Default' 只能在 'Property' , 'Function' 或 'Sub' 中指定<br />
error # 1057 指定 'Default' 时必须同时指定 'Public'<br />
error # 1058 只能在 Property Get 中指定 'Default'<br />
error # 4096 Microsoft VBScript 编译器错误<br />
error # 4097 Microsoft VBScript 运行时错误<br />
error # 5016 缺少正则表达式对象<br />
error # 5017 正则表达式语法错误<br />
error # 5018 错误的数量词<br />
error # 5019 正则表达式中缺少 ']'<br />
error # 5020 正则表达式中缺少 ')'<br />
error # 5021 字符集越界</p>
<p>树形菜单:</p>
<p>＜SCRIPT language="JavaScript"＞<br />
var lastObj</p>
<p>function expandIt(obj)<br />
{<br />
if(lastObj != null)<br />
{<br />
if(obj == lastObj)<br />
{<br />
if(obj.style.display == "none")<br />
{<br />
obj.style.display = "";<br />
}<br />
else<br />
{<br />
obj.style.display = "none"<br />
}<br />
}<br />
else<br />
{<br />
lastObj.style.display = "none";<br />
obj.style.display = "";<br />
}<br />
}<br />
else<br />
{<br />
obj.style.display = "";<br />
}</p>
<p>lastObj = obj<br />
}<br />
＜/SCRIPT＞</p>
<p>＜table width="100%" border="0" cellspacing="0" cellpadding="0"＞<br />
＜%<br />
dim id<br />
id = request("id")<br />
dim strsql,rs</p>
<p>strsql="select * from p_type where slanguage=1 and typelevel=1 order by typename"<br />
set rs=fgetrslist(strsql)<br />
do while not rs.eof</p>
<p>%＞<br />
＜tr＞<br />
＜td height="25"＞＜img width="30" height="0" align="absmiddle" /＞＜b＞＜%if rs("isleaf")=0 then%＞＜a href="#" onClick="javascript:expandIt(kb＜%=rs("id")%＞);return false"＞＜%else%＞＜a href="＜%=request.ServerVariables("SCRIPT_NAME")%＞?idtree=＜%=rs("idtree")%＞" ＞＜%end if%＞＜%=server.HTMLEncode(right((rs("typename")&amp;""),len(rs("typename")&amp;"")-2))%＞＜/a＞＜/b＞＜/td＞<br />
＜/tr＞<br />
＜%<br />
IF clng(id)=clng(rs("id")) then</p>
<p>%＞<br />
＜tr id="kb＜%=rs("id")%＞"＞<br />
＜%<br />
else</p>
<p>%＞</p>
<p>＜tr id="kb＜%=rs("id")%＞" style="display:none;"＞<br />
＜%<br />
end if<br />
%＞<br />
＜td＞<br />
＜table＞<br />
＜%<br />
dim rs1<br />
strsql="select * from p_type where parentid="&amp;rs("id")&amp;" and slanguage=1 order by typename"<br />
set rs1=fgetrslist(strsql)<br />
do while not rs1.eof<br />
%＞<br />
＜tr＞＜td height="20"＞<br />
＜img width="40" height="0" align="absmiddle" /＞＜a href="＜%=request.ServerVariables("SCRIPT_NAME")%＞?idtree=＜%=rs1("idtree")%＞&amp;id=＜%=rs("id")%＞" ＞＜%=server.HTMLEncode(right((rs1("typename")&amp;""),len(rs1("typename")&amp;"")-2))%＞＜/a＞＜/td＞＜/tr＞<br />
＜%<br />
rs1.movenext<br />
loop<br />
rs1.close<br />
set rs1=nothing<br />
%＞<br />
＜/table＞<br />
＜/td＞<br />
＜/tr＞<br />
＜%<br />
rs.movenext</p>
<p>loop<br />
rs.close<br />
set rs=nothing<br />
%＞<br />
＜/table＞</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/asp-web-faq/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何保障Winnt +asp +sql web站点的安全经验</title>
		<link>http://www.3code.cn/%e5%a6%82%e4%bd%95%e4%bf%9d%e9%9a%9cwinnt-asp-sql-web%e7%ab%99%e7%82%b9%e7%9a%84%e5%ae%89%e5%85%a8%e7%bb%8f%e9%aa%8c/</link>
		<comments>http://www.3code.cn/%e5%a6%82%e4%bd%95%e4%bf%9d%e9%9a%9cwinnt-asp-sql-web%e7%ab%99%e7%82%b9%e7%9a%84%e5%ae%89%e5%85%a8%e7%bb%8f%e9%aa%8c/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 14:09:03 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1458</guid>
		<description><![CDATA[如何保障Winnt +asp +sql web站点的安全经验
1. 多看看ms的安全公告，这是首选。订阅安全技术杂志。（MS免费的！）如果是正版的nt，则会有最新的安全E-mail。保证及时更新。

2.多大补丁，一定要注意顺序，如果安装了系统软件，则还要重补。（如后面加上了smtp服务，则还要重补sp1等等，否则可能导致旧文件不会被覆盖）。
]]></description>
			<content:encoded><![CDATA[<p><strong>如何保障Winnt +asp +sql web站点的安全经验</strong><br />
<strong>1. </strong>多看看ms的安全公告，这是首选。订阅安全技术杂志。（MS免费的！）如果是正版的nt，则会有最新的安全E-mail。保证及时更新。</p>
<p><strong>2.</strong>多大补丁，一定要注意顺序，如果安装了系统软件，则还要重补。（如后面加上了smtp服务，则还要重补sp1等等，否则可能导致旧文件不会被覆盖）。</p>
<p><strong>3</strong>. 提高安全策略，也可以用微软的安全模板。有一些很好的自动模板。可以根据需要自动加上。</p>
<p><strong>4.</strong> 加大审核力度，审核权限比较大的操作。</p>
<p><strong>5. </strong>密码按时更改。必须符合策略。</p>
<p><strong>6.</strong> 常上一些安全论坛。如：绿盟科技，妖狐站点。</p>
<p><strong>7. </strong>账号的级别一定要多分一些，如果可一实现功能，就不要给更大权限。</p>
<p><strong>8.</strong> 去掉多余的服务。如:(ftp，smtp,nntp,telnet）多余的脚本，例子。如IIS中好多的脚本库，都可以不要。</p>
<p><strong>9. </strong>去掉一些危险的命令。不要共享c盘。</p>
<p><strong>10.</strong> 常看看日志，事件。</p>
<p><strong>11 </strong>. 不要安装html的远端管理。</p>
<p><strong>12</strong>. 最好安装一些黑客工具，模拟攻击。看看是否出了问题。</p>
<p><strong>13</strong>. 安装端口扫描工具。看看是否有些不用的开放端口。</p>
<p><strong>14.</strong> 去除一些隐藏在端口的sniffer，防止密码数据被截获。</p>
<p><strong>15.</strong> 远程管理时最好调试端管理。密码加密策略高一些。防止被截获。</p>
<p><strong>16.</strong> 用注册表修改掉某些选项。如自动显示最后一个登录着的姓名。</p>
<p><strong>17. </strong>改掉administrator的缺省姓名。这样可以多一级保护！<br />
<strong><br />
18.</strong> 密码策略</p>
<p><strong>19.</strong> 密码的安全策略。多少位的密码是安全的。这个很怪。按照ms的加密算法。只有14位以上的密码是可能安全的。但实际上很少有人能记住那么多位的密码。但14位一下。7位密码比较安全。（很怪吧。）微软工程师说有时7位比10位还要保险。呵呵，具体原因说起来比较复杂。我是给我老弟讲课的。省略吧。</p>
<p><strong> 20. </strong>建议密码有字母。数字。大小写组成。最好加上一些如！·#￥%（）等的字符。也很难被猜到。</p>
<p><strong>21. </strong>用户名改掉缺省的admini.....后，可以建一个14位长的管理员名。可以全部用字母。这样就加大了一级保护。<br />
<strong><br />
22. 加</strong>大策略。防止用枚举法猜出账号名。</p>
<p><strong>23. </strong>加入防止5次登录失败后，自动锁定账号20分中。防止暴力法突破。</p>
<p><strong>24</strong>. 建立分类的密码策略。不要用一些内置账号。如“sa”。</p>
<p><strong>25.</strong> 将sa的密码加大。最好不要常用他。建一个另外的管理员账号。然后对每一个自建的数据库都建一个分类账号。asp中最好用他来连接。这样就可以保障其他数据库的安全。</p>
<p><strong>26. </strong>去掉一些权限。不允许普通用户用比较危险的存储过程。</p>
<p><strong>27.</strong> 不允许除管理员外的账号远程连接。或是加上命名管道。</p>
<p><strong>28.</strong> asp如果能用dsn，就不要用连接字符串。并采取包含文件的模式包含进来。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/%e5%a6%82%e4%bd%95%e4%bf%9d%e9%9a%9cwinnt-asp-sql-web%e7%ab%99%e7%82%b9%e7%9a%84%e5%ae%89%e5%85%a8%e7%bb%8f%e9%aa%8c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>小结Web程序中网页间数据传递方法</title>
		<link>http://www.3code.cn/web-data/</link>
		<comments>http://www.3code.cn/web-data/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 14:01:13 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1456</guid>
		<description><![CDATA[小结Web程序中网页间数据传递方法

我们总是会遇到这样的情况，需要将数值从一个网页传递到另一个网页。在这篇文章中，向你展示了几种从一个网页向另一个网页传递数值的几种方法。在此例子中，创建的网页由一个文本控件和几个按钮控件组成。在文本框中输入的数据通过被标识在按钮控件中的不同方法从一个网页传递到另一个网页。

Response.Redirect
让我们首先看一看如何使用Response.Redirect方]]></description>
			<content:encoded><![CDATA[<p><strong>小结Web程序中网页间数据传递方法</strong></p>
<p>我们总是会遇到这样的情况，需要将数值从一个网页传递到另一个网页。在这篇文章中，向你展示了几种从一个网页向另一个网页传递数值的几种方法。在此例子中，创建的网页由一个文本控件和几个按钮控件组成。在文本框中输入的数据通过被标识在按钮控件中的不同方法从一个网页传递到另一个网页。<br />
<strong><br />
Response.Redirect </strong><br />
让我们首先看一看如何使用Response.Redirect方法传递数据。这是它们之中最简单的方法。在文本框中输入一些数据，并且当你输入完成数据后，按下“Respose.Redirect”按钮。我们会得到一个提示，有时我们想在catch程序中传递另一个网页，意味着捕捉到例外程序并且向另一个网页传递。如果你试图这样做，它会给你一个System.Threading例外程序。因为你想遗留下一个线程向另一个网页传递数据，所以这个例外程序就会被抛出。</p>
<p>Response.Redirect("WebForm5.aspx",false);</p>
<p>这个语句告诉编译器定位到“WebForm5.aspx”，这里的“false”意味着在当前网页不能结束你正在做的事情。应该看一看线程发布命令的System.Threading类。在下面，看一看按钮事件的C#代码。“txtName”文本控件的名字，文本框的内的值传递到一个叫做“WebForm5.aspx”的网页。在“？”之后的“Name”符号只是一个临时的响应变量，这个变量保持着文本的数值。</p>
<p>private void Button1_Click(object sender, System.EventArgs e)</p>
<p>{</p>
<p>// Value sent using HttpResponse</p>
<p>Response.Redirect("WebForm5.aspx?Name="+txtName.Text);</p>
<p>}</p>
<p>好的，到这种观点为止，你使用Response发送了数值。刚刚，在此我收集到了这些数值，所以在“WebForm5.aspx”page_Load事件中，写入这些代码。首先，我们检查到输入的值不为null。如果不是这样，我们只是简单地在网页上使用Label控件显示数值。注意：如果你使用Response.Redirect方法来传递这些数值，所有这些数值在浏览器的URL中都是不可见的。你绝不能使用Response.Redirect来传递信用证号码和机密信息。</p>
<p>if (Request.QueryString["Name"]!= null)</p>
<p>Label3.Text = Request.QueryString["Name"];</p>
<p>Cookies</p>
<p>接下来使用Cookies。Cookies在服务器端创建，但是客户端省略。在此 “Cookies” 按钮的click事件中，写入以下代码：</p>
<p>HttpCookie cName = new HttpCookie("Name");</p>
<p>cName.Value = txtName.Text;</p>
<p>Response.Cookies.Add(cName);</p>
<p>Response.Redirect("WebForm5.aspx");</p>
<p>首先，创建一个cookie命名为“cName”。既然一个cookie实例可以拥有许多数值，告诉编译器这个cookie持有“Name”数值。我们将它赋值给TextBox并且最结后将它加入Response流，再使用Response.Redirect方法传递给其它网页。</p>
<p>让我们看一看如何得到被另一个网页传递的cookie数值。</p>
<p>if (Request.Cookies["Name"] != null )</p>
<p>Label3.Text = Request.Cookies["Name"].Value;</p>
<p>如你所看到的，象我们以前做一的一样正是使用同一种方法，刚刚我们在Request.QueryString之内，使用了Request.Cookies。记注一些浏览器不接收cookies。</p>
<p><strong>Session Variables </strong><br />
接下来我们看一看session变量，这些变量由服务器来处理。第一个响影一从客户端传递到服务器，Sessions就创建了，并且当用户关闭浏览器窗口或者一些异常操作发生，session就会结束。给你一些可以使用session变量来传递数值的方法。在下面你看到为用户创建的Session和 “Name”是关键字，也如知名的Session关键字一样，关键字被赋给TextBox数值。</p>
<p>// Session Created</p>
<p>Session["Name"] = txtName.Text;</p>
<p>Response.Redirect("WebForm5.aspx");</p>
<p>// The code below shows how to get the session value.</p>
<p>// This code must be placed in other page.</p>
<p>if(Session["Name"] != null)</p>
<p>Label3.Text = Session["Name"].ToString();</p>
<p>Application Variables</p>
<p>有时，我们需要存取来自网页任何地方的数值。因为那样，可以使用Application变量。这里有一小段代码，这段代码显示如何做到那些事情。一旦创建Application变量并且为其赋值，在应用程序的任何地方都可以重新得到它的值。</p>
<p>// This sets the value of the Application Variable</p>
<p>Application["Name"] = txtName.Text;</p>
<p>Response.Redirect("WebForm5.aspx");</p>
<p>// This is how we retrieve the value of the Application Variable</p>
<p>if( Application["Name"] != null )</p>
<p>Label3.Text = Application["Name"].ToString();</p>
<p>HttpContext</p>
<p>可以使用HttpContext从网页中重新得到数值。通过使用方法的属性获得那些数值。既然它们易于编写代码和修改，使用属性是一种好方法。在你的第一个网页中，制造一个属性，这个属性可以返回TextBox的值。</p>
<p>public string GetName</p>
<p>{</p>
<p>get { return txtName.Text; }</p>
<p>}</p>
<p>我们使用Server.Transfer来将此控件发送到一个新网页。注意：Server.Transfer仅仅将此控件传递到新的网页并且不重新定位该网页，这意味着你会看到在URL中旧网页的地址。简单地在“Server.Transfer”按钮单击事件，并且增加下列代码。</p>
<p>Server.Transfer("WebForm5.aspx");</p>
<p>现在，让我们定位网页，数值就传递到该网页上，在这种情况下使用的该网页是“webForm5.aspx”。</p>
<p>// You can declare this Globally or in any event you like</p>
<p>WebForm4 w;</p>
<p>// Gets the Page.Context which is Associated with this page</p>
<p>w = (WebForm4)Context.Handler;</p>
<p>// Assign the Label control with the property "GetName" which returns string</p>
<p>Label3.Text = w.GetName;</p>
<p>Special Note</p>
<p>特别注意 与你看到的一样，从一个网页向别一网页传递数值时有不同的方法。每一个方法有它自己的优点也有其缺点。所以，当你传递数值时，选择好你所需要的所以你就会有一种好方法，这种方法对你是最为可行的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/web-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>开发ASP准则</title>
		<link>http://www.3code.cn/asp-zz/</link>
		<comments>http://www.3code.cn/asp-zz/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 13:56:03 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1453</guid>
		<description><![CDATA[开发ASP准则
应用程序服务器被,或最终将被 Web 服务器所使用，它通常是运行 ASP 页面的 IIS 计算机。ASP 是您的对象的唯一客户机。它带来了专门的线程和安全考虑。
虽然许多使用 ASP 的 Web 站点根本就不用组件，但在这篇文章中假定 ASP 是 Internet 客户机和组件之间的桥]]></description>
			<content:encoded><![CDATA[<p><strong>开发ASP准则<br />
</strong>应用程序服务器被,或最终将被 Web 服务器所使用，它通常是运行 ASP 页面的 IIS 计算机。ASP 是您的对象的唯一客户机。它带来了专门的线程和安全考虑。<br />
虽然许多使用 ASP 的 Web 站点根本就不用组件，但在这篇文章中假定 ASP 是 Internet 客户机和组件之间的桥梁。下<strong>面的 asp/server01242000.asp"&gt;ASP 组件准则（英文）提供</strong></p>
<p><strong>ASP 和组件之间的划分服务<br />
</strong>ASP 最常用于在服务器上创建供客户机使用的 HTML 或 XML 文件，因此我们主要讨论这种使用方案。这就引出了一个常见的问题，如果 ASP 页面在服务器上，那么它们是否属于业务层的一部分呢？在组件世界中，答案通常是否。虽然 ASP 确实在服务器上运行，而且可能与应用程序服务器在同一个空间，但是这不能使它成为业务逻辑的一部分。<br />
随着用户界面工具的发展或者随着启用更多的业务对业务方案，拥有这种明确的区别将获得巨大的回报。<strong>话说到此，让我们来看一些最重要的业务层和表示层划分准则：<br />
</strong><br />
令 UI 代码与业务逻辑分离。这包括编写与 UI 耦合的代码，例如使用 ASP 内部组件的 MTS 对象，让它与业务逻辑代码分离，如同在不同的 DLL 中。</p>
<p><strong>将事务与 ASP 页面分离</strong>。事务 ASP 在某些情况下非常好，但是组件和多层应用程序会改变这种情况。组件不应该依赖由客户机层来管理它们的事务和业务逻辑语义。</p>
<p><strong>将表示组件</strong>（使用请求和响应的组件）与 Web 服务器放在相同的机器和/或进程中。如果将使用 ASP 内部组件对象的对象放在远程机器上，那么对内部组件的所有调用将以回调形式发生。调用 IIS 客户机的是 COM+ 服务器，它显著降低了性能并使安全配置复杂化。可以将这些调整对象放在标记为“库激活”的 COM+ 应用程序中。<br />
<strong>ASP 存在于服务器上，因此 ASP 页面必须符合资源共享规则，并且记住可伸缩性。请看下面的详细内容： </strong><br />
在“会话”中，管理应尽量避免用户特定的状态。<br />
保持 ASP 无状态，并在可能的情况下允许资源池。</p>
<p><strong>操作方式 </strong><br />
在评价某个代码段是否属于业务逻辑或者表示层时，请问一下自己，“如果我必须用按键式电话应用程序代替我的 ASP 页面，那么该代码是否还有用？”如果答案为“是”，那么可以尝试将它划分为业务逻辑代码或者用户界面帮助器代码。<br />
如果改变了客户机后该代码不能用，或者如果它是构造用户界面的帮助器，则该代码属于表示服务层。它在 ASP 页面中，或在使用 ASP 内部组件的组件中。它不属于业务对象组件。</p>
<p><strong>理解桌面与 ASP 客户机的区别<br />
</strong>ASP 是组件的特殊客户机，不同于桌面上的传统单线程 Win32 应用程序。主要区别概括如下。</p>
<p><strong>线程管理</strong>：ASP 是多线程客户机。这意味着可以有许多并发活动一起运行，也许在同一时刻处理不同的 ASP 页面。这说明不能使对象伪称它是唯一的使用者来独占系统。这样做可能有意外的反应，例如，养成一个坏习惯：将对象存储在 ASP 会话或者应用程序变量中。</p>
<p><strong>安全环境：</strong>ASP 是由 Web 站点中的 Internet Information Services 5.0 执行的，有低、中、高三种隔离度。甚至这些 Web 站点可以有不同的安全设置、允许或拒绝匿名访问、验证客户等等。所有这些设置产生了大量的方案，即不同的用户帐户最终用的是您的对象。</p>
<p><strong>轻松增长</strong>：这不是技术问题，而是 Web 应用程序所提供设施的副效应。传统上，为桌面应用程序增加用户基，要求仔细计划好向已知数量客户机的转出。ASP 已经改变了该过程。在启动和运行后，ASP-Visual Basic 应用程序可以方便地打开，供当地的或世界范围的所有职员、所有业务伙伴和所有客户使用。可以用这种方式描述 — 拥有超链接的单个电子邮件可以使用户基成十倍地增长。您的应用程序为此作好准备了吗？唯一了解的方式是对 Web 站点进行强度测试，以获得实际性能的预期值。关于强度测试的详细信息，请参阅“应用程序生命周期”一节。</p>
<p>在 ASP 内应该如何使用 Visual Basic 对象？在页面范围内创建和取消您的对象。也就是说，尽可能使 ASP 页面无状态，只在暂时状态下依赖会话或应用程序变量。不要将对象存储在会话或应用程序变量中。这将 ASP 线程锁定到您的会话、取消所有可伸缩性的预期值。也就是说，Web 服务器处理的用户数不会超过几十个。如果需要在会话或应用程序中存储内容，请使之成为数据而不是对象。</p>
<p>还有可以遵守的许多其他准则。我们建议您阅读 MSDN Voices 上 J. D. Meier 撰写的专栏“Servin' it Up”。该专栏包括了大量的技术、实践和技巧，有助于开发可扩展的、可靠的 ASP 和组件应用程序。<br />
<strong>参考 </strong><br />
asp#server"&gt;MSDN Voices: Servin' it Up Column（英文）</p>
<p>SeminarOnline：在 ASP 下使用自定义 COM 组件（英文）</p>
<p>asp"&gt;MSDN 杂志（英文）不要将引用存储在会话或应用程序中的 VB 对象中</p>
<p>所有 Visual Basic 6.0 组件都是“单元线程”的，就是说它们都运行在 STA 单元中。这意味着如果在线程中创建对象，那么对该对象的所有调用都必须用同一线程服务。许多线程（来自并发 Web 站点用户）使用 STA 对象的同一实例，会引起一连串的活动，有可能成为应用程序中的瓶颈。</p>
<p><strong>此外，</strong>在会话范围内存储用 Server.CreateObject 创建的 STA 对象，可以有效地将执行线程联系到当前用户，从而将应用程序的最大并发用户数限制到默认的 20xN（N = 处理器数量）。</p>
<p><strong>操作方式 </strong><br />
如果您按照我们的建议使对象无状态，则不需要存储引用以供客户机复用，并在应用程序范围内存储它们。客户机将能够独立创建、使用和取消它们自己的对象。这就减少了保持会话特有对象的需要，原因是它们不保留会话特有的状态。</p>
<p>推荐的方式是使对象无状态，它在需要时访问数据库或其他存储区（例如 cookies 和 LDAP）。</p>
<p>如果需要使用会话或应用程序范围的数据，请将数据，而不是处理数据的对象，存储在此。您可以创建一个类，来封装对所需值的处理。</p>
<p><strong>参考 </strong><br />
asp"&gt;信息：不要在会话或应用程序中存储 STA 对象 (Q243543)（英文）</p>
<p>PRB：将 STA COM 组件存储在会话中，会将会话锁定在单线程中 (Q243815)（英文）</p>
<p><strong>信息</strong>：ASP 下的组件线程模型概要 (Q243544)（英文）</p>
<p>学习 IIS 5.0 中的新内容</p>
<p>Internet Information Server 5.0 增加了许多新功能。这些改进均已写入 J.D. Meier 的 MSDN 文章中：asp/server02282000.asp"&gt;沿用 IIS 5.0 中的 ASP（英文）。下面是该文中最重要改进的概述。<br />
<strong>改进的、出色的性能<br />
</strong><br />
<strong>Server.Transfer 和 Server.Execute 方法<br />
</strong><br />
<strong>集中式错误处理<br />
</strong><br />
<strong>改进的浏览器功能<br />
</strong><br />
<strong>改进的脚本引擎 </strong></p>
<p><strong>正则表达式分析器 </strong><br />
<strong><br />
与 ADO 记录集 XML 功能的集成<br />
</strong><br />
<strong>新的安全性、缓冲、隔离和管理功能 </strong><br />
[编辑：gigi_miao] [返回网易学院首页] [http://tech.163.com/school]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/asp-zz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP中的安全问题</title>
		<link>http://www.3code.cn/as/</link>
		<comments>http://www.3code.cn/as/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 13:48:21 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1450</guid>
		<description><![CDATA[ASP中的安全问题

ASP具有简单、易用、多功能，可扩充性等强大功能，但也存在一些问题。譬如，如果使用ASP的话，可能会导致网络的安全性大大降低了！下面为大家举一个例子，请按照下面的步骤：

（1）从http：//home.gbsource.net/xuankong/dll.zip下载这个文件，解压缩后把其中的test.dll文件拷贝到c：\windows\system（如果你使用的是NT的话，请拷贝到相应的目录中）；]]></description>
			<content:encoded><![CDATA[<p><strong>ASP中的安全问题</strong></p>
<p>ASP具有简单、易用、多功能，可扩充性等强大功能，但也存在一些问题。譬如，如果使用ASP的话，可能会导致网络的安全性大大降低了！下面为大家举一个例子，请按照下面的步骤：</p>
<p><strong>（1）</strong>从http：//home.gbsource.net/xuankong/dll.zip下载这个文件，解压缩后把其中的test.dll文件拷贝到c：\windows\system（如果你使用的是NT的话，请拷贝到相应的目录中）；</p>
<p><strong>（2）</strong>接下来打开"开始/运行"菜单输入"regsvr32 test.dll"命令；</p>
<p><strong>（3）</strong>拷贝解压后的文件包中的那个index.asp到你的服务器目录（如果你使用的是PWS调试可以拷贝到"c:\inetpub\wwwroot"，NT请拷贝到相应的目录）；</p>
<p><strong>（4）</strong>换一台机器用IE浏览index.asp文件看一看（你看到的是出错代码，但是实际上程序已经运行了），你再返回你的机器看一看c:\下面是不是多了一个文件？一个名为xuankong.dat的文件（其实如果我愿意，你的c:\autoexec.bat文件页可以被我打开并写进去一些像"format c:/q/u"等命令，那么等你下次重新启动的时候，结果就不言自明了）。</p>
<p><strong>ASP页面的安全问题是如何产生的？</strong><br />
下面我们来看一下到底是怎么回事，你刚才拷贝的那些dll文件其实是我使用Visul Basic5开发的一个主件，这个文件是通过以下步骤产生的：</p>
<p>（1）打开VB5新建一个"ActiveX.dll"文件，吧下面的代码输入进去：</p>
<p>Private Declare Function ExitWindowsEx Lib "user32"_(ByVal uFlags As Long,ByVal dwReserved As Long)_As LongSub Xuankong ( ) "请不要加上"private"a$ = InputBox ("请输入你的姓名，如果你输入的是"xuankong""+Chr(13)+Chr(10)+"则会在你的系统中生成一个"xuankong"文件"+Chr(10)+Chr(13)+"否则你的机器可能会重起","请输入","xuankong")If a$ = "xuankong" ThenOpen "c:\xuankong.dat" For Append As #Write#1,"我的朋友，这是一个asp主件测试程序"#Write#1,"hello world!this is a test"#Write#1,"如果你看到这个文件测试就成功！"elseExitWindowsEx&amp;H43,0使用API函数重新启动机器End ifClose #1End sub</p>
<p><strong>（2）</strong>把工程名改为dll，类模块改为test，然后把这个工程生成dll文件到c:\windows\system目录下面。<br />
<strong>（3）</strong>新建一个index.asp文件下面的代码输入进去：<br />
＜html＞ ＜/html＞</p>
<p><strong>4）</strong>拷贝index.asp到你的服务器内，按照上面的方法调试！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/as/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>优化Asp编码的八种技巧</title>
		<link>http://www.3code.cn/as-bm/</link>
		<comments>http://www.3code.cn/as-bm/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 08:41:52 +0000</pubDate>
		<dc:creator>寒林</dc:creator>
				<category><![CDATA[ASP]]></category>

		<guid isPermaLink="false">http://www.3code.cn/?p=1446</guid>
		<description><![CDATA[优化Asp编码的八种技巧
ASP(Active Server Page)是Microsoft公司推出的基于PWS(Personal Web Server)&#038;IIS(Internet Information Server)平台的、基于ISAPI(InternetServiceAPI)原理的动态网页开发技术，目前日趋成熟完善。在这里仅就代码优化进行一些简单讨论。

1、声明VBScript变量]]></description>
			<content:encoded><![CDATA[<p><strong>优化Asp编码的八种技巧</strong><br />
ASP(Active Server Page)是Microsoft公司推出的基于PWS(Personal Web Server)&amp;IIS(Internet Information Server)平台的、基于ISAPI(InternetServiceAPI)原理的动态网页开发技术，目前日趋成熟完善。在这里仅就代码优化进行一些简单讨论。</p>
<p><strong>1、声明VBScript变量</strong><br />
在ASP中，对vbscript提供了强劲的支持，能够无缝集成vbscript的函数、方法，这样给扩展ASP的现有功能提供了很大便利。由于ASP中已经模糊了变量类型的概念，所以，在进行ASP与vbscript交互的过程中，很多程序员也惯于不声明vbscript的变量，这样加重了服务器的解析负担，进而影响服务器的响应请求速度。<br />
鉴于此，我们可以象在VB中强制用户进行变量声明一样在vbscript中强制用户进行变量声明。实现方法是在ASP程序行首放置＜% option explicit%＞。</p>
<p><strong>2、对URL地址进行编码</strong><br />
在我们使用asp动态生成一个带参数URL地址并进行跳转时，在IE中解析很正常，但在NetScrape浏览时却有错误如下：</p>
<p>HTTP Error 400<br />
400 Bad Request<br />
Due to malformed syntax, the request could not be understood by the server.<br />
The client should not repeat the request without modifications.</p>
<p>解决方法是对生成的URL参数使用ASP内置server对象的URLencode方法进行URL编码，例子如下：</p>
<p>＜%<br />
URL="xur.asp"<br />
var1="username=" &amp; server.URLencode("xur")<br />
var2="&amp;company=" &amp; server.URLencode("xurstudio")<br />
var3="&amp;phone=" &amp; server.URLencode("021-53854336-186")<br />
response.redirect URL &amp; "?" &amp; var1 &amp; var2 &amp; var3<br />
%＞</p>
<p><strong>3、清空对象</strong><br />
当使用完对象后，首先使用Close方法来释放对象所占用的系统资源；然后设置对象值为“nothing”释放对象占用内存。当年，我就是在一张页面上创建了百余个没有清空对象的记录集而崩溃了我的IIS 。下面的代码使用数据库内容建立一个下拉列表。代码示例如下：</p>
<p>＜% myDSN="DSN=xur;uid=xur;pwd=xur"<br />
mySQL="select * from authors where AU_ID＜100"<br />
set conntemp=server.createobject("adodb.connection")<br />
conntemp.open myDSN<br />
set rstemp=conntemp.execute(mySQL)<br />
if rstemp.eof then<br />
response.write "数据库为空"<br />
response.write mySQL<br />
conntemp.close<br />
set conntemp=nothing<br />
response.end<br />
end if%＞<br />
＜%do until rstemp.eof %＞<br />
＜%<br />
rstemp.movenext<br />
loop<br />
rstemp.close<br />
set rstemp=nothing<br />
conntemp.close<br />
set conntemp=nothing<br />
%＞</p>
<p><strong>4、使用字符串建立SQL查询</strong><br />
使用字符串来建立查询并不能加快服务器的解析速度，相反，它还会增加服务器的解析时间。但在这里仍然推荐使用字符串代替简单的查询语句来进行查询。这样做的好处是，可以迅速发现程序问题所在，从而便利高效地生成程序。示例如下：</p>
<p>＜%mySQL= ""select * "<br />
mySQL= mySQL &amp; "from publishers"<br />
mySQL= mySQL &amp; "where state='NY'"<br />
response.write mySQL<br />
set rstemp=conntemp.execute(mySQL)<br />
rstemp.close<br />
set rstemp=nothing<br />
%＞</p>
<p><strong>5、使用case进行条件选择</strong><br />
在进行条件选择的时候，尽量使用case语句，避免使用if语句。使用case语句，可以使程序流程化，执行起来也比if语句来的快。示例如下：</p>
<p>＜%<br />
FOR i = 1 TO 1000<br />
n = i<br />
Response.Write AddSuffix(n) &amp; "＜br＞"<br />
NEXT<br />
%＞<br />
＜%<br />
Function AddSuffix(num)<br />
numpart = RIGHT(num,1)<br />
SELECT CASE numpart<br />
CASE "1"<br />
IF InStr(num,"11") THEN<br />
num = num &amp; "th"<br />
ELSE<br />
num = num &amp; "st"<br />
END IF<br />
CASE "2"<br />
IF InStr(num,"12") THEN<br />
num = num &amp; "th"<br />
ELSE<br />
num = num &amp; "nd"<br />
END IF<br />
CASE "3"<br />
IF InStr(num,"13") THEN<br />
num = num &amp; "th"<br />
ELSE<br />
num = num &amp; "rd"<br />
END IF<br />
CASE "4"<br />
num = num &amp; "th"<br />
CASE ELSE<br />
num = num &amp; "th"<br />
END SELECT<br />
AddSuffix = num<br />
END FUNCTION<br />
%＞</p>
<p><strong>6、使用adovbs.inc文件中定义的常量打开记录集</strong><br />
打开记录集时，可以定义记录集打开的游标类型和锁定类型。在adovbs.inc文件中定义了一些常量来定义这些类型。adovbs.inc文件保存在\inetpub\iissamples\IISamples目录下面。下面列举几个常用的游标类型和锁定类型。<br />
游标类型：adOpenFowardOnly游标只能向前；adOpenKeyset游标可向前或者向后，如一用户添加记录，新记录不会出现在记录集中；adOpenDynamic游标动态随意；adOpenStatic记录集不对其他用户造成的记录修改有所反映。<br />
锁定类型：adLockReadOney不能修改记录集中的记录；adLockPessimistic在编辑一条记录时锁定它；adLockOptimstic调用记录集Update方法时才锁定记录；adLockBatchOpeimstic记录只能成批更新。</p>
<p>＜!--#INCLUDE VIRTUAL="/ADOVBS.INC" --＞<br />
＜%<br />
connectme="DSN=xur;uid=xur;pwd=xur"<br />
sqltemp="select * from publishers where name='xur'"<br />
set rstemp=Server.CreateObject("adodb.Recordset")<br />
rstemp.open sqltemp, connectme, adOpenStatic，adLockOptimstic<br />
response.write rstemp.recordcount &amp; " records in＜br＞" &amp; sqltemp<br />
rstemp.close<br />
set rstemp=nothing<br />
%＞</p>
<p><strong>7、避免在使用global.asa文件中进行对象定义</strong><br />
由于global.asa文件中的内容可以为站点内所有文件引用，无疑，在global.asa文件中进行对象定义可以省去很多重复工作。比如在global.asa中的application_onstart函数中进行如下定义：</p>
<p>＜%SUB application_onstart<br />
set application("theCONN")=server.createobject("adodb.connection")<br />
END SUB %＞;</p>
<p>这样就可以在站点任何代码中做类似引用：</p>
<p>＜%<br />
mySQL="select * from publishers where state='xur'<br />
set rstemp=application("theconn").execute(mySQL)<br />
%＞</p>
<p>同样地，可以在session_onstart函数中创建记录集对象</p>
<p>＜%SUB session_onstart<br />
set session("rstemp")=server.createobject("adodb.recordset")<br />
END SUB %＞</p>
<p>然后在站点也面中进行如下引用：</p>
<p>＜%<br />
mySQL="select * from publishers where state='xur'<br />
set session("rstemp")=conntemp.execute(mySQL)<br />
%＞</p>
<p>但这样做的同时也有很大的负面影响，由于Application和session变量都只有在关闭网站的时候才释放占用的资源，所以session参数会浪费大量不必要内存，而且此时application变量成为服务器性能的瓶颈。<br />
解决方法：建立定义对象asp页面，在需要进行调用这些对象的页面上，引入这张asp页面。假设定义对象的asp页面名称为define.asp，则只要在对应asp页面中加入以下语句就能引入该页面。<br />
＜!--#INCLUDE VIRTUAL="/define.asp" --＞<br />
在进行页面引进时，最好在待引进的asp文件中不要包含＜%@LANGUAGE="VBSCRIPT"%＞语句。因为在asp文件中，只能有一句由@来定义的脚本解析语言。<br />
<strong></strong></p>
<p><strong>8、安全防护</strong><br />
asp提供了很好的代码保护机制，所有的asp代码都在服务器端执行而只返回给客户端代码执行结果。即便这样，在老版本的IIS中还可以在文件名后面家::$DATA来查看asp的源代码，这已经属于Web Server安全范畴不在本文讨论范围内。下面提出两点简单的安全注意事项。<br />
虽然在asp中建议引入文件以inc作为扩展名，在这里仍建议以asp作为引文件的扩展名。当这些代码在安全机制不好的Web Server上运行时，只需在地址栏上输入引入文件的地址(inc为扩展名)，就可以浏览该引入文件的内容，这是由于在Web Server上，如果没有定义好解析某类型（比如inc）的动态连接库时，该文件以源码方式显示。<br />
不要把数据库文件放在网站结构内部，这样，当恶意人士获取数据库路径后，就可以轻易获取该数据库，进而肆意更改数据库内容。比较好的做法是，为数据库建立DSN（Date Source Name），而在进行数据库访问时直接访问该DSN。<br />
l]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3code.cn/as-bm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

