<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[台灣香料網-Tank部落格 - Tank ASP]]></title>
  <subtitle type="html"><![CDATA[]]></subtitle>
  <id>http://tank.tank.tw/</id>
  <link rel="alternate" type="text/html" href="http://tank.tank.tw/" /> 
  <link rel="self" type="application/atom+xml" href="http://tank.tank.tw/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.8">PJBlog3</generator> 
  <updated>2007-08-20T23:38:00+08:00</updated>

  <entry>
	  <title type="html"><![CDATA[滑鼠停留圖片從黑白到彩色漸變]]></title>
	  <author>
		 <name>tank</name>
		 <uri>http://tank.tank.tw/</uri>
		 <email>tank@tank.tw</email>
	  </author>
	  <category term="" scheme="http://tank.tank.tw/default.asp?cateID=14" label="Tank ASP" /> 
	  <updated>2007-08-20T23:38:00+08:00</updated>
	  <published>2007-08-20T23:38:00+08:00</published>
		  <summary type="html"><![CDATA[<P>代碼如下：<BR>&lt;style&gt;<BR>.gray{<BR>&nbsp; filter:progid:DXImageTransform.Microsoft.Fade(duration=1);zoom:1;<BR>}<BR>.gray img{<BR>&nbsp; filter:gray();<BR>}<BR>&lt;/style&gt;<BR>&lt;script type="text/javascript"&gt;<BR>function initGray(){<BR>&nbsp; for(var i=0,c=document.getElementsByTagName('span');i&lt;c.length;i++)<BR>&nbsp;&nbsp;&nbsp; if(c[i].className=='gray'&amp;&amp;c[i].getElementsByTagName('img').length==1){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c[i].onmouseenter=function(){doTrans(this,false);};<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c[i].onmouseleave=function(){doTrans(this,true);};<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp; function doTrans(ele,bgray){<BR>&nbsp;&nbsp;&nbsp; ele.filters[0].apply();<BR>&nbsp;&nbsp;&nbsp; ele.getElementsByTagName('img')[0].filters[0].enabled=bgray;<BR>&nbsp;&nbsp;&nbsp; ele.filters[0].play();<BR>&nbsp; }<BR>}<BR>if(window.attachEvent)<BR>&nbsp; window.attachEvent('onload',initGray);<BR>&lt;/script&gt;</P>
<P>&lt;span class=gray&gt;<BR>&nbsp; &lt;a href="<A href="http://blog.tank.tw/">http://blog.tank.tw/</A>"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;img border="0" src="/UploadFiles/2007-8/202341940080.jpg" /&gt;<BR>&nbsp; &lt;/a&gt;<BR>&lt;/span&gt;<BR><BR><SPAN class=gray><A href="http://blog.tank.tw/"><img src="http://tank.tank.tw/UploadFiles/2007-8/202341940080.jpg" border=0> </A></SPAN></P>]]></summary>
	  <link rel="alternate" type="text/html" href="http://tank.tank.tw/article/ASP/滑鼠停留圖片從黑白到彩色漸變.htm" /> 
	  <id>http://tank.tank.tw/default.asp?id=745</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[網頁彈出窗口代碼全攻略]]></title>
	  <author>
		 <name>tank</name>
		 <uri>http://tank.tank.tw/</uri>
		 <email>tank@tank.tw</email>
	  </author>
	  <category term="" scheme="http://tank.tank.tw/default.asp?cateID=14" label="Tank ASP" /> 
	  <updated>2007-08-17T23:43:00+08:00</updated>
	  <published>2007-08-17T23:43:00+08:00</published>
		  <summary type="html"><![CDATA[<P>網頁彈出窗口代碼全攻略<BR>推薦經常上網的朋友可能會到過這樣一些網站，一進入首頁立刻會彈出一個窗口，或者按一個連接或按鈕彈出，通常在這個窗口裡會顯示一些注意事項、版權訊息、警告、歡迎光顧之類的話或者作者想要特別提示的訊息。其實製作這樣的頁面效果非常的容易，只要往該頁面的HTML裡加入幾段Javascript代碼即可實現。下面俺就帶您剖析它的奧秘。 </P>
<P>1、【最基本的彈出窗口代碼】 <BR>--------------------------------------------------------------------------------<BR>其實代碼非常簡單：</P>
<P>&lt;SCRIPT LANGUAGE="javascript"&gt; <BR>&lt;!-- <BR>window.open ('page.html') <BR>--&gt; <BR>&lt;/SCRIPT&gt; </P>
<P>　因為這是一段javascripts代碼，所以它們應該放在&lt;SCRIPT LANGUAGE="javascript"&gt;標籤和&lt;/script&gt;之間。&lt;!-- 和 --&gt;是對一些版本低的瀏覽器起作用，在這些老瀏覽器中不會將標籤中的代碼作為文本顯示出來。要養成這個好習慣啊。 <BR>　window.open ('page.html') 用於控制彈出新的窗口page.html，如果page.html不與主窗口在同一路徑下，前面應寫明路徑，絕對路徑(http://)和相對路徑(../)均可。 <BR>　用單引號和雙引號都可以，只是不要混用。 <BR>　這一段代碼可以加入HTML的任意位置，&lt;head&gt;和&lt;/head&gt;之間可以，&lt;body&gt;間&lt;/body&gt;也可以，越前越早執行，尤其是頁面代碼長，又想使頁面早點彈出就盡量往前放。 </P>
<P><BR>2、【經過設置後的彈出窗口】 <BR>--------------------------------------------------------------------------------<BR>　下面再說一說彈出窗口的設置。只要再往上面的代碼中加一點東西就可以了。我們來定制這個彈出的窗口的外觀，尺寸大小，彈出的位置以適應該頁面的具體情況。 <BR>&lt;SCRIPT LANGUAGE="javascript"&gt; <BR>&lt;!-- <BR>window.open ('page.html', 'newwindow', 'height=100, width=400, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no')<BR>--&gt; <BR>&lt;/SCRIPT&gt; </P>
<P>參數解釋： <BR>&lt;SCRIPT LANGUAGE="javascript"&gt; js腳本開始； <BR>window.open 彈出新窗口的命令； <BR>'page.html' 彈出窗口的文件名； <BR>'newwindow' 彈出窗口的名字（不是文件名），非必須，可用空''代替； <BR>height=100 窗口高度； <BR>width=400 窗口寬度； <BR>top=0 窗口距離螢幕上方的象素值； <BR>left=0 窗口距離螢幕左側的象素值； <BR>toolbar=no 是否顯示工具欄，yes為顯示； <BR>menubar，scrollbars 表示菜單欄和滾動欄。 <BR>resizable=no 是否允許改變窗口大小，yes為允許； <BR>location=no 是否顯示地址欄，yes為允許； <BR>status=no 是否顯示狀態欄內的訊息（通常是文件已經打開），yes為允許； <BR>&lt;/SCRIPT&gt; js腳本結束 </P>
<P><BR>3、【用函數控制彈出窗口】 <BR>--------------------------------------------------------------------------------<BR>下面是一個完整的代碼。 </P>
<P>&lt;html&gt; <BR>&lt;head&gt; <BR>&lt;script LANGUAGE="JavaScript"&gt; <BR>&lt;!-- <BR>function openwin() { <BR>window.open ("page.html", "newwindow", "height=100, width=400, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") <BR>//寫成一行 <BR>} <BR>//--&gt; <BR>&lt;/script&gt; <BR>&lt;/head&gt; <BR>&lt;body onload="openwin()"&gt; <BR>...任意的頁面內容... <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR>這裡定義了一個函數openwin(),函數內容就是打開一個窗口。在調用它之前沒有任何用途。 <BR>怎麼調用呢？<BR>　方法一：&lt;body onload="openwin()"&gt; 瀏覽器讀頁面時彈出窗口； <BR>　方法二：&lt;body onunload="openwin()"&gt; 瀏覽器離開頁面時彈出窗口； <BR>　方法三：&lt;a href="#" onclick="openwin()"&gt;打開一個窗口&lt;/a&gt; 注意：使用的「#」是虛連接。 <BR>　方法四：&lt;input type="button" onclick="openwin()" value="打開窗口"&gt; </P>
<P><BR>4、【同時彈出2個窗口】 <BR>--------------------------------------------------------------------------------<BR>對源代碼稍微改動一下： </P>
<P>&lt;script LANGUAGE="JavaScript"&gt; <BR>&lt;!-- <BR>function openwin() { <BR>window.open ("page.html", "newwindow", "height=100, width=100, top=0, left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") <BR>window.open ("page2.html", "newwindow2", "height=100, width=100, top=100, left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") <BR>} <BR>//--&gt; <BR>&lt;/script&gt; <BR>為避免彈出的2個窗口覆蓋，用top和left控制一下彈出的位置不要相互覆蓋即可。最後用上面說過的四種方法調用即可。 <BR>注意：2個窗口的name(newwindows和newwindow2)不要相同，或者乾脆全部為空。OK？ </P>
<P><BR>5、【主窗口打開文件1.htm，同時彈出小窗口page.html】 <BR>--------------------------------------------------------------------------------<BR>如下代碼加入主窗口&lt;head&gt;區： </P>
<P>&lt;script language="javascript"&gt; <BR>&lt;!-- <BR>function openwin() { <BR>window.open("page.html","","width=200,height=200") <BR>} <BR>//--&gt; <BR>&lt;/script&gt; </P>
<P>&lt;body&gt;區加入： </P>
<P>&lt;a href="/1.htm" onclick="openwin()"&gt;open&lt;/a&gt;</P>
<P>即可。 </P>
<P><BR>6、【彈出的窗口之定時關閉控制】 <BR>--------------------------------------------------------------------------------<BR>下面我們再對彈出的窗口進行一些控制，效果就更好了。如果我們再將一小段代碼加入彈出的頁面(注意是加入到page.html的HTML中，可不是主頁面中，否則...)，讓它10秒後自動關閉是不是更酷了？ </P>
<P>首先，將如下代碼加入page.html文件的&lt;head&gt;區：</P>
<P>&lt;script language="JavaScript"&gt; <BR>function closeit() { <BR>setTimeout("self.close()",10000) //毫秒 <BR>} <BR>&lt;/script&gt; </P>
<P>然後，再用&lt;body onload="closeit()"&gt; 這一句話代替page.html中原有的&lt;BODY&gt;這一句就可以了。(這一句話千萬不要忘記寫啊！這一句的作用是調用關閉窗口的代碼，10秒鐘後就自行關閉該窗口。) </P>
<P><BR>7、【在彈出窗口中加上一個關閉按鈕】 <BR>--------------------------------------------------------------------------------<BR>&lt;FORM&gt; <BR>&lt;INPUT TYPE='BUTTON' VALUE='關閉' onClick='window.close()'&gt; <BR>&lt;/FORM&gt; </P>
<P><BR>8、【內包含的彈出窗口-一個頁面兩個窗口】 <BR>--------------------------------------------------------------------------------<BR>上面的例子都包含兩個窗口，一個是主窗口，另一個是彈出的小窗口。 <BR>通過下面的例子，你可以在一個頁面內完成上面的效果。 <BR>&lt;html&gt; <BR>&lt;head&gt; <BR>&lt;SCRIPT LANGUAGE="JavaScript"&gt; <BR>function openwin() <BR>{ <BR>OpenWindow=window.open("", "newwin", "height=250, width=250,toolbar=no,scrollbars="+scroll+",menubar=no"); <BR>//寫成一行 <BR>OpenWindow.document.write("&lt;TITLE&gt;例子&lt;/TITLE&gt;") <BR>OpenWindow.document.write("&lt;BODY BGCOLOR=#ffffff&gt;") <BR>OpenWindow.document.write("&lt;h1&gt;Hello!&lt;/h1&gt;") <BR>OpenWindow.document.write("New window opened!") <BR>OpenWindow.document.write("&lt;/BODY&gt;") <BR>OpenWindow.document.write("&lt;/HTML&gt;") <BR>OpenWindow.document.close() <BR>} <BR>&lt;/SCRIPT&gt; <BR>&lt;/head&gt; <BR>&lt;body&gt; <BR>&lt;a href="#" onclick="openwin()"&gt;打開一個窗口&lt;/a&gt; <BR>&lt;input type="button" onclick="openwin()" value="打開窗口"&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; </P>
<P>看看 OpenWindow.document.write()裡面的代碼不就是標準的HTML嗎？只要按照格式寫更多的行即可。千萬注意多一個標籤或少一個標籤就會出現錯誤。記得用OpenWindow.document.close()結束啊。 </P>
<P><BR>9、【終極應用--彈出的窗口之Cookie控制】 <BR>--------------------------------------------------------------------------------<BR>回想一下，上面的彈出窗口雖然酷，但是有一點小毛病(沉浸在喜悅之中，一定沒有發現吧？)比如你將上面的腳本放在一個需要頻繁經過的頁面裡(例如首頁)，那麼每次刷新這個頁面，窗口都會彈出一次，是不是非常煩人？<BR>　有解決的辦法嗎？<BR>　我們使用cookie來控制一下就可以了。 <BR>　首先，將如下代碼加入主頁面HTML的&lt;HEAD&gt;區： <BR>&lt;script&gt; <BR>function openwin(){ <BR>window.open("page.html","","width=200,height=200") <BR>} <BR>function get_cookie(Name) { <BR>var search = Name + "=" <BR>var returnvalue = ""; <BR>if (document.cookie.length &gt; 0) { <BR>offset = document.cookie.indexOf(search) <BR>if (offset != -1) { <BR>offset += search.length <BR>end = document.cookie.indexOf(";", offset); <BR>if (end == -1) <BR>end = document.cookie.length; <BR>returnvalue="/unescape(document.cookie.substring(offset," end)) <BR>} <BR>} <BR>return returnvalue; <BR>} </P>
<P>function loadpopup(){ <BR>if (get_cookie('popped')==''){ <BR>openwin() <BR>document.cookie="popped=yes" <BR>} <BR>} </P>
<P>&lt;/script&gt; </P>
<P>　然後，用&lt;body onload="loadpopup()"&gt;（注意不是openwin而是loadpop啊！）替換主頁面中原有的&lt;BODY&gt;這一句即可。你可以試著刷新一下這個頁面或重新進入該頁面，窗口再也不會彈出了。真正的Pop-Only-Once！<BR></P>]]></summary>
	  <link rel="alternate" type="text/html" href="http://tank.tank.tw/article/ASP/網頁彈出窗口代碼全攻略.htm" /> 
	  <id>http://tank.tank.tw/default.asp?id=742</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[CSS-完全搞定背景圖片]]></title>
	  <author>
		 <name>tank</name>
		 <uri>http://tank.tank.tw/</uri>
		 <email>tank@tank.tw</email>
	  </author>
	  <category term="" scheme="http://tank.tank.tw/default.asp?cateID=14" label="Tank ASP" /> 
	  <updated>2007-08-10T07:36:00+08:00</updated>
	  <published>2007-08-10T07:36:00+08:00</published>
		  <summary type="html"><![CDATA[<P>CSS-完全搞定背景圖片</P>
<P><BR>自定背景圖片</P>
<P>若是全版面的圖，圖片大小約800x450<BR>版面設定/自定樣式/<BR>在裡面的CSS還蠻前面的地方，大約找到下面內容<BR>/*Background*/<BR>body {background-image: url('圖片網址');no-repeat;}</P>
<P>貼上(圖片網址)的內容就可以了，但必須是網路上的圖片！<BR>所以若是自己準備的圖要先上傳至網路上！</P>
<P>&nbsp;</P>
<P><BR>固定背景圖片</P>
<P>同樣的地方<BR>/*Background*/<BR>body {background-image: url('圖片網址');<BR>background-repeat: no-repeat;<BR>background-attachment:fixed;}</P>
<P>加上最後一段，就可以讓背景固定不動了！<BR>固定背景的好處是至少讓圖不會有貼接般的難看！</P>
<P>&nbsp;</P>
<P><BR>固定背景圖的位置<BR>把圖片固定在不同位置</P>
<P>同樣的語法再加上一段<BR>/*Background*/<BR>body{background:url('圖片網址') fixed; background-position: 固定的位置;<BR>background-repeat:no-repeat;}</P>
<P>固定的位置：<BR>left top -左上<BR>left bottom -左下<BR>right top -右上<BR>right bottom -右下<BR>center -中央<BR>(另一種百分比的方法)<BR>0% 0% -左上方<BR>0% 50% -左邊中間<BR>50% 0% -中間上方<BR>50% 50% -正中央<BR>100% 0% -右邊上方<BR>0% 100% -左邊下方<BR>100% 50% -右邊中間<BR>50% 100% -中間下方<BR>100% 100% -右下方<BR><A href="http://www.yu163.net/list.asp?classid=1&amp;page=5">http://www.yu163.net/list.asp?classid=1&amp;page=5</A></P>
<P><A href="http://www.yu163.net/user1/imgk8d/archives/2007/googlepaiming1258.html">http://www.yu163.net/user1/imgk8d/archives/2007/googlepaiming1258.html</A><BR><BR><BR><A href="http://www.hsiu28.net/style/style_3.php">http://www.hsiu28.net/style/style_3.php</A><BR>CSS的屬性很多，有許多人都抱怨說要怎麼才能快速記憶CSS的屬性呢.在這裡我就把CSS所有的屬性列在一張小卡片上，大家可以像背英語單詞的小卡片一樣，用來記憶：CSS速記小紙片(目前缺)</P>
<P>字體屬性：(font)<BR>大小 font-size: x-large;(特大) xx-small;(極小) 一般中文用不到，只要用數值就可以，單位：PX、PD<BR>樣式 font-style: oblique;(偏斜體) italic;(斜體) normal;(正常)<BR>行高 line-height: normal;(正常) 單位：PX、PD、EM<BR>粗細 font-weight: bold;(粗體) lighter;(細體) normal;(正常)<BR>變體 font-variant: small-caps;(小型大寫字母) normal;(正常)<BR>大小寫 text-transform: capitalize;(首字母大寫) uppercase;(大寫) lowercase;(小寫) none;(無)<BR>修飾 text-decoration: underline;(下劃線) overline;(上劃線) line-through;(刪除線) blink;(閃爍)<BR>常用字體：(font-family)<BR>"Courier New", Courier, monospace, "Times New Roman", Times, serif, Arial, Helvetica, sans-serif, Verdana</P>
<P>背景屬性：(background)<BR>色彩 background-color: #FFFFFF;<BR>圖片 background-image: url();<BR>重複 background-repeat: no-repeat;<BR>滾動 background-attachment: fixed;(固定) scroll;(滾動)<BR>位置 background-position: left(水平) top(垂直);<BR>簡寫方法 background:#000 url(..) repeat fixed left top;</P>
<P>區塊屬性：(Block)<BR>字間距 letter-spacing: normal; 數值<BR>對齊 text-align: justify;(兩端對齊) left;(左對齊) right;(右對齊) center;(居中)<BR>縮進 text-indent: 數值px;<BR>垂直對齊 vertical-align: baseline;(基線) sub;(下標) super;(下標) top; text-top; middle; bottom; text-bottom;<BR>詞間距 word-spacing: normal; 數值<BR>空格 white-space: pre;(保留) nowrap;(不換行)<BR>顯示 display:block;(塊) inline;(內嵌) list-item;(列表項) run-in;(追加部分) compact;(緊湊) marker;(標記) table; inline-table; table-raw-group; table-header-group; table-footer-group; table-raw; table-column-group; table-column; table-cell; table-caption;(表格標題)</P>
<P>方框屬性：(Box)<BR>width:; height:; float:; clear:both; margin:; padding:; 順序：上右下左</P>
<P>邊框屬性：(Border)<BR>border-style: dotted;(點線) dashed;(虛線) solid; double;(雙線) groove;(槽線) ridge;(脊狀) inset;(凹陷) outset;<BR>border-width:; 邊框寬度<BR>border-color:#;<BR>簡寫方法 border：width style color;</P>
<P>列表屬性：(List-style)<BR>類型 list-style-type:disc;(圓點) circle;(圓圈) square;(方塊) decimal;(數字) lower-roman;(小羅碼數字) upper-roman; lower-alpha; upper-alpha;<BR>位置 list-style-position: outside;(外) inside;<BR>圖像 list-style-image: url(..);</P>
<P>定位屬性：(Position)<BR>Position: absolute; relative; static;<BR>visibility: inherit; visible; hidden;<BR>overflow: visible; hidden; scroll; auto;<BR>clip: rect(12px,auto,12px,auto) (裁切) </P>]]></summary>
	  <link rel="alternate" type="text/html" href="http://tank.tank.tw/article/ASP/CSS-完全搞定背景圖片.htm" /> 
	  <id>http://tank.tank.tw/default.asp?id=734</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[rar實現asp的在線壓縮與解壓縮]]></title>
	  <author>
		 <name>tank</name>
		 <uri>http://tank.tank.tw/</uri>
		 <email>tank@tank.tw</email>
	  </author>
	  <category term="" scheme="http://tank.tank.tw/default.asp?cateID=14" label="Tank ASP" /> 
	  <updated>2007-02-15T02:58:30+08:00</updated>
	  <published>2007-02-15T02:58:30+08:00</published>
		  <summary type="html"><![CDATA[<P>rar實現asp的在線壓縮與解壓縮 </P>
<P>無聊吧，寫了這個程式，主要是方便那些懶鬼的，國外有的網站只提供單個文件上傳，靠我不想被累死！</P>
<P>前提：<BR>需要wscript支持<BR>你將cmd.exe和winrar文件夾中rar.exe都放到同一個文件夾里<BR>而且這個文件夾取名叫"dos",要不然你自己修改代碼文件也成；<BR>（主要是方便，我自己也很懶的，呵呵）<BR>文件保存為同名的文件哦</P>
<P>自解壓代碼文件<BR>unrar.asp</P>
<P>&lt;%<BR>dim afterunzip,PEDM,Mlpath,Shell,rarcomm,RetCode,cmd,comm,fso </P>
<P>unfilepath=Request.ServerVariables("PATH_INFO")</P>
<P>'存放RAR.EXE和CMD.EXE的路徑 <BR>Mlpath=Replace(Server.mappath(unfilepath),"unrar.asp","")</P>
<P>'解壓文件后所放的路徑<BR>afterunzip=Server.mappath("dos")&amp;"\" <BR>afterunzip=Mlpath</P>
<P>'要解壓的RAR文件<BR>PEDM=Server.mappath("aaa.rar")</P>
<P>Set Shell = Server.CreateObject("WScript.Shell") <BR>'x從檔案文件中全路徑釋放文件<BR>'t壓縮后測試文件<BR>'o不覆蓋已經存在的文件<BR>'p設置密碼<BR>rarcomm= Mlpath&amp;"cmd.exe /c "&amp;Mlpath&amp;"rar.exe x -t -o+ -p- " <BR>cmd=rarcomm&amp;PEDM&amp;" "&amp;afterunzip<BR>RetCode = Shell.Run(cmd,1, True) <BR>%&gt;</P>
<P><BR>壓縮文件代碼<BR>rar.asp</P>
<P>&lt;%<BR>dim ylj,ywj,Mlpath,Shell,rarcomm,RetCode,cmd,comm,fso </P>
<P>unfilepath=Request.ServerVariables("PATH_INFO")</P>
<P>'存放RAR.EXE和CMD.EXE的路徑 <BR>Mlpath=Replace(Server.mappath(unfilepath),"rar.asp","")</P>
<P>'壓縮文件后所放的路徑<BR>afterzip=Server.mappath("dos")&amp;"\" <BR>ylj=Mlpath</P>
<P>'要壓縮的RAR文件<BR>needzip=Server.mappath("aaaw.rar")</P>
<P>Set Shell = Server.CreateObject("WScript.Shell") <BR>'x從檔案文件中全路徑釋放文件<BR>'t壓縮后測試文件<BR>'o不覆蓋已經存在的文件<BR>'p設置口令<BR>rarcomm= Mlpath&amp;"cmd.exe /c "&amp;Mlpath&amp;"rar.exe a -o+ -ep" <BR>cmd=rarcomm&amp;afterzip&amp;" "&amp;needrzip<BR>RetCode = Shell.Run(cmd,1, True) <BR>%&gt;</P>
<P>要改成winzip的自己改吧，提供命令行參考：</P>
<P>WinRAR＜命令＞-＜開關＞＜壓縮包＞＜文件...＞＜解壓縮路徑＞ </P>
<P><BR>壓縮與解壓縮操作舉例 </P>
<P>下面我們通過例子，對比一下Winzip和Winrar的基本壓縮與解壓縮操作命令。假設壓縮包文件名為test.zip和test.rar。 </P>
<P><BR>任務描述<BR>Winzip　　　　　Winrar</P>
<P>壓縮目錄test及其子目錄的文件內容<BR>Wzzip test.zip test –r -P<BR>WINRAR A test.rar test –r</P>
<P>刪除壓縮包中的*.txt文件<BR>Wzzip test.zip *.txt -d<BR>WinRAR d test.rar *.txt</P>
<P>刷新壓縮包中的文件，即添加已經存在于壓縮包中但更新的文件<BR>Wzzip test.zip test –f<BR>Winrar f test.rar test</P>
<P>更新壓縮包中的文件，即添加已經存在于壓縮包中但更新的文件以及新文件<BR>Wzzip test.zip test –u<BR>Winrar u test.rar test</P>
<P>移動文件到壓縮包，即添加文件到壓縮包后再刪除被壓縮的文件<BR>Wzzip test.zip –r –P –m<BR>Winrar m test.rar test –r</P>
<P>添加全部 *.exe 文件到壓縮文件，但排除有 a或b 開頭名稱的文件<BR>Wzzip test *.exe -xf*.* -xb*.*<BR>WinRAR a test *.exe -xf*.* -xb*.*</P>
<P>加密碼進行壓縮<BR>Wzzip test.zip test –s123。注意密碼是大小寫敏感的。在圖形界面下打開帶密碼的壓縮文件，會看到+號標記（附圖1）。<BR>WINRAR A test.rar test –p123 –r。注意密碼是大小寫敏感的。在圖形界面下打開帶密碼的壓縮文件，會看到*號標記（附圖2）。</P>
<P>按名字排序、以簡要方式列表顯示壓縮包文件<BR>Wzzip test.zip -vbn<BR>Rar l test.rar</P>
<P>鎖定壓縮包，即防止未來對壓縮包的任何修改<BR>無對應命令<BR>Winrar k test.rar</P>
<P>創建360kb大小的分卷壓縮包<BR>無對應命令<BR>Winrar a –v360 test</P>
<P>　　　　 <BR>帶子目錄信息解壓縮文件<BR>Wzunzip test -d<BR>Winrar x test -r</P>
<P>不帶子目錄信息解壓縮文件<BR>Wzunzip test<BR>Winrar e test</P>
<P>解壓縮文件到指定目錄，如果目錄不存在，自動創建<BR>Wzunzip test newfolder\<BR>Winrar x test newfolder\</P>
<P>解壓縮文件並確認覆蓋文件<BR>Wzunzip test -y<BR>Winrar x test –y</P>
<P>解壓縮特定文件<BR>Wzunzip test *.txt<BR>Winrar x test *.txt</P>
<P>解壓縮現有文件的更新文件<BR>Wzunzip test –f <BR>Winrar x test –f</P>
<P>解壓縮現有文件的更新文件及新文件<BR>Wzunzip test -n<BR>Winrar x test -u</P>
<P>批量解壓縮文件<BR>Wzunzip *.zip<BR>WinRAR e *.rar<BR>&nbsp;<BR>&nbsp;<BR></P>]]></summary>
	  <link rel="alternate" type="text/html" href="http://tank.tank.tw/article/ASP/rar實現asp的在線壓縮與解壓縮.htm" /> 
	  <id>http://tank.tank.tw/default.asp?id=718</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[PageRank]]></title>
	  <author>
		 <name>tank</name>
		 <uri>http://tank.tank.tw/</uri>
		 <email>tank@tank.tw</email>
	  </author>
	  <category term="" scheme="http://tank.tank.tw/default.asp?cateID=14" label="Tank ASP" /> 
	  <updated>2006-11-07T04:08:26+08:00</updated>
	  <published>2006-11-07T04:08:26+08:00</published>
		  <summary type="html"><![CDATA[<P>&lt;<a href="http://tank.tank.tw/mailto:%@LANGUAGE=JAVASCRIPT">%@LANGUAGE=JAVASCRIPT</A> codepage=65001 EnableSessionState=False%&gt;<BR>&lt;SCRIPT RUNAT=SERVER LANGUAGE=JAVASCRIPT&gt;<BR>var obUrl = Request("referer");<BR>var pr = getPR();<BR>function hexdec(str)<BR>{<BR>&nbsp;&nbsp;&nbsp; return parseInt(str,16);<BR>}<BR>function zeroFill(a,b)<BR>{<BR>&nbsp;&nbsp;&nbsp; var z = hexdec(80000000);<BR>&nbsp;&nbsp;&nbsp; if (z &amp; a)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = a&gt;&gt;1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a &amp;= ~z;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a |= 0x40000000;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = a&gt;&gt;(b-1);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = a &gt;&gt; b;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; return (a);<BR>}</P>
<P>function mix(a,b,c)<BR>{<BR>&nbsp;&nbsp;&nbsp; a -= b; a -= c; a ^= (zeroFill(c,13));<BR>&nbsp;&nbsp;&nbsp; b -= c; b -= a; b ^= (a&lt;&lt;8);<BR>&nbsp;&nbsp;&nbsp; c -= a; c -= b; c ^= (zeroFill(b,13));<BR>&nbsp;&nbsp;&nbsp; a -= b; a -= c; a ^= (zeroFill(c,12));<BR>&nbsp;&nbsp;&nbsp; b -= c; b -= a; b ^= (a&lt;&lt;16);<BR>&nbsp;&nbsp;&nbsp; c -= a; c -= b; c ^= (zeroFill(b,5));<BR>&nbsp;&nbsp;&nbsp; a -= b; a -= c; a ^= (zeroFill(c,3));<BR>&nbsp;&nbsp;&nbsp; b -= c; b -= a; b ^= (a&lt;&lt;10);<BR>&nbsp;&nbsp;&nbsp; c -= a; c -= b; c ^= (zeroFill(b,15));<BR>&nbsp;&nbsp;&nbsp; var ret = new Array((a),(b),(c));<BR>&nbsp;&nbsp;&nbsp; return ret;<BR>}</P>
<P>&nbsp;</P>
<P>function GoogleCH(url,length)<BR>{<BR>&nbsp;&nbsp;&nbsp; var init = 0xE6359A60;<BR>&nbsp;&nbsp;&nbsp; if (arguments.length == 1)<BR>&nbsp;&nbsp;&nbsp;&nbsp; length = url.length;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; var a = 0x9E3779B9;<BR>&nbsp;&nbsp;&nbsp; var b = 0x9E3779B9;<BR>&nbsp;&nbsp;&nbsp; var c = 0xE6359A60;<BR>&nbsp;&nbsp;&nbsp; var k = 0;<BR>&nbsp;&nbsp;&nbsp; var len = length;<BR>&nbsp;&nbsp;&nbsp; var mixo = new Array();<BR>&nbsp;&nbsp;&nbsp; while(len &gt;= 12)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a += (url[k+0] +(url[k+1]&lt;&lt;8) +(url[k+2]&lt;&lt;16) +(url[k+3]&lt;&lt;24));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b += (url[k+4] +(url[k+5]&lt;&lt;8) +(url[k+6]&lt;&lt;16) +(url[k+7]&lt;&lt;24));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c += (url[k+8] +(url[k+9]&lt;&lt;8) +(url[k+10]&lt;&lt;16)+(url[k+11]&lt;&lt;24));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mixo = mix(a,b,c);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = mixo[0]; b = mixo[1]; c = mixo[2];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k += 12;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; len -= 12;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; c += length;<BR>&nbsp;&nbsp;&nbsp; switch(len)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 11:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c += url[k+10]&lt;&lt;24;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 10:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c+=url[k+9]&lt;&lt;16;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 9 :<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c+=url[k+8]&lt;&lt;8;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 8 :<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b+=(url[k+7]&lt;&lt;24);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 7 :<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b+=(url[k+6]&lt;&lt;16);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 6 :<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b+=(url[k+5]&lt;&lt;8);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 5 :<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b+=(url[k+4]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 4 :<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a+=(url[k+3]&lt;&lt;24);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 3 :<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a+=(url[k+2]&lt;&lt;16);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 2 :<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a+=(url[k+1]&lt;&lt;8);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1 :<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a+=(url[k+0]);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; mixo = mix(a,b,c);<BR>&nbsp;&nbsp;&nbsp; if (mixo[2] &lt; 0)<BR>&nbsp;&nbsp;&nbsp; return (0x100000000 + mixo[2]);<BR>&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp; return mixo[2];<BR>}</P>
<P>function myfmod(x,y)<BR>{<BR>&nbsp;var i = Math.floor(x/y);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (x - i*y);<BR>}<BR>function c32to8bit(arr32) <BR>{<BR>&nbsp;&nbsp;&nbsp; var arr8 = new Array(); <BR>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;arr32.length;i++) <BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; for (bitOrder=i*4;bitOrder&lt;=i*4+3;bitOrder++) <BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr8[bitOrder]=arr32[i]&amp;255;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr32[i]=zeroFill(arr32[i], 8);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; return arr8;<BR>}<BR>function GoogleNewCh(ch)<BR>{<BR>&nbsp;ch = (((ch/7) &lt;&lt; 2) | ((myfmod(ch,13))&amp;7));<BR>&nbsp;prbuf = new Array();<BR>&nbsp;prbuf[0] = ch;<BR>&nbsp;for(i = 1; i &lt; 20; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prbuf[i] = prbuf[i-1]-9;<BR>&nbsp;}<BR>&nbsp;ch = GoogleCH(c32to8bit(prbuf), 80);<BR>&nbsp;return ch;<BR>&nbsp; <BR>}</P>
<P>function URLencode(sStr)<BR>{<BR>&nbsp;return encodeURIComponent(sStr).replace(/\+/g,"%2B").replace(/\//g,"%2F");<BR>}</P>
<P>function strord(s)<BR>{<BR>&nbsp;&nbsp;&nbsp; var re = new Array();<BR>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;s.length;i++)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; re[i] = s.charCodeAt(i);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; return re;<BR>}</P>
<P>function getGoogleHostInfo(url){<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; var reqgr = "info:" + url;<BR>&nbsp;&nbsp;&nbsp; var reqgre = "info:" + URLencode(url);<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; gch = GoogleCH(strord(reqgr));<BR>&nbsp;&nbsp;&nbsp; gch = "6" + GoogleNewCh(gch);<BR>&nbsp;&nbsp;&nbsp; var querystring = "<A href="http://toolbarqueries.google.com/search?client=navclient-auto&amp;ch">http://toolbarqueries.google.com/search?client=navclient-auto&amp;ch</A>=" + gch + "&amp;ie=UTF-8&amp;oe=UTF-8&amp;features=Rank:FVN&amp;q=" + reqgre;</P>
<P><BR>&nbsp;var objXMLHTTP, xml;<BR>&nbsp;try{<BR>&nbsp;&nbsp;xml = Server.createObject("MSXML2.ServerXMLHTTP");<BR>&nbsp;&nbsp;xml.setTimeouts(5000,5000,5000,5000);<BR>&nbsp;&nbsp; xml.open("GET", querystring, false);<BR>&nbsp;&nbsp; xml.setRequestHeader( "User-Agent", "Mozilla/4.0 (compatible; GoogleToolbar 2.0.114-big; WindowsXP 5.1)" );<BR>&nbsp;&nbsp; xml.send();</P>
<P><BR>&nbsp;&nbsp; return xml.responseText;<BR>&nbsp;}catch(exception){<BR>&nbsp;&nbsp;return("Rank_0:0:0");<BR>&nbsp;}<BR>}</P>
<P>function getPageRank(temp){</P>
<P>&nbsp; var foo = temp.match(/Rank_.*?:.*?:(\d+)/i);<BR>&nbsp; var pr = (foo) ? foo[1] : '0';<BR>&nbsp; return pr;<BR>}</P>
<P><BR>function getPR() {<BR>&nbsp;&nbsp;var google;<BR>&nbsp;&nbsp;var pagerank;<BR>&nbsp;&nbsp;if(obUrl != ""){<BR>&nbsp;&nbsp;&nbsp;google = getGoogleHostInfo(obUrl);<BR>&nbsp;&nbsp;&nbsp;pagerank = getPageRank(google);<BR>&nbsp;&nbsp;}else{<BR>&nbsp;&nbsp;&nbsp;pagerank = 0;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return pagerank;<BR>}<BR>Response.write("pr="+pr);<BR>&lt;/SCRIPT&gt;<BR></P>]]></summary>
	  <link rel="alternate" type="text/html" href="http://tank.tank.tw/article/ASP/PageRank.htm" /> 
	  <id>http://tank.tank.tw/default.asp?id=690</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[ADO Command 對象]]></title>
	  <author>
		 <name>tank</name>
		 <uri>http://tank.tank.tw/</uri>
		 <email>tank@tank.tw</email>
	  </author>
	  <category term="" scheme="http://tank.tank.tw/default.asp?cateID=14" label="Tank ASP" /> 
	  <updated>2006-10-23T04:05:28+08:00</updated>
	  <published>2006-10-23T04:05:28+08:00</published>
		  <summary type="html"><![CDATA[<P>ADO Command 對象<BR>Command 對像定義了將對資料源執行的指定命令。<BR><IMG src="http://tank.tank.tw/UploadFiles/2006-10/1023380862.jpg"><BR>使用 Command 對象查詢資料庫並返回 Recordset 對像中的記錄，以便執行大量操作或處理資料庫結構。取決於提供者的功能，某些 Command 集合、方法或屬性被引用時可能會產生錯誤。</P>
<P>可以使用 Command 對象的集合、方法、屬性進行下列操作： </P>
<P><BR>&nbsp;</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">
<P>使用 CommandText 屬性定義命令（例如，SQL 語句）的可執行文本。</P>
<P>通過 Parameter 對像和 Parameters 集合定義參數化查詢或存儲過程參數。</P>
<P>可使用 Execute 方法執行命令並在適當的時候返回 Recordset 對象。</P>
<P>執行前應使用 CommandType 屬性指定命令類型以優化性能。</P>
<P>使用 Prepared 屬性決定提供者是否在執行前保存準備好（或編譯好）的命令版本。</P>
<P>使用 CommandTimeout 屬性設置提供者等待命令執行的秒數。</P>
<P>通過設置 ActiveConnection 屬性使打開的連接與 Command 對像關聯。</P>
<P>設置 Name 屬性將 Command 標識為與 Connection 對像關聯的方法。</P>
<P>將 Command 對像傳送給 Recordset 的 Source 屬性以便獲取資料。</P></DIV>
<P>注意 如果不想使用 Command 對像執行查詢，請將查詢字元串傳送給Connection 對象的 Execute 方法或 Recordset 對象的 Open 方法。但是，當需要使命令文本具有持久性並重新執行它，或使用查詢參數時，則必須使用 Command 對象。</P>
<P>要獨立於先前已定義的 Connection 對像建立 Command 對象，請將它的 ActiveConnection 屬性設置為有效的連接字元串。ADO 仍將建立 Connection 對象，但它不會將該對像賦給對像變量。但是，如果正在將多個 Command 對象與同一個連接關聯，則必須顯式建立並打開 Connection 對象，這樣即可將 Connection 對像賦給對像變量。如果沒有將 Command 對象的 ActiveConnection 屬性設置為該對像變量，則即使使用相同的連接字元串，ADO 也將為每個 Command 對像建立新的 Connection 對象。</P>
<P>要執行 Command，只需通過它所關聯的 Connection 對象的 Name 屬性，將其簡單調用即可。必須將 Command 的 ActiveConnection 屬性設置為 Connection 對象。如果 Command 帶有參數，則將這些參數的值作為參數傳送給方法。</P>
<P>如果在相同連接上執行兩個或多個 Command 對象，並且某個 Command 對象是帶輸出參數的存儲過程，這時會發生錯誤。要執行各個 Command 對象，請使用獨立的連接或將所有其他 Command 對象的連接斷開。</P>
<P>================================================</P>
<P>&lt;%<BR>Set conn = Server.CreateObject("ADODB.Connection")<BR>Set cmd = Server.CreateObject("ADODB.Command")<BR>conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &amp; Server.MapPath("db1.mdb")</P>
<P>cmd.ActiveConnection = conn <BR><FONT color=#777777>'ActiveConnection屬性使打開的連接與 Command 對像關聯<BR></FONT>cmd.CommandText = "getdata" <BR><FONT color=#777777>'CommandText 屬性定義命令，可在ACCESS的查詢表中建立查詢表（表名亦即存儲過程名稱），或直接書寫SQL語句</FONT><BR>Set rs = cmd.Execute <BR><FONT color=#777777>'Execute 方法執行命令並在適當的時候返回 Recordset 對像</FONT><BR>'..............<BR>'應用rs，可輸出記錄<BR>%&gt;<BR></P>]]></summary>
	  <link rel="alternate" type="text/html" href="http://tank.tank.tw/article/ASP/ADO Command 對象.htm" /> 
	  <id>http://tank.tank.tw/default.asp?id=687</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[抽取10萬條資料，想起GetRows()]]></title>
	  <author>
		 <name>tank</name>
		 <uri>http://tank.tank.tw/</uri>
		 <email>tank@tank.tw</email>
	  </author>
	  <category term="" scheme="http://tank.tank.tw/default.asp?cateID=14" label="Tank ASP" /> 
	  <updated>2006-10-23T04:00:56+08:00</updated>
	  <published>2006-10-23T04:00:56+08:00</published>
		  <summary type="html"><![CDATA[<P>抽取10萬條資料，想起GetRows()&nbsp; <BR>現有10W條資料，Access資料庫保存</P>
<P>通過正常提取：</P>
<P><BR>&lt;%<BR>Set conn= Server.CreateObject("ADODB.Connection")<BR>connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&amp;Server.MapPath("db2.mdb")<BR>conn.Open connstr</P>
<P>Set rs = Server.CreateObject ("ADODB.Recordset")<BR>sql = "Select * from people order by id desc"<BR>rs.Open sql,conn,1,1</P>
<P>Do While Not rs.EOF<BR>&nbsp;&nbsp;&nbsp; Response.write rs("id")&amp;" | "<BR>&nbsp;&nbsp;&nbsp; rs.MoveNext<BR>Loop<BR>%&gt;</P>
<P>&nbsp;</P>
<P><A href="http://www.cnbruce.com/test/getrows/show1.asp">http://www.cnbruce.com/test/getrows/show1.asp</A> </P>
<P>耗時3,250.000毫秒，總測試平均值在3秒左右</P>
<P>==========================================================</P>
<P>使用存儲過程提取：</P>
<P><BR>&lt;%<BR>Set conn = Server.CreateObject("ADODB.Connection")<BR>Set cmd = Server.CreateObject("ADODB.Command")<BR>conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &amp; Server.MapPath("db2.mdb")</P>
<P>cmd.ActiveConnection = conn<BR>cmd.CommandText = "Select * from people order by id desc"<BR>Set rs = cmd.Execute</P>
<P>Do While Not rs.EOF<BR>Response.write rs("id")&amp;" | "<BR>rs.MoveNext<BR>Loop<BR>%&gt;</P>
<P>&nbsp;</P>
<P><A href="http://www.cnbruce.com/test/getrows/show2.asp">http://www.cnbruce.com/test/getrows/show2.asp</A> </P>
<P>耗時2,187.500毫秒，總測試平均值在2秒左右</P>
<P>=========================================================</P>
<P>以上兩種均不能徹底解決執行時間漫長的問題，主要原因即是循環每次都須向資料庫抽取記錄（Command速度相對較快）</P>
<P>那麼使用GetRows()方法呢：</P>
<P><BR>&lt;%<BR>Set conn = Server.CreateObject("ADODB.Connection")<BR>Set cmd = Server.CreateObject("ADODB.Command")</P>
<P>conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &amp; Server.MapPath("db2.mdb")<BR>cmd.ActiveConnection = conn<BR>cmd.CommandText = "Select * from people order by id desc"<BR>Set rs = cmd.Execute<BR>rsArray = rs.GetRows()</P>
<P>For i = 0 To UBound(rsArray, 2)<BR>Response.Write rsArray(0, i)&amp;" | "<BR>Next<BR>%&gt;</P>
<P>&nbsp;</P>
<P><A href="http://www.cnbruce.com/test/getrows/show3.asp">http://www.cnbruce.com/test/getrows/show3.asp</A> </P>
<P>耗時187.500毫秒，總測試平均值在0.2秒左右</P>
<P>GetRows()方法是將資料從 Recordset 複製到二維數組中，這是一個二維數組，第一個下標標識字段，第二個則標識記錄號</P>
<P>所以rsArray = rs.GetRows()<BR>rsArray(0, 0)就表示記錄集第一行的第一字段值<BR>rsArray(1, 0)就表示記錄集第一行的第二字段值</P>
<P>數組的資料是保存在內存中的，這就從根本上解決了每次顯示記錄還需向資料庫請求的麻煩。</P>
<P>另外，關於GetRows()的詳細介紹和用法，這裡有份內容參考</P>
<P><A href="http://www.51windows.net/pages/Ado/mdmthgetrows.htm">http://www.51windows.net/pages/Ado/mdmthgetrows.htm</A> </P>
<P><A href="http://www.blueidea.com/tech/program/2005/2853.asp">http://www.blueidea.com/tech/program/2005/2853.asp</A> </P>]]></summary>
	  <link rel="alternate" type="text/html" href="http://tank.tank.tw/article/ASP/抽取10萬條資料，想起GetRows().htm" /> 
	  <id>http://tank.tank.tw/default.asp?id=686</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[超強 過濾HTML代碼的函數包括過濾CSS和JS]]></title>
	  <author>
		 <name>tank</name>
		 <uri>http://tank.tank.tw/</uri>
		 <email>tank@tank.tw</email>
	  </author>
	  <category term="" scheme="http://tank.tank.tw/default.asp?cateID=14" label="Tank ASP" /> 
	  <updated>2006-10-23T02:51:30+08:00</updated>
	  <published>2006-10-23T02:51:30+08:00</published>
		  <summary type="html"><![CDATA[<P>'過濾HTML代碼的函數包括過濾CSS和JS<BR>Function RemoveHTML(strHTML)<BR>StrHtml = Replace(StrHtml,vbCrLf,"")<BR>StrHtml = Replace(StrHtml,Chr(13)&amp;Chr(10),"")<BR>StrHtml = Replace(StrHtml,Chr(13),"")<BR>StrHtml = Replace(StrHtml,Chr(10),"")<BR>StrHtml = Replace(StrHtml," ","")<BR>StrHtml = Replace(StrHtml,"&nbsp;&nbsp;&nbsp; ","")<BR>&nbsp;Dim objRegExp, Match, Matches <BR>&nbsp;Set objRegExp = New Regexp<BR>&nbsp;objRegExp.IgnoreCase = True<BR>&nbsp;objRegExp.Global = True<BR>&nbsp;'取閉合的&lt;&gt;<BR>&nbsp;objRegExp.Pattern = ""<BR>&nbsp;'進行匹配<BR>&nbsp;Set Matches = objRegExp.Execute(strHTML)<BR>&nbsp;' 遍歷匹配集合，並替換掉匹配的項目<BR>&nbsp;For Each Match in Matches <BR>&nbsp;strHtml=Replace(strHTML,Match.Value,"")<BR>&nbsp;Next<BR>&nbsp; '取閉合的&lt;&gt;<BR>&nbsp;objRegExp.Pattern = ""<BR>&nbsp;'進行匹配<BR>&nbsp;Set Matches = objRegExp.Execute(strHTML)<BR>&nbsp;' 遍歷匹配集合，並替換掉匹配的項目<BR>&nbsp;For Each Match in Matches <BR>&nbsp;strHtml=Replace(strHTML,Match.Value,"")<BR>&nbsp;Next<BR>&nbsp; '取閉合的&lt;&gt;<BR>&nbsp;objRegExp.Pattern = "&lt;.+?&gt;"<BR>&nbsp;'進行匹配<BR>&nbsp;Set Matches = objRegExp.Execute(strHTML)<BR>&nbsp;' 遍歷匹配集合，並替換掉匹配的項目<BR>&nbsp;For Each Match in Matches <BR>&nbsp;strHtml=Replace(strHTML,Match.Value,"")<BR>&nbsp;Next<BR>&nbsp;RemoveHTML=strHTML<BR>&nbsp;Set objRegExp = Nothing<BR>End Function</P>
<P>&nbsp;</P>
<P><FONT color=#c43c72>檢測字串出現的次數<BR></FONT>Function CheckTheChar(TheChar,TheString)<BR>'TheChar="要檢測的字串"<BR>'TheString="待檢測的字串"<BR>if inStr(TheString,TheChar) then<BR>for n =1 to Len(TheString)<BR>if Mid(TheString,n,Len(TheChar))=TheChar then <BR>CheckTheChar=CheckTheChar+1<BR>End if<BR>Next<BR>CheckTheChar="這個字元"&amp;CheckTheChar&amp;"次"<BR>else<BR>CheckTheChar="0次"<BR>end if<BR>End Function<BR></P>
<P><BR><BR>&lt;%<BR>'函數功能：把文章內容中涉及到的圖片自動保存到本地伺服器。（注意：請先在目錄下建立tempfile目錄，用來保存臨時圖片）<BR>'作者：小灰<BR>'QQ:103895<BR>'主頁:http://asp2004.net<BR>'2004.9.13<BR>'轉載或使用請不要刪除上面這些訊息。謝謝！</P>
<P>const savepath="tempfile/"</P>
<P>function myreplace(str)<BR>newstr=str<BR>set objregEx = new RegExp<BR>objregEx.IgnoreCase = tru]]></summary>
	  <link rel="alternate" type="text/html" href="http://tank.tank.tw/article/ASP/超強 過濾HTML代碼的函數包括過濾CSS和JS.htm" /> 
	  <id>http://tank.tank.tw/default.asp?id=681</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[ASP中利用OWC控件實現圖表功能詳解]]></title>
	  <author>
		 <name>tank</name>
		 <uri>http://tank.tank.tw/</uri>
		 <email>tank@tank.tw</email>
	  </author>
	  <category term="" scheme="http://tank.tank.tw/default.asp?cateID=14" label="Tank ASP" /> 
	  <updated>2006-06-25T08:18:04+08:00</updated>
	  <published>2006-06-25T08:18:04+08:00</published>
		  <summary type="html"><![CDATA[<P>ASP中利用OWC控件實現圖表功能詳解<BR>　　在ASP中利用OWC（Office Web Components）控件可輕鬆實現各種圖表功能，如餅圖，簇狀柱型圖，折線圖等。<BR>　　在下面的代碼中我詳細的給出了餅圖，簇狀柱型圖，折線圖的使用方法。OWC的更多功能，屬性可參加MSOWCVBA.chm幫助文件（在office 2000的文件夾下大家自己找）。</P>
<P>testOWC.asp</P>
<P>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<BR>&lt;html&gt;<BR>&lt;head&gt;<BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=BIG5"&gt;<BR>&lt;title&gt;ASP中利用OWC控件實現圖表功能詳解&lt;/title&gt;<BR>&lt;/head&gt;<BR>&lt;body&gt;<BR>&lt;%<BR>'下面測試的是一個產品銷量圖<BR>MX1 = "A產品,B產品,C產品,D產品"&nbsp; '資料項目名數組（給出測試資料，實際用的時候從資料庫讀取用","分隔）<BR>MX2 = "50,60,20,80"&nbsp;&nbsp;&nbsp;&nbsp; '資料項目值數組<BR>Datestr = "2005-3-24,2005-3-25,2005-3-26,2005-3-27,2005-3-28"&nbsp;&nbsp; '日期<BR>SQARXLstr = "50,100,20,80,89"&nbsp; 'A產品2005-3-24 至 2005-3-28的銷量<BR>SQARXLstr = SQARXLstr &amp; "," &amp; "40,60,20,90,70"&nbsp; 'B產品2005-3-24 至 2005-3-28的銷量<BR>SQARXLstr = SQARXLstr &amp; "," &amp; "20,50,55,25,60"&nbsp; 'C產品2005-3-24 至 2005-3-28的銷量<BR>SQARXLstr = SQARXLstr &amp; "," &amp; "80,20,75,58,100"&nbsp; 'D產品2005-3-24 至 2005-3-28的銷量<BR>%&gt;<BR>&lt;br&gt;<BR>&lt;center&gt;&lt;object id="ChartSpace1" classid="CLSID:0002E500-0000-0000-C000-000000000046" style="width:95%;height:400"&gt;&lt;/object&gt;&lt;/center&gt;<BR>&lt;br&gt;<BR>&lt;center&gt;&lt;object id="ChartSpace2" classid="CLSID:0002E500-0000-0000-C000-000000000046" style="width:95%;height:400"&gt;&lt;/object&gt;&lt;/center&gt;<BR>&lt;br&gt;<BR>&lt;center&gt;&lt;object id="ChartSpace3" classid="CLSID:0002E500-0000-0000-C000-000000000046" style="width:95%;height:400"&gt;&lt;/object&gt;&lt;/center&gt;</P>
<P>&lt;script language="vbscript"&gt;<BR>Sub Window_OnLoad()<BR>'------------------餅圖-------------------------------------------------------------<BR>'為資料賦值<BR>categories = split("&lt;%=MX1%&gt;",",") '資料項目名數組<BR>values = split("&lt;%=MX2%&gt;",",")&nbsp; '資料項目值數組</P>
<P>Set cht = ChartSpace1.Charts.Add '添加一個圖標對像<BR>Set c = ChartSpace1.Constants&nbsp; '返回一個對象，此對像允許腳本用戶使用已命名的常量。<BR>cht.Type = c.chChartTypePie&nbsp;&nbsp; '設置圖表類型為餅圖</P>
<P>'-------設置圖表標題----------------------------------------<BR>ChartSpace1.HasChartSpaceTitle = True&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '指定圖表工作區中包含標題<BR>&nbsp;&nbsp;&nbsp; ChartSpace1.ChartSpaceTitle.Caption = "餅狀圖"&nbsp;&nbsp;&nbsp; '設置圖表工作區標題內容<BR>&nbsp;&nbsp;&nbsp; '有關字體的設置<BR>&nbsp;&nbsp;&nbsp; ChartSpace1.ChartSpaceTitle.Font.Bold = True&nbsp;&nbsp;&nbsp; '設置圖表工作區標題內容是否粗體<BR>&nbsp;&nbsp;&nbsp; ChartSpace1.ChartSpaceTitle.Font.Color = "blue"&nbsp;&nbsp;&nbsp; '設置圖表工作區標題的顏色<BR>&nbsp;&nbsp;&nbsp; ChartSpace1.ChartSpaceTitle.Font.Italic = False&nbsp;&nbsp;&nbsp; '設置圖表工作區標題是否為斜體<BR>&nbsp;&nbsp;&nbsp; ChartSpace1.ChartSpaceTitle.Font.Name = "隸書"&nbsp;&nbsp;&nbsp; '設置圖表工作區標題內容的字體<BR>&nbsp;&nbsp;&nbsp; ChartSpace1.ChartSpaceTitle.Font.Size = 18&nbsp;&nbsp;&nbsp;&nbsp; '設置圖表工作區標題內容的大小（單位：磅）<BR>&nbsp;&nbsp;&nbsp; ChartSpace1.ChartSpaceTitle.Font.Underline = c.owcUnderlineStyleSingle '設置下劃線屬性<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; '-------設置圖例--------------------------------------------<BR>cht.HasLegend = True&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '指定圖表工作區中含有圖例<BR>&nbsp;&nbsp;&nbsp; cht.Legend.Font.Size = 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '其他有關字體項的設置參見設置圖表標題部分<BR>&nbsp;&nbsp;&nbsp; cht.Legend.Position = c.chLegendPositionRight&nbsp;&nbsp;&nbsp; '設置圖例對其方式<BR>&nbsp;&nbsp;&nbsp; <BR>cht.SetData c.chDimCategories, c.chDataLiteral, categories<BR>cht.SeriesCollection(0).SetData c.chDimValues, c.chDataLiteral, values</P>
<P>Set dl = cht.SeriesCollection(0).DataLabelsCollection.Add '添加圖例的資料標記<BR>dl.HasValue = False<BR>dl.HasPercentage = True<BR>dl.Font.Size = 11<BR>'------------------餅圖（結束）------------------------------------------------</P>
<P>'------------------簇狀柱型圖（開始）--------------------------------------<BR>Set cht = ChartSpace2.Charts.Add&nbsp; '添加一個圖標對像<BR>Set c = ChartSpace2.Constants&nbsp;&nbsp; '返回一個對象，此對像允許腳本用戶使用已命名的常量。<BR>cht.Type = c.chChartTypeColumnClustered&nbsp; '設置圖表類型為折線圖<BR>'-------設置圖表標題----------------------------------------<BR>ChartSpace2.HasChartSpaceTitle = True&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '指定圖表工作區中包含標題<BR>&nbsp;&nbsp;&nbsp; ChartSpace2.ChartSpaceTitle.Caption = "柱狀圖"&nbsp;&nbsp;&nbsp; '設置圖表工作區標題內容<BR>&nbsp;&nbsp;&nbsp; '有關字體的設置<BR>&nbsp;&nbsp;&nbsp; ChartSpace2.ChartSpaceTitle.Font.Bold = True&nbsp;&nbsp;&nbsp; '設置圖表工作區標題內容是否粗體<BR>&nbsp;&nbsp;&nbsp; ChartSpace2.ChartSpaceTitle.Font.Color = "blue"&nbsp;&nbsp;&nbsp; '設置圖表工作區標題的顏色<BR>&nbsp;&nbsp;&nbsp; ChartSpace2.ChartSpaceTitle.Font.Italic = False&nbsp;&nbsp;&nbsp; '設置圖表工作區標題是否為斜體<BR>&nbsp;&nbsp;&nbsp; ChartSpace2.ChartSpaceTitle.Font.Name = "隸書"&nbsp;&nbsp;&nbsp; '設置圖表工作區標題內容的字體<BR>&nbsp;&nbsp;&nbsp; ChartSpace2.ChartSpaceTitle.Font.Size = 18&nbsp;&nbsp;&nbsp;&nbsp; '設置圖表工作區標題內容的大小（單位：磅）<BR>&nbsp;&nbsp;&nbsp; ChartSpace2.ChartSpaceTitle.Font.Underline = c.owcUnderlineStyleSingle '設置下劃線屬性<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>cht.SetData c.chDimCategories, c.chDataLiteral, categories&nbsp; '橫項（分類軸）<BR>cht.SeriesCollection(0).SetData c.chDimValues, c.chDataLiteral, values<BR>&nbsp;&nbsp;&nbsp; Set dl = cht.SeriesCollection(0).DataLabelsCollection.Add&nbsp; '添加圖例的資料標記<BR>dl.HasValue = True<BR>dl.HasPercentage = False<BR>dl.Font.Size = 9<BR>dl.Font.Color = "red"<BR>dl.Position = c.chLegendPositionRight</P>
<P>'設置縱向數值屬性<BR>Set categoryAxis = cht.Axes(c.chAxisPositionBottom)<BR>categoryAxis.Font.Size = 9<BR>'設置分類組屬性<BR>Set categoryAxis = cht.Axes(c.chAxisPositionLeft)<BR>categoryAxis.Font.Size = 9<BR>'------------------簇狀柱型圖（結束）--------------------------------------</P>
<P>'------------------折線圖----------------------------------------------------------<BR>SParr = split("&lt;%=MX1%&gt;",",")<BR>Datearr = split("&lt;%=Datestr%&gt;",",") </P>
<P>Set cht = ChartSpace3.Charts.Add&nbsp; '添加一個圖標對像<BR>Set c = ChartSpace3.Constants&nbsp;&nbsp; '返回一個對象，此對像允許腳本用戶使用已命名的常量。<BR>cht.Type = c.chChartTypeLineMarkers&nbsp; '設置圖表類型為折線圖</P>
<P>'-------設置圖表標題----------------------------------------<BR>ChartSpace3.HasChartSpaceTitle = True&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '指定圖表工作區中包含標題<BR>&nbsp;&nbsp;&nbsp; ChartSpace3.ChartSpaceTitle.Caption = "日銷量折線圖"&nbsp; '設置圖表工作區標題內容<BR>&nbsp;&nbsp;&nbsp; '有關字體的設置<BR>&nbsp;&nbsp;&nbsp; ChartSpace3.ChartSpaceTitle.Font.Bold = True&nbsp;&nbsp;&nbsp; '設置圖表工作區標題內容是否粗體<BR>&nbsp;&nbsp;&nbsp; ChartSpace3.ChartSpaceTitle.Font.Color = "blue"&nbsp;&nbsp;&nbsp; '設置圖表工作區標題的顏色<BR>&nbsp;&nbsp;&nbsp; ChartSpace3.ChartSpaceTitle.Font.Italic = False&nbsp;&nbsp;&nbsp; '設置圖表工作區標題是否為斜體<BR>&nbsp;&nbsp;&nbsp; ChartSpace3.ChartSpaceTitle.Font.Name = "隸書"&nbsp;&nbsp;&nbsp; '設置圖表工作區標題內容的字體<BR>&nbsp;&nbsp;&nbsp; ChartSpace3.ChartSpaceTitle.Font.Size = 18&nbsp;&nbsp;&nbsp;&nbsp; '設置圖表工作區標題內容的大小（單位：磅）<BR>&nbsp;&nbsp;&nbsp; ChartSpace3.ChartSpaceTitle.Font.Underline = c.owcUnderlineStyleSingle '設置下劃線屬性<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; '-------設置圖例--------------------------------------------<BR>cht.HasLegend = True&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '指定圖表工作區中含有圖例<BR>&nbsp;&nbsp;&nbsp; cht.Legend.Font.Size = 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '其他有關字體項的設置參見設置圖表標題部分<BR>&nbsp;&nbsp;&nbsp; cht.Legend.Position = c.chLegendPositionBottom&nbsp;&nbsp;&nbsp; '設置圖例對其方式<BR>&nbsp;&nbsp;&nbsp; <BR>cht.SetData c.chDimSeriesNames, c.chDataLiteral, SParr&nbsp; '系列<BR>cht.SetData c.chDimCategories, c.chDataLiteral, Datearr&nbsp; '橫項（分類軸）</P>
<P>'設置縱向數值屬性<BR>Set categoryAxis = cht.Axes(c.chAxisPositionBottom)<BR>categoryAxis.Font.Size = 9</P>
<P>'設置分類組屬性<BR>Set categoryAxis = cht.Axes(c.chAxisPositionLeft)<BR>categoryAxis.Font.Size = 9</P>
<P>values = split("&lt;%=SQARXLstr%&gt;",",")<BR>for i = 0 to ubound(SParr)<BR>&nbsp;&nbsp; valuetemp = ""<BR>&nbsp;&nbsp; for j = i*(ubound(Datearr)+1) to (i+1)*(ubound(Datearr)+1)-1&nbsp; '按天讀取資料<BR>&nbsp;&nbsp;&nbsp;&nbsp; valuetemp = valuetemp &amp; "," &amp; values(j)<BR>&nbsp;&nbsp; next<BR>&nbsp;&nbsp; valuearr = split(mid(valuetemp,2),",")<BR>&nbsp;&nbsp; cht.SeriesCollection(i).SetData c.chDimValues, c.chDataLiteral, valuearr<BR>&nbsp;&nbsp; Set dl = cht.SeriesCollection(i).DataLabelsCollection.Add&nbsp; '添加圖例的資料標記<BR>&nbsp;&nbsp; dl.HasValue = True<BR>&nbsp;&nbsp; dl.HasPercentage = False<BR>&nbsp;&nbsp; dl.Font.Size = 9<BR>next<BR>'------------------折線圖（結束）---------------------------------------------------<BR>End Sub<BR>&lt;/script&gt;<BR>&lt;/body&gt;<BR>&lt;/html&gt;<BR></P>]]></summary>
	  <link rel="alternate" type="text/html" href="http://tank.tank.tw/article/ASP/ASP中利用OWC控件實現圖表功能詳解.htm" /> 
	  <id>http://tank.tank.tw/default.asp?id=607</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[ASP上兩個防止SQL注入式攻擊Function]]></title>
	  <author>
		 <name>tank</name>
		 <uri>http://tank.tank.tw/</uri>
		 <email>tank@tank.tw</email>
	  </author>
	  <category term="" scheme="http://tank.tank.tw/default.asp?cateID=14" label="Tank ASP" /> 
	  <updated>2006-06-25T08:16:22+08:00</updated>
	  <published>2006-06-25T08:16:22+08:00</published>
		  <summary type="html"><![CDATA[<P>ASP上兩個防止SQL注入式攻擊Function<BR>''==========================<BR>''過濾提交表單中的SQL<BR>''==========================<BR>function ForSqlForm()<BR>dim fqys,errc,i,items<BR>dim nothis(18) <BR>nothis(0)="net user" <BR>nothis(1)="xp_cmdshell" <BR>nothis(2)="/add" <BR>nothis(3)="exec%20master.dbo.xp_cmdshell" <BR>nothis(4)="net localgroup administrators" <BR>nothis(5)="select" <BR>nothis(6)="count" <BR>nothis(7)="asc" <BR>nothis(8)="char" <BR>nothis(9)="mid" <BR>nothis(10)="''" <BR>nothis(11)=":" <BR>nothis(12)="""" <BR>nothis(13)="insert" <BR>nothis(14)="delete" <BR>nothis(15)="drop" <BR>nothis(16)="truncate" <BR>nothis(17)="from" <BR>nothis(18)="%"<BR>'nothis(19)="@"&nbsp; </P>
<P>errc=false </P>
<P>for i= 0 to ubound(nothis) <BR>&nbsp; for each items in request.Form<BR>&nbsp; if instr(request.Form(items),nothis(i))&lt;&gt;0 then <BR>&nbsp;&nbsp; response.write("&lt;div&gt;")<BR>&nbsp;&nbsp; response.write("你所填寫的訊息:" &amp; server.HTMLEncode(request.Form(items)) &amp; "&lt;br&gt;含非法字元:" &amp; nothis(i))<BR>&nbsp;&nbsp; response.write("&lt;/div&gt;")<BR>&nbsp;&nbsp; response.write("對不起,你所填寫的訊息含非法字元！&lt;a href=""#"" onclick=""history.back()""&gt;返回&lt;/a&gt;")<BR>&nbsp;&nbsp; response.End()<BR>&nbsp; end if <BR>&nbsp; next<BR>next <BR>end function<BR>''==========================<BR>''過濾查詢中的SQL<BR>''==========================<BR>function ForSqlInjection()<BR>dim fqys,errc,i<BR>dim nothis(19) <BR>fqys = request.ServerVariables("QUERY_STRING")<BR>nothis(0)="net user" <BR>nothis(1)="xp_cmdshell" <BR>nothis(2)="/add" <BR>nothis(3)="exec%20master.dbo.xp_cmdshell" <BR>nothis(4)="net localgroup administrators" <BR>nothis(5)="select" <BR>nothis(6)="count" <BR>nothis(7)="asc" <BR>nothis(8)="char" <BR>nothis(9)="mid" <BR>nothis(10)="''" <BR>nothis(11)=":" <BR>nothis(12)="""" <BR>nothis(13)="insert" <BR>nothis(14)="delete" <BR>nothis(15)="drop" <BR>nothis(16)="truncate" <BR>nothis(17)="from" <BR>nothis(18)="%"<BR>nothis(19)="@"&nbsp; </P>
<P>errc=false </P>
<P>for i= 0 to ubound(nothis) <BR>&nbsp;if instr(FQYs,nothis(i))&lt;&gt;0 then <BR>&nbsp;&nbsp;errc=true <BR>&nbsp;end if <BR>next </P>
<P>if errc then <BR>&nbsp;response.write "查詢訊息含非法字元！&lt;a href=""#"" onclick=""history.back()""&gt;返回&lt;/a&gt;" <BR>&nbsp;response.end <BR>end if <BR>end function</P>
<P>&nbsp;=============================================================</P>
<P>我比較喜歡用的程式  把它放在 conn.asp 內</P>
<P>Dim Query_Badword,Form_Badword,i,Err_Message,Err_Web,name</P>
<P>Err_Message = 3&nbsp; '處理方式：1=提示信息,2=轉向頁面,3=先提示再轉向</P>
<P>Err_Web = "/" '出錯時轉向的頁面</P>
<P>'Query_Badword="'∥and∥select∥update∥chr∥delete∥%20from∥;∥insert∥mid∥master.∥set∥chr(37)∥="&nbsp;&nbsp;&nbsp;&nbsp; <BR>Query_Badword="'∥and∥select∥update∥chr∥delete∥%20from∥insert∥mid∥master.∥set∥chr(37)∥="&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>On Error Resume Next</P>
<P>'----- 對 get query 值 的過濾.</P>
<P>if request.QueryString&lt;&gt;"" then<BR>&nbsp;Chk_badword=split(Query_Badword,"∥")<BR>&nbsp;FOR EACH Query_Name IN Request.QueryString<BR>&nbsp;&nbsp;for i=0 to ubound(Chk_badword)<BR>&nbsp;&nbsp;&nbsp;If Instr(LCase(request.QueryString(Query_Name)),Chk_badword(i))&lt;&gt;0 Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;Select Case Err_Message<BR>&nbsp;&nbsp;&nbsp;&nbsp;Case "1"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write "&lt;Script Language=JavaScript&gt;alert('傳參錯誤！參數 "&amp;name&amp;" 的值中包含非法字符串！\n\n請不要在參數中出現：and update delete ; insert mid master 等非法字符！');window.close();&lt;/Script&gt;"<BR>&nbsp;&nbsp;&nbsp;&nbsp;Case "2"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write "&lt;Script Language=JavaScript&gt;location.href='"&amp;Err_Web&amp;"'&lt;/Script&gt;"<BR>&nbsp;&nbsp;&nbsp;&nbsp;Case "3"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write "&lt;Script Language=JavaScript&gt;alert('傳參錯誤！參數 "&amp;name&amp;"的值中包含非法字符串！\n\n請不要在參數中出現：and update delete ; insert mid master 等非法字符！');location.href='"&amp;Err_Web&amp;"';&lt;/Script&gt;"<BR>&nbsp;&nbsp;&nbsp;&nbsp;End Select<BR>&nbsp;&nbsp;&nbsp;&nbsp;Response.End<BR>&nbsp;&nbsp;&nbsp;End If<BR>&nbsp;&nbsp;NEXT<BR>&nbsp;NEXT<BR>End if<BR>&nbsp;</P>]]></summary>
	  <link rel="alternate" type="text/html" href="http://tank.tank.tw/article/ASP/ASP上兩個防止SQL注入式攻擊Function.htm" /> 
	  <id>http://tank.tank.tw/default.asp?id=606</id>
  </entry>	
		
</feed>
