ASP Tips

posted on 03 May 2005 01:55 by teno  in Web-Tech

Save ไว้นานแล้วกลัว หาย อ่ะ เอามาเก้บไว้ที่นี่ น่ะ
'<++===++>
'__บทความเรื่อง ASP Tips
'__โดย นาย ณัฐพล วัฒนวิภัทรเจริญ [Nat]
'__ 19 กรกฎาคม 2545 เวลา 18:35
'__ wnattapon@hotmail.com
'__ www.uthaionline.com
'__ www.uthaionline.com/how2asp

'__ เป็นการเขียน asp ที่ถูกต้อง และเพิ่มประสิทธิภาพการประมวลผล
'__ ส่วนหนึ่งมาจากบทความของฝรั่งนำมายำรวมกัน และจากประสบการณ์ของผม
'<++=++>

Asp Scripts ที่ยาวเกินไป
Include File ที่ใหญ่เกินไป
Redirect
Blocks of ASP
ASP buffer
Disabled Session state
คุณใช้ Server.MapPath หรือเปล่า?
Comment
Procedure Seperators
การประกาศตัวแปล
การใช้ Response.IsClientConnected
ทั่วไป
SQL และ DB




Asp Scripts ที่ยาวเกินไป
ไม่ควรเขียน asp scripts ที่มีการประมวลผลติดต่อกันที่ยาวเกินไป เช่นมากกว่า 300 บรรทัด
ควรแบ่งการประมวลผลออกเป็นช่วงๆ

Include File ที่ใหญ่เกินไป
อย่าคิดว่าการตัดแบ่งเพจยาวๆ ไว้ใน include file จะทำให้การประมวลผลเร็วขึ้น
เพราะว่า asp จะอ่าน include file เป็นอันดับแรก และเก็บไว้ในหน่วยความจำ
จากนั้นก็ complies มารวมกับเพจปัจจุบัน
และถ้าคุณใช้ asp 3.0 อย่าใช้ include file <!--#include file="xxx.htm"--> แบบนี้
ให้ใช้ Server.Execute "xxx.htm" (ใน pws เป็น asp 2.0)
และไม่ควรตั้งชื่อ include file แบบนี้ myincludefile.inc
มันเป็นคำแนะนำที่แย่มากของ microsoft เพราะถ้าใครเดาชื่อไฟล์นี้ได้ เขาจะเห็นข้อมูลทั้งหมด
ให้ใช้ *.htm , *.asp เช่นตั้งชื่อแบบนี้ inc_MyFile.asp

Redirect
ถ้าใช้ asp2 ให้ใช้ Response.redirect "xxx.htm"
ถ้าใช้ asp3 ให้ใช้ Server.Transfer "xxx.htm"

Blocks of ASP (<%....%>)
เขียนอย่างนี้จะช้า
<% If myvar = 1 then %>
The Frog Jumped over the lake
<% else %>
I did not see a frog
<% end if %>
เขียนแบบนี้จะประมวลผลเร็วกว่า
<% If myvar = 1 then
response.write "The Frog Jumped over the lake"
else
response.write "I did not see a frog"
end if %>

ASP buffer
ให้ใส่ Response.Buffer = True ไว้ด้านบนของเพจเสมอ ถ้าใช้ asp2.0
แต่ถ้าใช้ asp3.0 ไม่ต้องใส่ก็ได้ เพราะ default เป็น True อยู่แล้ว
และถ้าเก็บข้อมูลไว้ใน Buffer พอสมควรแล้วก็ควรปล่อยไปให้ Client สักครั้งนึง
โดยใช้ response.flush ที่จริงการทำแบบนี้ทำให้ Performance ต่ำ
แต่ user จะเห็นว่าเร็ว เพราะว่าได้เห็นข้อมูลบน browser บ้าง ไม่ใช้รอจน เต็มแล้วส่งมาทีเดียว
ถ้าคนเข้าเว็บมากๆ แนะนำว่าอย่าใช้ response.flush

Disabled Session state
ถ้าคุณไม่ใช้ session หรือ cookies เลย ในเพจนั้นๆ เลยให้คุณปิดมันซะ
โดยใส่โค็ดนี้ไว้บนสุด
<%@EnableSessionState = False %>

คุณใช้ Server.MapPath หรือเปล่า?
ถ้าคุณใช้มันบ่อย แนะนำว่าให้ใช้ Full Path สำหรับคนที่ไม่คิดจะเปลี่ยนโครงสร้างของ path
หรือแจกโค็ดของคุณให้คนอื่น...
(แต่สำหรับผมแล้ว ผมชอบใช้ Server.MapPath มากกว่า เพราะมันยืดหยุนกับอนาคต แต่ต้องยอมรับว่ามันช้ากว่า Full Path)
และอย่าใช้ Server.MapPath ที่ Path ซ้ำกันมากกว่า 1 ครั้ง
ให้เก็บใส่ตัวแปลซะ

