สภาพแวดล้อมการทำงาน: ภาษาสคริปต์
IIS
: ฐานข้อมูล VBScript: ภาษาฐานข้อมูลเซิร์ฟเวอร์ Access/SQL
: SQL
1. สรุป:
ไม่ว่าในเว็บไซต์ไดนามิก เช่น ฟอรั่ม ระบบข่าวสาร หรือระบบดาวน์โหลด คุณมักจะเห็นฟังก์ชันการค้นหา: ค้นหาโพสต์ ค้นหาผู้ใช้ ค้นหาซอฟต์แวร์ (เรียกสั้นๆ ว่าค้นหาคำหลัก) ฯลฯ บทความนี้จะแนะนำวิธีการสร้าง การค้นหาหลายค่าไซต์ที่ใช้ ASP ในทางปฏิบัติที่มีประสิทธิภาพ
บทความนี้เกี่ยวข้องกับ "การค้นหาแบบคลุมเครือแบบหลายเงื่อนไข" หลังจากทำความเข้าใจเงื่อนไขหลายข้อแล้ว การค้นหาแบบมีเงื่อนไขเดียวก็เป็นเพียงเรื่องง่ายๆ โดยทั่วไป มีสองวิธีสำหรับการค้นหาหลายเงื่อนไข: วิธีการแจงนับ และวิธีก้าวหน้า เมื่อมีเงื่อนไขการค้นหาไม่มากนัก ( n <=3) สามารถใช้วิธีการแจงนับได้ ความถี่ของข้อความสั่งคือ 2 ยกกำลังที่ n โดยเพิ่มขึ้นแบบทวีคูณ n คือหมายเลขเงื่อนไข แน่นอนว่าเมื่อจำนวนเงื่อนไขเพิ่มขึ้น ควรนำวิธีการแบบก้าวหน้ามาใช้โดยไม่คำนึงถึงประสิทธิภาพหรือความสามารถในการทำให้เป็นจริงของโปรแกรมได้ ความถี่ของคำสั่งจะเป็น n และเพิ่มขึ้นเป็นเส้นตรง ควรชี้ให้เห็นว่าแนวคิดของวิธีการแจงนับนั้นง่ายมาก โดยจะกำหนดว่าเงื่อนไขว่างทีละรายการหรือไม่ จากนั้นจึงค้นหาตามเงื่อนไขที่ไม่ว่างเปล่า ขณะเดียวกัน เทคโนโลยีตารางความจริงก็สามารถทำได้ นำมาใช้รับมือกับสถานการณ์ที่มีเงื่อนไขมากมาย (เชื่อว่าคงไม่มีใครทำแบบนั้น) เมื่อมีเงื่อนไข 4 ข้อ จะต้องเขียนประโยค 16 กลุ่ม) วิธีก้าวหน้าจะฉลาดกว่าเน้นความเข้าใจ อย่างแรกคือการใช้แฟล็ก (แฟล็ก) และอย่างที่สองคือการใช้การเชื่อมต่อสตริงอย่างชาญฉลาดในสัญลักษณ์ SQL& ต่อไปนี้ใช้ตัวอย่างเพื่ออธิบายการจัดตั้งเครื่องยนต์
2. ตัวอย่าง:
เราสร้างกลไกการสืบค้นสมุดที่อยู่ ชื่อฐานข้อมูลคือ addressbook.mdb ชื่อตารางคือที่อยู่ และฟิลด์มีดังนี้:
หมายเลขประจำ | ตัว | โทรศัพท์ | โรงเรียน |
1 | Zhang San | 33333333 | Department of Computer Science, University of Electronic Science and Technology of China |
2 | Li Si | 44444444 | Department of Biology, Sichuan University |
3 | Wang Er | 22222222 | Department of Architecture, Southwest Jiaotong University |
… | … | … | … |
อินเทอร์เฟซการค้นหาเว็บมีดังนี้:
ชื่อ: | โทรศัพท์: | โรงเรียน: | ปุ่มค้นหา |
โปรแกรมต้นทางที่ใช้วิธีการแจงนับมีดังนี้:
<%@ CODEPAGE = "936" %>
'เชื่อมต่อกับฐานข้อมูล
<%
dim conn
dim DBOath
dim rs
dim sql
Set conn=Server.CreateObject("ADODB.Connection")
DBPath = Server .MapPath ("addressbook.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
Set rs=Server.CreateObject("ADODB.Recordset")
'รับชื่อและหมายเลขโทรศัพท์ หมายเลขจากหน้าเว็บ ค่าของโรงเรียน
dim Name
dim Tel
dim School
Name=request("Name")
Tel=request("Tel")
School=request("School")
'แกนการค้นหาของวิธีการแจงนับ เนื่องจากมีเงื่อนไขอยู่ 3 เงื่อนไข จึงต้องเขียน 8 ชุด คือ If คำสั่ง
if Trim(Name)="" และ Trim(Tel)="" และ Trim(School)="" แล้ว
sql="select * from address order โดย ID asc"
สิ้นสุดถ้า
ถ้า trim(Name)= "" และ trim(Tel)="" และ trim(School)<>"" จากนั้น
sql="select * from address โดยที่ School ชอบ '%"&trim(School)& "%' เรียงลำดับตาม ID asc"
จะสิ้นสุดถ้า
if trim (Name)="" และ trim(Tel)<>"" และ trim(School)="" จากนั้น
sql="select * from address โดยที่ Tel like '%"&trim (Tel)&"%' เรียงลำดับตาม ID asc"
สิ้นสุดถ้า
ถ้า trim(Name)="" และ trim(Tel)<>"" และ trim(School)<>"" จากนั้น
sql="select * จากที่อยู่โดยที่ Tel เช่น '%"&trim(Tel)&"%' และ School เช่น '%"&trim(School)&"%' เรียงลำดับตาม ID asc"
สิ้นสุด if
if trim(Name)<>"" และ trim(Tel)="" และ trim(School)="" จากนั้น
sql=" select * จากที่อยู่โดยที่ Name like '%"&trim(Name)&"%' order by ID asc"
end if
if trim(Name)<>"" และ trim(Tel )="" และ trim(School)<>" " จากนั้น
sql="select * from address โดยที่ Name like '%"&trim(Name)&"%' และ School like '%"&trim(School)&"%' order โดย ID asc"
สิ้นสุดถ้า
if trim(Name)< >"" และ trim(Tel)<>"" และ trim(School)="" จากนั้น
sql="select * from address โดยที่ Name like '%"&trim(Name) &"%' และ Tel เช่น '%"&trim( Tel)&"%' เรียงลำดับตาม ID asc"
สิ้นสุดถ้า
ถ้า trim(Name)<>"" และ trim(Tel)<>"" และ trim(School)<> "" จากนั้น
sql="select * จากที่อยู่โดยที่ชื่อเช่น '%"&trim(Name)&"%' และ Tel เช่น '%"&trim(Tel)&"%' และ School เช่น '%"&trim(School)&" %' เรียงลำดับตาม ID asc"
สิ้นสุดถ้า
rs.open sql,conn,1,1
'แสดงผลการค้นหา
ถ้า rs.eof และ rs.bof แล้ว
ตอบกลับเขียน "ไม่มีบันทึกในสมุดที่อยู่ปัจจุบัน"
อย่างอื่น
ทำในขณะที่ไม่ rs.eof
response.write "Name:"&rs("Name" )&"Telephone:"&rs("Tel")&"School:"&rs("School")&"<br>"
rs.movenext
สิ้นสุด
ลูป
หาก 'ตัดการเชื่อมต่อ
ชุดฐานข้อมูล rs=nothing
conn.close
set conn=nothing
%>
เมื่อทำความเข้าใจโปรแกรมข้างต้น ให้เน้นที่ส่วนหลัก ข้อความทั้ง 8 กลุ่มสอดคล้องกับ 8 สถานะในช่องค้นหา 3 ช่องทีละรายการ
ชื่อ | โทร | โรงเรียน |
| |
ว่าง | | | ว่าง | ว่าง | ไม่ |
ว่าง | |
| ไม่ |
| ว่าง |
| |
นอกจากนี้ trim() ยังเป็นฟังก์ชัน VB ที่จะลบช่องว่างก่อนและหลังสตริงอินพุต โดย % เป็นอักขระตัวแทนแบบหลายอักขระในภาษา SQL (_ คืออักขระตัวแทนตัวเดียว) ดังนั้นจึงเห็นได้ว่า %" &trim()&"% มีประโยชน์มากสำหรับช่องค้นหา คำหลักที่ป้อนจะถูกจับคู่จากซ้ายไปขวาตามลำดับ ในภาษา SQL และการเชื่อมต่อใช้เพื่อระบุว่ามีความสัมพันธ์ "และ" ระหว่างเงื่อนไขที่ไม่ว่างเปล่า
ลองมาดูที่วิธีการแบบก้าวหน้ากันดีกว่า เมื่อเปรียบเทียบกับวิธีการแจงนับแล้ว มีเพียงส่วนหลักเท่านั้นที่ต่างกัน:
'หลักการค้นหาของวิธีการแบบก้าวหน้าคือการตัดสินว่าเงื่อนไขว่างเปล่าหรือไม่ ให้เพิ่มเข้าไป ไปที่เงื่อนไขการค้นหา
sql="select * from address Where"
if Name<>"" then
sql=sql&" Name like '%"&Name&"%' "
flag=1
end if
if Tel<>"" and flag=1 then
sql=sql&" และ Tel like '%"&Tel&"% '"
flag=1
elseif Tel<>"" then
sql=sql&" Tel like '%"&Tel&"%'"
flag=1
end if
if Company<>"" และ flag=1 แล้ว
sql=sql&" และ Company เช่น ' %"&Company&"%'"
flag=1
elseif Company <>"" แล้วก็
sql=sql&" Company like '%"&Company&"%'"
flag=1
end if
if flag=0 จากนั้น
sql="select * from address order by ID asc"
สิ้นสุดถ้า
rs.open sql,conn,1,1
วิธีการก้าวหน้าเป็นอัลกอริธึมอัจฉริยะ ดังที่เห็นได้จากความยาวของข้อความเพียงอย่างเดียว ความยากและสาระสำคัญของอัลกอริทึมนี้อยู่ที่แฟล็กและ & ก่อนอื่น คุณควรรู้ว่า & เป็นสัญลักษณ์การต่อสตริงใน SQL ซึ่งจะประกบอักขระรอบสัญลักษณ์เข้าด้วยกัน กลับมาที่โปรแกรมอีกครั้ง เมื่อ Name ไม่ว่าง sql="select * from address โดยที่ Name like '%"&Name&"%' " และ flag=1; ต่อไป เมื่อ Name ไม่ว่าง และ Tel ไม่ว่าง นั่นก็คือ Tel<>"" และ flag=1, sql="select * from address โดยที่ Name like '%"&Name&"%' และ Tel like '%"&Tel&"%' " While flag=1 มิฉะนั้นเมื่อ Name ว่างเปล่า Tel Not Empty, sql="select * from address โดยที่ Tel เช่น '%"&Tel&"%' "และ flag=1; เป็นต้น สามารถขยายเพื่อค้นหาด้วยเงื่อนไข n ข้อ แน่นอนว่า เมื่อเงื่อนไขว่างเปล่าทั้งหมด นั่นคือ flag=0 จะเลือกรายการทั้งหมดในตารางทั้งหมด
3. ตรวจสอบ:
ณ จุดนี้ เครื่องมือค้นหาจะถูกสร้างขึ้น นี่คือตัวอย่างการใช้งานบางส่วน:
ชื่อ: จาง | โทรศัพท์: | โรงเรียน: | ปุ่มค้นหา |
ผลการค้นหาคือ:
ชื่อ: Zhang San โทร: 33333333 หน่วย: Department of Computer Science, University of Electronic Science and Technology of China
ชื่อ: | โทรศัพท์: | โรงเรียน: | ปุ่มค้นหา | วิทยาลัย
ผลการค้นหาคือ:
ชื่อ: Zhang San โทร: 33333333 หน่วย: Department of Computer Science, University of Electronic Science and Technology of China
ชื่อ Li Si โทร: 44444444 หน่วย: Department of Biology, Sichuan University
ชื่อ: Wang Er โทร: 22222222 หน่วย: ภาควิชาสถาปัตยกรรมศาสตร์ มหาวิทยาลัย Southwest Jiaotong
ชื่อ: | โทรศัพท์: 4444 | โรงเรียน: ปุ่มค้นหา | เสฉวน |
ผลการสืบค้นได้แก่
ชื่อ หลี่ซือ โทรศัพท์: 44444444 หน่วย: ภาควิชาชีววิทยา มหาวิทยาลัยเสฉวน
ชื่อ: | โทรศัพท์: | โรงเรียน: จ่าย% | ปุ่มค้นหา | ขนาดใหญ่
ผลการค้นหาคือ:
ชื่อ: Wang Er โทรศัพท์: 22222222 หน่วย: ภาควิชาสถาปัตยกรรมศาสตร์ มหาวิทยาลัย Southwest Jiaotong
4. ทำให้ดีขึ้น:
ในความเป็นจริง เครื่องยนต์นี้ยังคงมีข้อบกพร่องอยู่บ้าง ปัญหาส่วนใหญ่อยู่ที่อักขระตัวแทน % ในแง่หนึ่ง เนื่องจากผู้คนคุ้นเคยกับการใช้ * เป็นอักขระตัวแทน ในทางกลับกัน หาก % ปรากฏในไฮเปอร์ลิงก์ % จะถูก "กิน" เมื่อได้รับผ่านการร้องขอ ดังนี้
--test.htm--
-
<a href=test.asp?content=test%the%sign>คลิกที่นี่</a>
-
--test.asp--
-
เนื้อหา=คำขอ("เนื้อหา")
ตอบกลับเขียนเนื้อหา
-
เมื่อเรียกดู test.htm ใน IE ให้คลิกไฮเปอร์ลิงก์และจะแสดงเป็น:
ทดสอบสัญญาณ
จะเห็นได้ว่าไฮเปอร์ลิงก์ละเว้น % โดยตรง เราจะแก้ไขปัญหานี้ได้อย่างไร? ง่ายมาก เราทำเคล็ดลับเล็กๆ น้อยๆ - ล้มลำแสงและเปลี่ยนเสา
เพิ่มรหัสต่อไปนี้ก่อนแกนการค้นหา:
ชื่อ=แทนที่(ชื่อ,"*", "%")
โทร=แทนที่(โทร,"*", "%")
บริษัท=แทนที่(บริษัท,"*,", "%")
เพิ่มโค้ดต่อไปนี้หลังคอร์การค้นหา:
ชื่อ=แทนที่(ชื่อ,"%", "*")
โทร=แทนที่(โทร,"%", "*")
บริษัท=แทนที่(บริษัท,"%", "*")
มาวิเคราะห์ข้อความเหล่านี้กัน แทนที่ () เป็นฟังก์ชันการแทนที่สตริงใน VB แทนที่ (ชื่อ, "*", "%") คือการแทนที่ * ทั้งหมดในชื่อด้วย % กล่าวอีกนัยหนึ่ง เราจะแทนที่ * ที่เกิดขึ้นทั้งหมดในเงื่อนไขทั้งสามด้วย % เพื่อให้อักขระตัวแทนในสามประโยคแรกเปลี่ยนเป็น * สามประโยคถัดไปสามารถป้องกัน % จากการ "กิน" ได้ ปัญหาทั้งหมดจะได้รับการแก้ไข
ชื่อ: | โทรศัพท์: | โรงเรียน: จ่าย% | ปุ่มค้นหา | ขนาดใหญ่
ผลการค้นหาคือ:
ชื่อ: Wang Er โทร: 22222222 หน่วย: ภาควิชาสถาปัตยกรรมศาสตร์ Southwest Jiaotong University
เปลี่ยนข้อความข้างต้นอีกครั้งและแทนที่ * ด้วยการเว้นวรรค มันจะไม่กลายเป็นเครื่องมือค้นหาที่เรามักใช้ช่องว่างเพื่อแยกเงื่อนไขการค้นหาใน Google และ Baidu หรือไม่
สภาพแวดล้อมการทำงาน: ภาษาสคริปต์
IIS
: ฐานข้อมูล VBScript: ภาษาฐานข้อมูลเซิร์ฟเวอร์ Access/SQL
: SQL
1. สรุป:
ไม่ว่าในเว็บไซต์ไดนามิก เช่น ฟอรั่ม ระบบข่าวสาร หรือระบบดาวน์โหลด คุณมักจะเห็นฟังก์ชันการค้นหา: ค้นหาโพสต์ ค้นหาผู้ใช้ ค้นหาซอฟต์แวร์ (เรียกสั้นๆ ว่าค้นหาคำหลัก) ฯลฯ บทความนี้จะแนะนำวิธีการสร้าง การค้นหาหลายค่าไซต์ที่ใช้ ASP ในทางปฏิบัติที่มีประสิทธิภาพ
บทความนี้เกี่ยวข้องกับ "การค้นหาแบบคลุมเครือแบบหลายเงื่อนไข" หลังจากทำความเข้าใจเงื่อนไขหลายข้อแล้ว การค้นหาแบบมีเงื่อนไขเดียวก็เป็นเพียงเรื่องง่ายๆ โดยทั่วไป มีสองวิธีสำหรับการค้นหาหลายเงื่อนไข: วิธีการแจงนับ และวิธีก้าวหน้า เมื่อมีเงื่อนไขการค้นหาไม่มากนัก ( n <=3) สามารถใช้วิธีการแจงนับได้ ความถี่ของข้อความสั่งคือ 2 ยกกำลังที่ n โดยเพิ่มขึ้นแบบทวีคูณ n คือหมายเลขเงื่อนไข แน่นอนว่าเมื่อจำนวนเงื่อนไขเพิ่มขึ้น ควรนำวิธีการแบบก้าวหน้ามาใช้โดยไม่คำนึงถึงประสิทธิภาพหรือความสามารถในการทำให้เป็นจริงของโปรแกรมได้ ความถี่ของคำสั่งจะเป็น n และเพิ่มขึ้นเป็นเส้นตรง ควรชี้ให้เห็นว่าแนวคิดของวิธีการแจงนับนั้นง่ายมาก โดยจะกำหนดว่าเงื่อนไขว่างทีละรายการหรือไม่ จากนั้นจึงค้นหาตามเงื่อนไขที่ไม่ว่างเปล่า ขณะเดียวกัน เทคโนโลยีตารางความจริงก็สามารถทำได้ นำมาใช้รับมือกับสถานการณ์ที่มีเงื่อนไขมากมาย (เชื่อว่าคงไม่มีใครทำแบบนั้น) เมื่อมีเงื่อนไข 4 ข้อ จะต้องเขียนประโยค 16 กลุ่ม) วิธีก้าวหน้าจะฉลาดกว่าเน้นความเข้าใจ อย่างแรกคือการใช้แฟล็ก (แฟล็ก) และอย่างที่สองคือการใช้การเชื่อมต่อสตริงในสัญลักษณ์ SQL& อย่างชาญฉลาด ข้อมูลต่อไปนี้ใช้ตัวอย่างเพื่ออธิบายการจัดตั้งเครื่องยนต์
2. ตัวอย่าง:
เราสร้างกลไกการสืบค้นสมุดที่อยู่ ชื่อฐานข้อมูลคือ addressbook.mdb ชื่อตารางคือที่อยู่ และฟิลด์มีดังนี้:
หมายเลขประจำ | ตัว | โทรศัพท์ | โรงเรียน |
1 | Zhang San | 33333333 | Department of Computer Science, University of Electronic Science and Technology of China |
2 | Li Si | 44444444 | Department of Biology, Sichuan University |
3 | Wang Er | 22222222 | Department of Architecture, Southwest Jiaotong University |
… | … | … | … |
อินเทอร์เฟซการค้นหาเว็บมีดังนี้:
ชื่อ: | โทรศัพท์: | โรงเรียน: | ปุ่มค้นหา |
โปรแกรมต้นทางที่ใช้วิธีการแจงนับมีดังนี้:
<%@ CODEPAGE = "936" %>
'เชื่อมต่อกับฐานข้อมูล
<%
dim conn
dim DBOath
dim rs
dim sql
Set conn=Server.CreateObject("ADODB.Connection")
DBPath = Server .MapPath ("addressbook.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
Set rs=Server.CreateObject("ADODB.Recordset")
'รับชื่อและหมายเลขโทรศัพท์ หมายเลขจากหน้าเว็บ ค่าของโรงเรียน
dim Name
dim Tel
dim School
Name=request("Name")
Tel=request("Tel")
School=request("School")
'แกนการค้นหาของวิธีการแจงนับ เนื่องจากมีเงื่อนไขอยู่ 3 เงื่อนไข จึงต้องเขียน 8 ชุด คือ If คำสั่ง
if Trim(Name)="" และ Trim(Tel)="" และ Trim(School)="" แล้ว
sql="select * from address order โดย ID asc"
สิ้นสุดถ้า
ถ้า trim(Name)= "" และ trim(Tel)="" และ trim(School)<>"" จากนั้น
sql="select * from address โดยที่ School ชอบ '%"&trim(School)& "%' เรียงลำดับตาม ID asc"
จะสิ้นสุดถ้า
if trim (Name)="" และ trim(Tel)<>"" และ trim(School)="" จากนั้น
sql="select * from address โดยที่ Tel like '%"&trim (Tel)&"%' เรียงลำดับตาม ID asc"
สิ้นสุดถ้า
ถ้า trim(Name)="" และ trim(Tel)<>"" และ trim(School)<>"" จากนั้น
sql="select * จากที่อยู่โดยที่ Tel เช่น '%"&trim(Tel)&"%' และ School เช่น '%"&trim(School)&"%' เรียงลำดับตาม ID asc"
สิ้นสุด if
if trim(Name)<>"" และ trim(Tel)="" และ trim(School)="" จากนั้น
sql=" select * จากที่อยู่โดยที่ Name like '%"&trim(Name)&"%' order by ID asc"
end if
if trim(Name)<>"" และ trim(Tel )="" และ trim(School)<>" " จากนั้น
sql="select * from address โดยที่ Name like '%"&trim(Name)&"%' และ School like '%"&trim(School)&"%' order โดย ID asc"
สิ้นสุดถ้า
if trim(Name)< >"" และ trim(Tel)<>"" และ trim(School)="" จากนั้น
sql="select * from address โดยที่ Name like '%"&trim(Name) &"%' และ Tel เช่น '%"&trim( Tel)&"%' เรียงลำดับตาม ID asc"
สิ้นสุดถ้า
ถ้า trim(Name)<>"" และ trim(Tel)<>"" และ trim(School)<> "" จากนั้น
sql="select * จากที่อยู่โดยที่ชื่อเช่น '%"&trim(Name)&"%' และ Tel เช่น '%"&trim(Tel)&"%' และ School เช่น '%"&trim(School)&" %' เรียงลำดับตาม ID asc"
สิ้นสุดถ้า
rs.open sql,conn,1,1
'แสดงผลการค้นหา
ถ้า rs.eof และ rs.bof แล้ว
ตอบกลับเขียน "ไม่มีบันทึกในสมุดที่อยู่ปัจจุบัน"
อย่างอื่น
ทำในขณะที่ไม่ rs.eof
response.write "Name:"&rs("Name" )&"Telephone:"&rs("Tel")&"School:"&rs("School")&"<br>"
rs.movenext
สิ้นสุด
ลูป
หาก 'ตัดการเชื่อมต่อ
ชุดฐานข้อมูล rs=nothing
conn.close
set conn=nothing
%>
เมื่อทำความเข้าใจโปรแกรมข้างต้น ให้เน้นที่ส่วนหลัก ข้อความทั้ง 8 กลุ่มสอดคล้องกับ 8 สถานะในช่องค้นหา 3 ช่องทีละรายการ
ชื่อ | โทร | โรงเรียน |
| |
ว่าง | | | ว่าง | ว่าง | ไม่ |
ว่าง | |
| ไม่ |
| ว่าง |
| |
นอกจากนี้ trim() ยังเป็นฟังก์ชัน VB ที่จะลบช่องว่างก่อนและหลังสตริงอินพุต โดย % เป็นอักขระตัวแทนแบบหลายอักขระในภาษา SQL (_ คืออักขระตัวแทนตัวเดียว) ดังนั้นจึงเห็นได้ว่า %" &trim()&"% มีประโยชน์มากสำหรับช่องค้นหา คำหลักที่ป้อนจะถูกจับคู่จากซ้ายไปขวาตามลำดับ ในภาษา SQL และการเชื่อมต่อใช้เพื่อระบุว่ามีความสัมพันธ์ "และ" ระหว่างเงื่อนไขที่ไม่ว่างเปล่า
ลองมาดูที่วิธีการแบบก้าวหน้ากันดีกว่า เมื่อเปรียบเทียบกับวิธีการแจงนับแล้ว มีเพียงส่วนหลักเท่านั้นที่ต่างกัน:
'หลักการค้นหาของวิธีการแบบก้าวหน้าคือการตัดสินว่าเงื่อนไขว่างเปล่าหรือไม่ ให้เพิ่มเข้าไป ไปที่เงื่อนไขการค้นหา
sql="select * from address Where"
if Name<>"" then
sql=sql&" Name like '%"&Name&"%' "
flag=1
end if
if Tel<>"" and flag=1 then
sql=sql&" และ Tel like '%"&Tel&"% '"
flag=1
elseif Tel<>"" then
sql=sql&" Tel like '%"&Tel&"%'"
flag=1
end if
if Company<>"" และ flag=1 แล้ว
sql=sql&" และ Company เช่น ' %"&Company&"%'"
flag=1
elseif Company <>"" แล้วก็
sql=sql&" Company like '%"&Company&"%'"
flag=1
end if
if flag=0 จากนั้น
sql="select * from address order by ID asc"
สิ้นสุดถ้า
rs.open sql,conn,1,1
วิธีการก้าวหน้าเป็นอัลกอริธึมอัจฉริยะ ดังที่เห็นได้จากความยาวของข้อความเพียงอย่างเดียว ความยากและสาระสำคัญของอัลกอริทึมนี้อยู่ที่แฟล็กและ & ก่อนอื่น คุณควรรู้ว่า & เป็นสัญลักษณ์การต่อสตริงใน SQL ซึ่งจะประกบอักขระรอบสัญลักษณ์เข้าด้วยกัน กลับมาที่โปรแกรมอีกครั้ง เมื่อ Name ไม่ว่าง sql="select * from address โดยที่ Name like '%"&Name&"%' " และ flag=1; ต่อไป เมื่อ Name ไม่ว่าง และ Tel ไม่ว่าง นั่นก็คือ Tel<>"" และ flag=1, sql="select * from address โดยที่ Name like '%"&Name&"%' และ Tel like '%"&Tel&"%' " While flag=1 มิฉะนั้นเมื่อ Name ว่างเปล่า Tel Not Empty, sql="select * from address โดยที่ Tel เช่น '%"&Tel&"%' "และ flag=1; เป็นต้น สามารถขยายเพื่อค้นหาด้วยเงื่อนไข n ข้อ แน่นอนว่า เมื่อเงื่อนไขว่างเปล่าทั้งหมด นั่นคือ flag=0 จะเลือกรายการทั้งหมดในตารางทั้งหมด
3. ตรวจสอบ:
ณ จุดนี้ เครื่องมือค้นหาจะถูกสร้างขึ้น นี่คือตัวอย่างการใช้งานบางส่วน:
ชื่อ: จาง | โทรศัพท์: | โรงเรียน: | ปุ่มค้นหา |
ผลการค้นหาคือ:
ชื่อ: Zhang San โทร: 33333333 หน่วย: Department of Computer Science, University of Electronic Science and Technology of China
ชื่อ: | โทรศัพท์: | โรงเรียน: | ปุ่มค้นหา | วิทยาลัย
ผลการค้นหาคือ:
ชื่อ: Zhang San โทร: 33333333 หน่วย: Department of Computer Science, University of Electronic Science and Technology of China
ชื่อ Li Si โทร: 44444444 หน่วย: Department of Biology, Sichuan University
ชื่อ: Wang Er โทร: 22222222 หน่วย: ภาควิชาสถาปัตยกรรมศาสตร์ มหาวิทยาลัย Southwest Jiaotong
ชื่อ: | โทรศัพท์: 4444 | โรงเรียน: ปุ่มค้นหา | เสฉวน |
ผลการสืบค้นได้แก่
ชื่อ หลี่ซือ โทรศัพท์: 44444444 หน่วย: ภาควิชาชีววิทยา มหาวิทยาลัยเสฉวน
ชื่อ: | โทรศัพท์: | โรงเรียน: จ่าย% | ปุ่มค้นหา | ขนาดใหญ่
ผลการค้นหาคือ:
ชื่อ: Wang Er โทรศัพท์: 22222222 หน่วย: ภาควิชาสถาปัตยกรรมศาสตร์ Southwest Jiaotong University
4. ทำให้ดีขึ้น:
ในความเป็นจริง เครื่องยนต์นี้ยังคงมีข้อบกพร่องอยู่บ้าง ปัญหาส่วนใหญ่อยู่ที่อักขระตัวแทน % ในแง่หนึ่ง เนื่องจากผู้คนคุ้นเคยกับการใช้ * เป็นอักขระตัวแทน ในทางกลับกัน หาก % ปรากฏในไฮเปอร์ลิงก์ % จะถูก "กิน" เมื่อได้รับผ่านการร้องขอ ดังนี้
--test.htm--
-
<a href=test.asp?content=test%the%sign>คลิกที่นี่</a>
-
--test.asp--
-
เนื้อหา=คำขอ("เนื้อหา")
ตอบกลับเขียนเนื้อหา
-
เมื่อเรียกดู test.htm ใน IE ให้คลิกไฮเปอร์ลิงก์และจะแสดงเป็น:
ทดสอบสัญญาณ
จะเห็นได้ว่าไฮเปอร์ลิงก์ละเว้น % โดยตรง เราจะแก้ไขปัญหานี้ได้อย่างไร? ง่ายมาก เราทำเคล็ดลับเล็กๆ น้อยๆ - ล้มลำแสงและเปลี่ยนเสา
เพิ่มรหัสต่อไปนี้ก่อนแกนการค้นหา:
ชื่อ=แทนที่(ชื่อ,"*", "%")
โทร=แทนที่(โทร,"*", "%")
บริษัท=แทนที่(บริษัท,"*,", "%")
เพิ่มรหัสต่อไปนี้หลังแกนค้นหา:
ชื่อ=แทนที่(ชื่อ,"%", "*")
โทร=แทนที่(โทร,"%", "*")
บริษัท=แทนที่(บริษัท,"%", "*")
มาวิเคราะห์ข้อความเหล่านี้กัน แทนที่ () เป็นฟังก์ชันการแทนที่สตริงใน VB แทนที่ (ชื่อ, "*", "%") คือการแทนที่ * ทั้งหมดในชื่อด้วย % กล่าวอีกนัยหนึ่ง เราจะแทนที่ * ที่เกิดขึ้นทั้งหมดในเงื่อนไขทั้งสามด้วย % เพื่อให้อักขระตัวแทนในสามประโยคแรกเปลี่ยนเป็น * สามประโยคถัดไปสามารถป้องกัน % จากการ "กิน" ได้ ปัญหาทั้งหมดจะได้รับการแก้ไข
ชื่อ: | โทรศัพท์: | โรงเรียน: จ่าย% | ปุ่มค้นหา | ขนาดใหญ่
ผลการค้นหาคือ:
ชื่อ: Wang Er โทร: 22222222 หน่วย: ภาควิชาสถาปัตยกรรมศาสตร์ Southwest Jiaotong University
เปลี่ยนข้อความข้างต้นอีกครั้งและแทนที่ * ด้วยการเว้นวรรค มันจะไม่กลายเป็นเครื่องมือค้นหาที่เรามักใช้ช่องว่างเพื่อแยกเงื่อนไขการค้นหาใน Google และ Baidu หรือไม่