สภาพแวดล้อมที่ใช้งาน: IIS
ภาษาสคริปต์: vbscript
ฐานข้อมูล: Access/SQL Server
ภาษาฐานข้อมูล: SQL
1. สรุป:
โดยไม่คำนึงถึงเว็บไซต์แบบไดนามิกเช่นฟอรัมระบบข่าวหรือระบบดาวน์โหลดทุกคนมักจะเห็นฟังก์ชั่นการค้นหา: โพสต์การค้นหาผู้ใช้ค้นหาซอฟต์แวร์ค้นหา (ในคำค้นหาสั้น ๆ ) ฯลฯ บทความนี้แนะนำวิธีสร้างประสิทธิภาพ ประสิทธิภาพในทางปฏิบัติค้นหาการค้นหาหลายค่าตาม ASP
บทความนี้กำลังเผชิญกับเงื่อนไขหลายประการและการค้นหาการจับคู่ที่คลุมเครือซึ่งเข้าใจหลายเงื่อนไขและการค้นหาเงื่อนไขเดียวไม่ใช่ชิ้นส่วนของเค้ก โดยทั่วไปการพูดมีสองวิธีในการค้นหาหลายเงื่อนไข: การแจงนับและวิธีการก้าวหน้า เงื่อนไขการค้นหาไม่ยาวเกินไป (n <= 3) และวิธีการแจงนับสามารถใช้งานได้ เห็นได้ชัดว่าเมื่อเงื่อนไขเพิ่มขึ้นควรใช้วิธีความคืบหน้าในทั้งสองขั้นตอนและสามารถทำได้ ควรชี้ให้เห็นว่าวิธีการแจงนับนั้นง่ายมากไม่ว่าจะเป็นเงื่อนไขของการตัดสินที่ว่างเปล่าและจากนั้นค้นหาตามเงื่อนไขที่ไม่ได้รับการยกเว้นในเวลาเดียวกันคุณสามารถใช้เทคโนโลยีตารางที่แท้จริงเพื่อจัดการกับเงื่อนไข ด้วยเงื่อนไขหลายประการ (ฉันเชื่อว่าไม่มีใครทำสิ่งนี้ใน 4 เงื่อนไขเราต้องเขียนประโยค 16 ชุด); หนึ่งคือการใช้ตำแหน่งโลโก้ (FLAG) และที่สองคือการใช้สตริงในการเชื่อมต่อการเชื่อมต่อสตริง SQL มาอธิบายการจัดตั้งเครื่องยนต์โดยตัวอย่าง
2. ตัวอย่าง:
เราได้สร้างเอ็นจิ้นการสืบค้นสมุดที่อยู่
ชื่อ ID TEL School
1 สาม 333333333 มหาวิทยาลัยวิทยาศาสตร์อิเล็กทรอนิกส์และเทคโนโลยีมหาวิทยาลัยวิทยาศาสตร์อิเล็กทรอนิกส์และเทคโนโลยี
2 LI 444444444 ภาควิชาชีววิทยามหาวิทยาลัยเสฉวน
3 Wang 222222222 ภาคตะวันตกเฉียงใต้ของมหาวิทยาลัย Jiaotong ภาควิชาสถาปัตยกรรม
-
อินเทอร์เฟซการค้นหาเว็บมีดังนี้:
ชื่อ: โทรศัพท์: โรงเรียน: ปุ่มค้นหา
ขั้นตอนต้นทางของวิธีการแจงนับเป็นดังนี้:
< %@ codePage = 936 %>
'ฐานข้อมูลการเชื่อมต่อ
-
หรี่
DBOATH หรี่
สลัวอาร์เอส
สลัว SQL
SET Conn = Server.CreateObject (ADODB.Connection)
dbpath = server.mappath (addressbook.mdb)
conn.open driver = {Microsoft Access Driver (*.mdb)};
ตั้งค่า rs = server.createObject (adodb.oldset)
'รับชื่อโทรศัพท์ค่าโรงเรียนจากหน้าเว็บ
ชื่อหรี่
DIM TEL
สลัว Schol
ชื่อ = คำขอ (ชื่อ)
โทร = คำขอ (โทร)
โรงเรียน = คำขอ (โรงเรียน)
'แกนหลักของวิธีการแจงนับเนื่องจากมี 3 เงื่อนไขคุณต้องเขียน 8 กลุ่มหากคำพิพากษาของคำพิพากษา
ถ้าตัดแต่ง (ชื่อ) = และตัดแต่ง (โทร) = และตัดแต่ง (โรงเรียน) = จากนั้น
SQL = เลือก * จากคำสั่งที่อยู่โดย ID ASC
สิ้นสุดถ้า
ถ้าตัดแต่ง (ชื่อ) = และตัดแต่ง (โทร) = และตัดแต่ง (โรงเรียน) <> แล้ว
SQL = SELECT * จากที่อยู่ที่โรงเรียนเช่น '%& TRIM (โรงเรียน) &%สั่งซื้อ id ASC
สิ้นสุดถ้า
ถ้าตัดแต่ง (ชื่อ) = และตัดแต่ง (โทร) <> และตัดแต่ง (โรงเรียน) = แล้ว
SQL = SELECT * จากที่อยู่ที่ tel Like '%& trim (โทร) &%' คำสั่งซื้อโดย id asc
สิ้นสุดถ้า
ถ้าตัดแต่ง (ชื่อ) = และตัดแต่ง (โทร) <> และตัดแต่ง (โรงเรียน) <> แล้ว
SQL = SELECT * จากที่อยู่ที่ tel Like '%& trim (โทร) &%' และโรงเรียนเช่น '%& trim (โรงเรียน) &%สั่งซื้อโดย id asc
สิ้นสุดถ้า
ถ้าตัดแต่ง (ชื่อ) <> และตัดแต่ง (โทร) = และตัดแต่ง (โรงเรียน) = แล้ว
sql = เลือก * จากที่อยู่ที่ชื่อเช่น '%& trim (ชื่อ) &%' สั่งซื้อโดย id asc
สิ้นสุดถ้า
ถ้าตัดแต่ง (ชื่อ) <> และตัดแต่ง (โทร) = และตัดแต่ง (โรงเรียน) <> แล้ว
SQL = SELECT * จากที่อยู่ที่ชื่อเช่น '%& TRIM (ชื่อ) &%' และโรงเรียนเช่น '%& TRIM (โรงเรียน) &%' คำสั่งซื้อโดย ID ASC
สิ้นสุดถ้า
ถ้า trim (ชื่อ) <> และ trim (โทร) <> และ trim (โรงเรียน) = จากนั้น
SQL = SELECT * จากที่อยู่ที่ชื่อ '%& TRIM (ชื่อ) &%' และโทรชอบ '%& trim (โทร) &%' โดย id asc
สิ้นสุดถ้า
ถ้า trim (ชื่อ) <> และ trim (โทร) <> และ trim (โรงเรียน) <> จากนั้น
SQL = SELECT * จากที่อยู่ที่ชื่อเช่น '%& TRIM (ชื่อ) &%' และโทรชอบ '%& TRIM (โทร) &%' และโรงเรียนเช่น '%& TRIM (โรงเรียน) &%สั่งซื้อโดย AD SC
สิ้นสุดถ้า
Rs.oopen SQL, Conn, 1,1
'แสดงผลการค้นหา
ถ้า RS.EOF และ Rs.Bof แล้ว
Response.write ไม่ได้บันทึกในสมุดที่อยู่ในปัจจุบัน
อื่น
ทำในขณะที่ไม่ใช่ RS.EOF
Response.write ชื่อ: & rs (ชื่อ) & โทรศัพท์: & rs (โทร) & โรงเรียน: & rs (โรงเรียน) & <br>
Rs.Movenext
วง
สิ้นสุดถ้า
'ทำลายฐานข้อมูล
ตั้งค่า rs = ไม่มีอะไร
conn.close
ตั้งค่า conn = ไม่มีอะไร
-
เมื่อทำความเข้าใจขั้นตอนข้างต้นให้ความสำคัญกับส่วนหลัก 8 ชุดประโยคทีละชุดที่สอดคล้องกับ 8 สถานะของ 3 ช่องค้นหาทีละตัวทีละหนึ่ง
ชื่อเทลโรงเรียน
ว่างเปล่า
ว่างเปล่าและว่างเปล่า
ว่างเปล่าและว่างเปล่า
ว่างเปล่าไม่ว่างเปล่าไม่ว่างเปล่า
ไม่ว่างเปล่า
ไม่ว่างเปล่าไม่ว่างเปล่า
ไม่ว่างเปล่าไม่ว่างเปล่า
ไม่ว่างเปล่าไม่ว่างเปล่าไม่ว่างเปล่า
นอกจากนี้ TRIM () เป็นฟังก์ชั่นของ VB ลบพื้นที่ก่อนและหลังสตริงอินพุต;%คือทางผ่านหลายตัวอักษรของภาษา SQL (_ เป็นตัวละครผ่านตัวเดียว) ซึ่งแสดงให้เห็นว่า%& trim () &%อินพุตในช่องค้นหาคำหลักตรงกับด้านซ้ายและขวา
ลองมาดูวิธีการคืบหน้า
'แกนหลักของวิธีการค้นหาเงื่อนไขการตัดสินว่างเปล่าและที่ไม่ได้รับจะเพิ่มลงในเงื่อนไขการค้นหา
SQL = เลือก * จากที่อยู่ที่ไหน
ถ้าชื่อ <> จากนั้น
sql = sql & ชื่อเช่น '%& name &%'
ธง = 1
สิ้นสุดถ้า
ถ้าโทร <> และ flag = 1
sql = sql & และโทรชอบ '%& tel &%'
ธง = 1
อื่นโทร <> แล้ว
sql = sql & tel like '%& tel &%'
ธง = 1
สิ้นสุดถ้า
ถ้า บริษัท <> และ flag = 1 แล้ว
SQL = SQL & และ บริษัท เช่น '%& Company &%'
ธง = 1
บริษัท อื่น ๆ <> แล้ว
SQL = SQL & Company เช่น '%& Company &%'
ธง = 1
สิ้นสุดถ้า
ถ้าธง = 0 แล้ว
SQL = เลือก * จากคำสั่งที่อยู่โดย ID ASC
สิ้นสุดถ้า
Rs.oopen SQL, Conn, 1,1
วิธีความคืบหน้าเป็นอัลกอริทึมที่ชาญฉลาดซึ่งสามารถมองเห็นได้เพียงอย่างเดียวจากความยาวของคำสั่ง ความยากลำบากและสาระสำคัญของอัลกอริทึมนี้อยู่บนธงและ & ก่อนอื่นคุณควรชัดเจน & ใน SQL เป็นสัญลักษณ์การเชื่อมต่อสตริงการเย็บอักขระรอบ ๆ สัญลักษณ์เข้าด้วยกัน กลับไปที่โปรแกรมเมื่อชื่อไม่ว่าง SQL = SELECT * จากที่อยู่ที่ชื่อเช่น '%& NAME &%' พร้อมกัน = 1; โทร <> และและเมื่อธง = 1, sql = select * จากที่อยู่ที่ชื่อเช่น '%& name &%' และโทรชอบ '%& tel &%' ในเวลาเดียวกันมิฉะนั้นเมื่อชื่อว่างเปล่า SQL = เลือก * จากที่อยู่ w ที่นี่เช่น '%& tel &%' ในเวลาเดียวกันธง = 1; แน่นอนเมื่อเงื่อนไขว่างเปล่านั่นคือ Flag = 0 จะเลือกรายการทั้งหมดในตาราง
3. ตรวจสอบ:
ณ จุดนี้มีการจัดตั้งเครื่องมือค้นหา นี่คือตัวอย่างการใช้งาน:
ชื่อ: จางโทร: โรงเรียน: ปุ่มค้นหา
ผลการค้นหาคือ:
ชื่อ: จางซานโทร: 33333333 หน่วย: แผนกคอมพิวเตอร์ของมหาวิทยาลัยวิทยาศาสตร์อิเล็กทรอนิกส์และเทคโนโลยี
ชื่อ: โทรศัพท์: โรงเรียน: ปุ่มค้นหามหาวิทยาลัย
ผลการค้นหาคือ:
ชื่อ: จางซานโทร: 33333333 หน่วย: แผนกคอมพิวเตอร์ของมหาวิทยาลัยวิทยาศาสตร์อิเล็กทรอนิกส์และเทคโนโลยี
ชื่อ Li Si โทรศัพท์: 444444444 หน่วย: ภาควิชาชีววิทยามหาวิทยาลัยเสฉวน
ชื่อ: Wang ER โทรศัพท์: 22222222 หน่วย: ภาควิชาสถาปัตยกรรม, มหาวิทยาลัยเซาท์เวสต์ Jiaotong
ชื่อ: โทรศัพท์: 4444 โรงเรียน: ปุ่มค้นหาเสฉวน
ผลการค้นหาคือ:
ชื่อ Li Si โทรศัพท์: 444444444 หน่วย: ภาควิชาชีววิทยามหาวิทยาลัยเสฉวน
ชื่อ: โทรศัพท์: โรงเรียน: จ่าย%ปุ่มค้นหา
ผลการค้นหาคือ:
ชื่อ: Wang ER โทรศัพท์: 22222222 หน่วย: ภาควิชาสถาปัตยกรรม, มหาวิทยาลัยเซาท์เวสต์ Jiaotong
4. ทำให้ดีขึ้น:
ในความเป็นจริงเครื่องยนต์นี้ยังคงมีข้อบกพร่องบางอย่าง ในอีกด้านหนึ่งเป็นเพราะคนมักจะใช้*เป็นช่องและในทางกลับกันหากปรากฏในไฮเปอร์ลิงก์มันจะถูกกินเมื่อได้รับผ่านคำขอดังนี้:
-ทดสอบ. htm--
การตัดหญ้า
<a href = test.asp?
การตัดหญ้า
-ทดสอบ. asp-
-
เนื้อหา = คำขอ (เนื้อหา)
Response.write เนื้อหา
-
เมื่อคุณเรียกดู test.htm ใน IE คลิกไฮเปอร์ลิงก์และจะแสดงเป็น:
Testthesign
จะเห็นได้ว่า%ถูกเพิกเฉยโดยตรงโดยไฮเปอร์ลิงก์ เราจะแก้ปัญหานี้ได้อย่างไร? มันง่ายมากเรามาทำคานที่ใช้มือเล็กน้อยและเท้าและเปลี่ยนคอลัมน์
เพิ่มรหัสต่อไปนี้ก่อนแกนค้นหา:
NAME = แทนที่ (ชื่อ,*,%)
โทร = แทนที่ (โทร,*,%)
บริษัท = แทนที่ (บริษัท ,*,%)
เพิ่มรหัสต่อไปนี้ในแกนกลางของการค้นหา:
NAME = แทนที่ (ชื่อ,%,*)
โทร = แทนที่ (โทร,%,*)
บริษัท = แทนที่ (บริษัท ,%,*)
มาวิเคราะห์ประโยคเหล่านี้กันเถอะ แทนที่ () เป็นฟังก์ชั่นการเปลี่ยนสตริงใน VB กล่าวอีกนัยหนึ่งเราแทนที่เงื่อนไขทั้งหมดทั้งสามของเงื่อนไขทั้งสามเป็น%เพื่อให้สามประโยคแรกจะเปลี่ยนเป็น* 3 ประโยคสุดท้ายสามารถป้องกันไม่ให้%ถูกกิน ปัญหาทั้งหมดจะได้รับการแก้ไข
ชื่อ: โทรศัพท์: โรงเรียน: จ่าย%ปุ่มค้นหา
ผลการค้นหาคือ:
ชื่อ: Wang ER โทรศัพท์: 22222222 หน่วย: ภาควิชาสถาปัตยกรรม, มหาวิทยาลัย Southwest Jiaotong
เปลี่ยนข้อความข้างต้นและแทนที่*ด้วยกริดที่ว่างเปล่า
ฟังก์ชั่นเสริม: หากเราต้องการสอบถามชื่อเรื่องและเนื้อหาในตารางเดียวกัน แต่ต้องการจัดเรียงตามลำดับของสองสิ่งนี้เช่นการค้นหาจอแสดงผลแรกที่ตรงกับชื่อมันจะรับรู้ได้อย่างไรหลังชื่อ จุดตัด
SQL = SELECT * จากผลิตภัณฑ์ที่ tite ชอบ '%& คำหลัก &%'
sql = sql + union select * จากผลิตภัณฑ์ที่เนื้อหาเช่นคำสั่ง '%& keyword &%' โดย id desc
เพิ่มหนึ่งในกลางของสองงบ SQL และสหภาพสามารถสอบถามร่วมกันได้ แต่คอลัมน์จะต้องเหมือนกันและยังมีอีกหนึ่งคอลัมน์
เราจะใช้การสืบค้นร่วมของสหภาพซึ่งจะบรรลุฟังก์ชั่นข้างต้น
การวิเคราะห์: การสืบค้นฐานข้อมูลจะถูกสอบถามตามข้อมูลที่มีชื่อเรื่องจากนั้นการรับรู้ของการสืบค้นข้อมูลของเนื้อหาจึงถูกแบ่งออก