Comment
เขียน comment ให้มากที่สุดเท่าที่ทำได้
และควรเว้นวรรคสัก 1 ครั้งก่อนเพื่อให้อ่านง่าย เช่น
' my comment

Procedure Seperators
เวลามี sub procedure หรือ function ให้ ขีดเส้นแบ่ง เลียนแบบ VB เพื่อให้อ่านง่าย เช่น

' ==
Sub MySub()

End Sub
' ==
และควรวางกลุ่มของ Sub กับ Function ไว้ล่างสุดของเพจ อย่าเอาไปแทรกปนกันมั่วไปหมด
หรือใส่ไว้ใน include file ก็ได้

การประกาศตัวแปล
ถึงแม้ว่าตัวแปลทั้งหมดของ asp จะเป็นแบบ variants ก็ตามที แต่ก็ควรประกาศตัวแปลไว้ให้ติดเป็นนิสัยนะครับ
ให้ใช้ Option Explicit ไว้บนสุด
จากนั้นประกาศตัวแปลของทั้งเพจนั้นไว้ต่อจากนี้ ยกเว้นตัวแปลของ sub หรือ functionอ การตั้งชื่อตัวแปล นิยมตั้งแบบนี้

Dim StrName - String (Unicode)
Dim BinName - String (Ascii)
Dim LngName - Long
Dim IntName - Integer
Dim BytName - Byte
Dim ClsName - Class
Dim ObjName - Object
Dim DtmName - Date/Time
Dim VarName - Variant
Dim BlnName - Boolean

ส่วน Scope ของตัวแปลเป็นแบบนี้

Dim StrName - Page Scope
Dim gStrName - Global Scope (Usually found in Include files)
Dim pStrName - Parameter (Used for arguments passed to Subs and Functions)
Dim lStrName - Local Scope (Used within the subs and functions themselves)

ส่วนตัวแปลค่าคงที่ควรเป็นตัวใหญ่แบบนี้

Const StrTHIS_IS_A_VALUE = "Lewie"
Const LngANOTHER_ONE = 3
Const LngLOOK_HERE = &h0032
ตัวแปลแบบนี้ต้องอยู่บนสุดของเพจสถานเดียว เพื่อง่ายต่อการแก้ไข

ถ้าประกาศตัวแปลแบบ Object เมื่อใช้เสร็จแล้ว ต้องลบออกด้วย เพื่อคืนหน่วยความจำสู่ระบบ

Set ObjName = Nothing

ถ้า object ไหนที่ต้องมีการ ปิด(Close) ก่อน ให้ ปิดเป็นลำดับแบบนี้

ObjRS.Close
Set ObjRS = Nothing
ObjConn.Close
Set ObjConn = Nothing

ถ้าประกาศตัวแปลแบบ Array แล้ว ต้องลบออกด้วย เช่น

Erase MyArray
หรือถ้าไม่แน่ใจว่าเป็น Array หรือเปล่า ให้ใช้

if IsArray(MyArray) then Erase MyArray

การใช้ Response.IsClientConnected
อันนี้มีประโยชน์มากนะครับ ถ้าคุณจะทำการวนลูปเมื่อใด ให้นึกถึงก่อน
คือว่า ในขณะที่ประมวลผลในลูปอยู่เนี่ย เกิด user กด stop ที่ browser (แบบว่าขี้เกียจรอ)
ลูปที่เรายังวนไม่เสร็จ จะไม่หยุดตามไปด้วย ยังคงทำต่อไปจนเสร็จ
ถ้าเราดัก Response.IsClientConnected เอาไว้ เวลา user กด stop ก็จะเลิกวนลูป
ตัวอย่างเช่น

Do until (objRS.EOF) and (Response.IsClientConnected)
.........
.........
Loop
หรือ
For i = 1 to 100
if not Response.IsClientConnected then Exit For
.......
.......
Next

แต่อย่าใช้บ่อยนะครับ ให้ใช้เฉพาะที่วนลูปเยอะๆเท่านั้น
==
ทั่วไป
การส่ง path ไปตาม url ให้ใช้ Server.UrlEncode ก่อน

การใช้ Request.Querystring("xxx") หรือ Request.Form("xxx")
ควรเอามาเก็บใส่ตัวแปลก่อน แล้วนำตัวแปลไปใช้
ไม่ควร Request ตัวแปลนั้นๆมากกว่า 1 ครั้ง

อย่าประกาศตัวแปล session มากเกินไป ส่วนตัวแปล application อย่าใช้เลยจะดีกว่า
เพราะถ้าประกาศแล้วมันจะอยู่กับคุณตลอดชีวิต นอกจาก Restart Server เท่านั้น จึงจะหายไป

