PS: บทความที่เขียนโดย KJ Daniel เมื่อวานตอนที่ฉันคุยกับเพื่อน ฉันพูดถึงคำสั่งของ ADO จริงๆ แล้วฉันลืมเรื่องนี้ไปเลย กรุณาอ่านมัน. โดยทั่วไปแล้ว เพื่อนที่เขียนโค้ด ASP PHP อาจจะใช้คำสั่ง SQL โดยตรง~
ดูรหัสต่อไปนี้
-
สลัวคอนอาร์เอส
ตั้งค่า conn=CreateObject(Adodb.Connection)
คอน.เปิด....
set rs=conn.execute(เลือก * จากข่าว);
-
ทราเวิร์ส อาร์....
-
แน่นอนว่าความเร็วในการนำไปใช้งานนั้นเร็ว แต่แน่นอนว่าคำสั่งครึ่งเดียวในตรรกะเชิงโครงสร้างนั้นไม่สำคัญ! ปัญหาเกิดขึ้นเมื่อมีงบมากเกินไป!
พารามิเตอร์ไม่ได้รับการกรอง มีการฉีด SQL ฯลฯ ตกลง ตอนนี้เรามาเปลี่ยนรูปแบบการออกแบบกันดีกว่า!
ใช้โครงสร้าง 3 ชั้น + ORM
ORM: การทำแผนที่ความสัมพันธ์ของวัตถุ
แล้วเทคโนโลยี ORM คืออะไร? เพื่อนๆ ที่คุ้นเคยกับการพัฒนา JAVA .NET คงจะทราบดีอยู่แล้ว...นั่นคือ object-relational mapping
แมปตารางกับคลาสฟิลด์ แมปพวกมันกับคุณสมบัติ และแมปบันทึกกับอ็อบเจ็กต์... ขณะนี้มีเฟรมเวิร์กชั้นคงอยู่ของ JAVA ORM มากมาย
ตัวอย่างเช่น hibernate ibatis EntityBean (หนึ่งใน EJB)
แล้วเอเอสพีล่ะ? เราก็สามารถบรรลุเป้าหมายได้เช่นกัน รอการแนะนำตัว
โครงสร้าง 3 ชั้น: ชั้นการนำเสนอเว็บ, ชั้นกลาง, ชั้นคงอยู่
นี่คือตารางข่าวง่ายๆ
สร้างข่าวตาราง (
รหัสภายใน
ชื่อเรื่อง varchar (200)
ติดต่อวาร์ชาร์(50000)
-
เราแมปมันเป็นคลาส
-
ข่าวชั้นเรียน
รหัสส่วนตัว, ชื่อ, ผู้ติดต่อ
รหัสชุดย่อย(sid)
id=Cint(ซิด)
จบหมวดย่อย
ฟังก์ชัน getID
getID=id
ฟังก์ชันสิ้นสุด
ชื่อชุดย่อย(stitle)
title=mid(stitle,1,200)'จำกัดความยาว
จบหมวดย่อย
-
จบคลาส
-
จากนั้นเราออกแบบโค้ดเกี่ยวกับวิธีการใช้งานฐานข้อมูลและแปลงเป็นอ็อบเจ็กต์
-
คลาส NewsDataAccessObject
คอนเน็กติ่ม rs, cmd
'สอบถามข่าว.
ฟังก์ชัน getNewsByID(id)
set conn=Application(connection)' รับการเชื่อมต่อในกลุ่มการเชื่อมต่อ
set cmd=GetCmd() ' GETCMD การใช้งานฟังก์ชัน return createobject(Adodb.Command)
selectString=select * จาก NEWS โดยที่ id = @id
cmd.ActiveConnection = เชื่อมต่อ
cmd.CommandType = adCmdText ' Const adCmdText=1
cmd.CommandText = เลือกสตริง
'เพิ่มพารามิเตอร์ให้กับ @id เมื่อกี้ adInteger = 3 adParamInput=1 คงที่
cmd.Parameters.Append cmd.CreateParameter(@id, adInteger, adParamInput, , id)
'รันคำสั่ง SQL และส่งคืนชุดผลลัพธ์
ตั้งค่า rs=cmd.execute()
สลัวอีกครั้ง
ตั้งใหม่=ข่าวใหม่
ถ้า rs.eof แล้ว
อื่น
ใหม่.setID(rs(id)&)
anew.setTitle(rs(ชื่อ)&)
anew.setContect(อาร์เอส(Contect)&)
สิ้นสุดถ้า
RS.ปิด
ตั้งค่า rs=nothing
ตั้งค่า cmd=ไม่มีอะไร
ตั้งค่า conn=ไม่มีอะไร
ตั้งค่า getNewsByID=ใหม่
ฟังก์ชันสิ้นสุด
'แทรกบทความข่าว
ฟังก์ชั่น addNews(ใหม่)
การเชื่อมต่อแบบสลัว cmd
ถ้าว่าง (ใหม่) ให้ addNews=false
set conn=Application(connection)' รับการเชื่อมต่อในกลุ่มการเชื่อมต่อ
set cmd=GetCmd() ' GETCMD การใช้งานฟังก์ชัน return createobject(Adodb.Command)
insertString=แทรกลงในค่า NEWS(id,title,contect)( @id , @title , @contect )
cmd.ActiveConnection = เชื่อมต่อ
cmd.CommandType = adCmdText ' Const adCmdText=1
cmd.CommandText = insertString
'เพิ่มพารามิเตอร์ไปที่ @id @title @contect ตอนนี้ adInteger คงที่ = 3 adParamInput=1 adVarWChar = 202
cmd.Parameters.Append cmd.CreateParameter(@id, adInteger, adParamInput, , anew.getID() )
cmd.Parameters.Append cmd.CreateParameter(@title,adVarWChar, adParamInput, 200, anew.getTitle() )
cmd.Parameters.Append cmd.CreateParameter(@contect,adVarWChar, adParamInput, 50000, anew.getConect() )
'เรียกใช้คำสั่ง SQL
cmd.execute()
ตั้งค่า cmd=ไม่มีอะไร
ตั้งค่า conn=ไม่มีอะไร
เพิ่มข่าว=จริง
ฟังก์ชันสิ้นสุด
ฟังก์ชั่น findByTitle(stitle)
-
ฟังก์ชันสิ้นสุด
ฟังก์ชั่น getPageNews (หน้า, ขนาด)
-
ฟังก์ชันสิ้นสุด
จบคลาส
-
ข้างต้นคือการดำเนินการฐานข้อมูลแล้วสรุปผลลัพธ์ลงในวัตถุหรือเขียนวัตถุลงในฐานข้อมูล
แม้ว่าความเร็วของการดำเนินการนี้จะช้าลงเล็กน้อย แต่โครงสร้างเชิงตรรกะโดยรวมก็ชัดเจนมาก และไม่จำเป็นต้องสนใจว่าตัวแปรจะถูกกรองหรือกรองหลายตัว
นักออกแบบที่เลเยอร์หน้าเว็บจะเน้นที่อินเทอร์เฟซมากกว่า
เพิ่มรหัสข่าวเพื่อส่งด้านล่าง
-
dim id,ชื่อเรื่อง,contect,ใหม่,dao
id=คำขอ(id)
title=Request.Form(หัวเรื่อง)
contact=Request.Form(เชื่อมต่อ)
ตั้งค่าใหม่ = ข่าวใหม่
ใหม่.setID(id)
anew.setTitle(หัวเรื่อง)
anew.setContect (เชื่อมต่อ)
ตั้ง dao = NewsDataAccessObject ใหม่
ถ้า dao.addNews(ใหม่) แล้ว
'response.write
สะท้อนความสำเร็จ
อื่น
ข้อผิดพลาดเสียงสะท้อน
สิ้นสุดถ้า
-
ตรวจสอบข่าวและแสดงมัน
-
dim id, dao, ใหม่
id=คำขอ(id)
ตั้ง dao = NewsDataAccessObject ใหม่
ตั้งค่าใหม่=dao.getNewsByID(id)
ถ้า anew.getID()<> แล้ว
-
หัวข้อ:<%=anew.getTitle()%>
เนื้อหา:<%=anew.getContect()%>
-
หากมีข้อผิดพลาดหรือการละเว้นในข้อมูลโค้ดข้างต้น ขอขอบคุณสำหรับคำแนะนำของคุณ~~~
เมื่อใช้วิธีการออกแบบนี้ ไม่จำเป็นต้องใช้ระบบบทความเช่น XXXBLOG XXXBBS XXX
ลืมแทนที่ (SQL,','') และการฉีดเกิดขึ้น!
ในส่วนของความสะอาดของเพจ จะไม่มีคำสั่ง SQL เช่น การเชื่อมต่อ มีหน้าที่รับผิดชอบงานของตนเอง แล้วจึงวางคุณสมบัติของอ็อบเจ็กต์ในตำแหน่งที่สอดคล้องกัน
และเพื่อนๆ บางคนอาจจะนึกถึง User Authentication บ้าง! มันจะง่ายกว่าถ้าใส่วัตถุผู้ใช้ของตารางผู้ใช้ลงในเซสชัน
-
ถ้า isempty(session(user)) หรือ session(user)= แล้ว
'กระโดด
อื่น
ตั้งค่า auser=session(ผู้ใช้)
ยินดีต้อนรับก้อง: & auser.getName()
-