ผู้เขียน: csbq
เมื่อทำการสอบถามฐานข้อมูล คุณมักจะพบกับสถานการณ์ต่อไปนี้:
ตัวอย่างเช่น คุณต้องการค้นหาชื่อผู้ใช้และรหัสผ่านของเขาในฐานข้อมูลผู้ใช้ แต่ชื่อและรหัสผ่านที่ผู้ใช้ใช้มีอักขระพิเศษ เช่น เครื่องหมายคำพูดเดี่ยว เครื่องหมาย "|" เครื่องหมายคำพูดคู่ หรือเครื่องหมายขีดกลาง "&" .
ตัวอย่างเช่น ชื่อของเขาคือ 1'test และรหัสผ่านของเขาคือ A|&900 เมื่อคุณดำเนินการคำสั่งแบบสอบถามต่อไปนี้ ข้อผิดพลาดจะถูกรายงานอย่างแน่นอน:
SQL = "เลือก * จากระดับความปลอดภัยโดยที่ UID ='" & UserID & "'"
SQL = SQL & " AND PWD='" & Password & "'"
เพราะ SQL ของคุณจะเป็นดังนี้:
SELECT * FROM SecurityLevel WHERE UID='1'test' AND PWD='A|&900'
ใน SQL จะใช้ "|" เพื่อแยกฟิลด์ ดังนั้นจึงมีบางอย่างผิดพลาดอย่างเห็นได้ชัด ขณะนี้มีฟังก์ชันต่อไปนี้เพื่อจัดการกับอาการปวดหัวเหล่านี้:
ฟังก์ชันแทนที่ Str (TextIn, ByVal SearchStr As String, _
ByVal Replacement As String, _
ByVal CompMode As Integer)
Dim WorkText As String, Pointer As Integer
If IsNull(TextIn) จากนั้น
แทนที่Str = Null
Else
WorkText = TextIn
Pointer = InStr(1, WorkText , SearchStr, CompMode)
ทำในขณะที่ตัวชี้ > 0
WorkText = ซ้าย (WorkText, ตัวชี้ - 1) & การแทนที่ & _
Mid (WorkText, ตัวชี้ + Len (SearchStr))
ตัวชี้ = InStr (ตัวชี้ + Len (การแทนที่), WorkText, _
SearchStr , CompMode)
Loop
ReplacementStr =
สิ้นสุดข้อความงานหาก
สิ้นสุดฟังก์ชัน
ฟังก์ชัน SQLFixup(TextIn)
SQLFixup =แทนที่Str(TextIn, "'", "''", 0)
สิ้นสุดฟังก์ชัน
ฟังก์ชัน JetSQLFixup (TextIn)
Dim Temp
Temp =แทนที่Str(TextIn, "'", "''", 0)
JetSQLFixup = แทนที่Str(Temp, "|", "' & chr(124) & '", 0)
สิ้นสุดฟังก์ชัน
ฟังก์ชัน FindFirstFixup (TextIn)
Dim Temp
Temp =แทนที่Str(TextIn, "'", "' & chr(39) & '", 0)
FindFirstFixup = RefplaceStr(Temp, "|", "' & chr(124) & '" , 0)
ฟังก์ชันสิ้นสุด
หลังจากมีฟังก์ชันข้างต้นแล้ว ก่อนที่คุณจะรัน sql โปรดใช้:
SQL = "เลือก * จากระดับความปลอดภัยโดยที่ UID ='" & SQLFixup (รหัสผู้ใช้) & "'"
SQL = SQL & "และ PWD='" & SQLFixup (รหัสผ่าน) & "'"