อย่าเอา Array หรือ Object ไปเก็บไว้ใน Session หรือ Application

งานไหนที่แบ่งให้ client ทำได้ก็ให้แบ่งไปบ้าง เช่น พวก check การลืมกรอกข้อความ

หลีกเลี่ยงการใช้ https หรือ ssl ถ้าเป็นไปได้


SQL และ DB
ถ้า SQL statements ไม่ยาวมาก ให้ใช้แบบนี้
ObjConn.Execute "Select fld1 from table1;"
ทำให้ประหยัดตัวแปลไปอีกตัว
แต่ถ้ายาวมาก หรือมีการรับค่าด้วย ก็ให้ใส่ตัวแปลเถิด

อย่าใช้ * ใน SQL statements ให้ลงทุนพิมพ์ทีละฟิลด์จนครบ
หรือถ้าเยอะมากให้ access มันเขียนให้ก็ได้

ฟิลด์ที่ใช้เป็นเงือนไขในการค้นหาควรเป็น index
และไม่ควรเป็นฟิลด์ขนาดใหญ่ เช่น varchar(50) (ก็คือฟิลด์ที่เป็นตัวหนังสือ ขนาด 50 ตัวอักษร)

เวลาจะนับ record ไม่ควรเปิด Record Set แล้วใช้ ObjRS.RecordCount
ควรใช้ aggregate functions ที่ชื่อว่า Count()
วิธีใช้คือ
Select Count([Column Name]) AS MyColumm From table1;
แต่การใช้ Count([Column Name]) แบบนี้ จะไม่นับ ฟิลด์ที่เป็น Null นะครับ
ถ้าต้องการให้นับฟิลด์ที่เป็น Null ด้วยให้ใช้ Count(*) ซึ่งการใช้ Count(*) นี้
เร็วกว่า Count([Column Name]) คุณอาจจะงงว่าทำไมถึงเร็วกว่า
มันเร็วกว่าก็ตรงที่ไม่ต้องคำนวนหาฟิลด์ที่เป็น Null คือเปิดขึ้นมาก็นับแหลกเลยรวดเดียว

ถ้าจะ Add ข้อมูล เข้า access ถ้าข้อมุลไม่มากให้ใช้ Insert into
ถ้ามาก และมีการรับค่าตัวแปล ต้องใช้ if - then หรืออะไรอีกมาก ให้เปิด Record Set
โดยใช้ SQL statements แบบนี้

Select fld1,fld2,fldn From table1 where ID = -1;

ID คือ ฟิลด์ที่เป็น index key แบบ autonumber จากนั้นก็ add ข้อมูลตามปกติ
ObjRS.AddNew
......
......
ObjRS.Update

ถ้าฐานข้อมูล(Access) ใช้งานไปเรื่อยๆ จนมีขนาดใหญ่ขึ้น ให้ Compact Database
ทุกๆ 500 Kb เพื่อจัดข้อมูลให้เป็นระเบียบ และทำงานได้เร็วขึ้น
อ่านเรื่องการ Compact db เพิ่มได้ที่
http://www.uthaionline.com/how2asp/ShowCode.asp?id=38

ถ้าจะนำข้อมูลออกมาจาก db เพื่อมาวนลูปใส่ พวก Select Box (List Box)
ให้ใช้ GetString Method
ตัวอย่าง

<%sql="select Forum_ID,Forum_name from forums;"
set rs = conn.execute(sql)
response.write "In forum : <select NAME=""SearchForum"" class=""input"">"
response.write "<option value=0>All Forums</option>"
response.write "<option value="
response.write rs.getstring(,, ">", "</option><option value=", "-null-")
response.write "0>All Forums</option></select>"%>

อ่านเรื่อง GetString Method เพิ่มได้ที่
http://www.uthaionline.com/how2asp/ShowCode.asp?id=36

ถ้าจะนำข้อมูลจำนวนมากมาแสดงออกทางตาราง ให้ใช้ GetRows Method
อย่าคิดที่จะวนลูปแบบ movenext เลย มันช้า
ดูวิธีการใช้ได้ที่ webboard4
http://www.uthaionline.com/how2asp/ShowCode.asp?id=41

อ่านเรื่อง GetRows Method เพิ่มได้ที่
http://www.uthaionline.com/how2asp/ShowCode.asp?id=35



19 ก.ค 45
Nat
ณัฐพล วัฒนวิภัทรเจริญ
wnattapon@hotmail.com
www.uthaionline.com/how2asp
====

Comment



smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry

Tweet

-*- เสียดายเจง ๆ ที่ how2asp ม่ะอยู่ซะแว้ว -*-

#1 By Anjo Caído on 2005-05-03 02:00