Рабочая среда: IIS
Язык сценариев: VBScript
База данных: Access/SQL Server
Язык базы данных: SQL
1. краткое содержание:
Будь то динамические веб-сайты, такие как форумы, системы новостей или системы загрузки, вы часто встречаете функции поиска: поиск сообщений, поиск пользователей, поиск программного обеспечения (короче, поиск по ключевым словам) и т. д. В этой статье рассказывается, как создать эффективный Практичный поиск по множеству значений на базе ASP.
В этой статье рассматривается «поиск с нечетким соответствием по множеству условий». После понимания множества условий поиск по одному условию становится проще простого. Вообще говоря, существует два метода поиска по множеству условий: метод перечисления и прогрессивный метод. Когда условий поиска не слишком много ( n <=3), можно использовать метод перебора. Частота операторов равна 2 в n-й степени, растет в геометрической прогрессии. n — номер условия. Очевидно, что при увеличении количества условий следует использовать прогрессивный метод независимо от эффективности или реализуемости программы. Частота операторов равна n и растет линейно. Следует отметить, что идея метода перечисления очень проста. Он определяет, являются ли условия пустыми, одно за другим, а затем выполняет поиск в соответствии с непустыми условиями. В то же время технология таблицы истинности может. использоваться для работы с ситуациями с чрезвычайно большим количеством условий (думаю, никто такого делать не будет), когда условий 4, нужно написать 16 групп утверждений, прогрессивный метод более изобретателен, ориентирован на понимание). Первый — это использование флагов (flag), а второй — умелое использование строковых связей в SQL-символе&. Далее используются примеры для объяснения создания двигателя.
2. Пример:
Мы создаем механизм запросов к адресной книге. Имя базы данных — адресная книга.mdb, имя таблицы — адрес, а поля следующие:
ID | Имя | Тел. | Школа |
1 | Чжан Сан | 33333333 | Факультет компьютерных наук, Университет электронных наук и технологий Китая |
2 | Ли Си | 44444444 | Факультет биологии Сычуаньского университета |
3 | Ван Эр | 22222222 | Факультет архитектуры Юго-Западного университета Цзяотун |
… | … | … | … |
Интерфейс веб-поиска выглядит следующим образом:
Имя: | Телефон: | Школа: | Кнопка «Поиск» |
Исходная программа, использующая метод перечисления, выглядит следующим образом:
<%@ 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")
'Ядро поиска метода перечисления, поскольку есть три условия, поэтому необходимо написать 8 наборов операторов суждения
If if Trim(Name)="" и Trim(Tel)="" и Trim(School)="" then
sql="select * из порядка адресов по идентификатору по возрастанию"
end if
if trip(Name)="" и trip(Tel)="" и Trim(School)<>"" then
sql="select * from Address, где School нравится '%"&trim(School)& Порядок «%' по возрастанию идентификатора»
заканчивается, если
if trip (Name)="" и Trim(Tel)<>"" и Trim(School)="" then
sql="select * from the Address, где Tel, например '%"&trim (Тел)&"%' порядок по возрастанию идентификатора"
заканчивается, если
if Trim(Name)="" и Trim(Tel)<>"" и Trim(School)<>"" then
sql="select * from the Address, где Tel например '%"&trim(Tel)&"%' и School, например '%"&trim(School)&"%', порядок по возрастанию идентификатора"
заканчивается, если
if trip(Name)<>"" и Trim(Tel)="" и Trim(School)="" затем
sql=" выберите * из адреса, где имя типа '%"&trim(Name)&"%' упорядочивается по возрастанию идентификатора"
заканчивается, если
if trip(Name)<>"" и Trim(Tel )="" и Trim(School)<>" " затем
sql="select * из адреса, где имя типа '%"&trim(Name)&"%' и школа типа '%"&trim(School)&"%' порядок по идентификатору по возрастанию"
заканчивается, если
if trip(Name)< >"" и Trim(Tel)<>"" и Trim(School)="" then
sql="select * from Address, где Имя типа '%"&trim(Name) &"%' и Tel, например '%"&trim( Tel)&"%', порядок по возрастанию идентификатора
заканчивается, если
if trip(Name)<>"" и Trim(Tel)<>"" и Trim(School)<> "" then
sql="выберите * из адреса, где имя типа "%"&trim(Name)&"%' и телефон типа "%"&trim(Tel)&"%' и школа типа "%"&trim(School)&" %' order by ID asc"
end if
rs.open sql,conn,1,1
'Отобразить результаты поиска
, если rs.eof и rs.bof then
response.write "В текущей адресной книге нет записей",
иначе
сделать, пока нет rs.eof
response.write "Name:"&rs("Name")&"Telephone:"&rs("Tel")&"School:"&rs("School")&"<br>"
rs.movenext
цикл
end if
'Отключаем базу данных
set rs=nothing
conn.close
set conn=nothing
%>
Понимая приведенную выше программу, сосредоточьтесь на основной части. 8 групп утверждений соответствуют 8 состояниям в 3 полях поиска одно за другим.
Имя | Тел | . |
| |
Пусто | | | Непусто | Пусто | Пусто |
Непусто | |
Непусто | |
| |
| |
Кроме того, обрезка() — это функция VB, которая удаляет пробелы до и после входной строки; % — это многосимвольный подстановочный знак в языке SQL (_ — это односимвольный подстановочный знак), поэтому можно видеть, что %" &trim()&"% очень полезен для поля поиска. Введенные ключевые слова сопоставляются слева направо соответственно; на языке SQL соединение используется для указания того, что между непустыми условиями существует связь "И".
Давайте посмотрим на прогрессивный метод. По сравнению с методом перечисления они отличаются только в основной части:
«Ядро поиска прогрессивного метода заключается в том, чтобы определить, является ли условие пустым или нет. Если оно не пустое, добавьте его. к условию поиска
sql="выбрать * из адреса, где"
if Name<>"" then
sql=sql&" Имя типа '%"&Name&"%' "
flag=1
end if
if Tel<>"" и flag=1 then
sql=sql&" и Tel, как '%"&Tel&"% '"
flag=1
elseif Tel<>"" then
sql=sql&" Tel, как '%"&Tel&"%'"
flag=1
end if
if Company<>"" и flag=1 then
sql=sql&" и компания типа ' %"&Company&"%'"
flag=1
elseif Company <>"" then
sql=sql&" Компания типа '%"&Company&"%'"
flag=1
end if
if flag=0 then
sql="select * из порядка адресов по возрастанию идентификатора"
end if
rs.open sql,conn,1,1
Метод прогрессии — это умный алгоритм, о чем можно судить только по длине операторов. Сложность и суть этого алгоритма заключается в флаге и &. Прежде всего, вы должны знать, что & — это символ конкатенации строк в SQL, который объединяет символы вокруг символа. Снова вернемся к программе, когда Имя не пусто, sql="select * from Address, где Имя типа '%"&Name&"%' "и flag=1; когда Имя не пусто и Тел не пуст, т.е. Tel<>"" и flag=1, sql="select * from the Address, где имя типа '%"&Name&"%' и тело типа '%"&Tel&"%' "пока flag=1, в противном случае, если имя пусто, Tel Not пустой, sql="select * from адрес, где Tel типа '%"&Tel&"%' "и flag=1 и т. д., его можно расширить для поиска с n условиями. Конечно, когда все условия пусты, то есть flag=0, будут выбраны все элементы во всех таблицах.
3. проверять:
На этом этапе создается поисковая система. Вот несколько примеров использования:
Имя: Чжан | Телефон: | Школа: | Кнопка поиска |
Результаты поиска:
Имя: Чжан Сан Тел.: 33333333 Подразделение: Факультет компьютерных наук, Университет электронных наук и технологий Китая
Имя: | Телефон: | Школа: | Кнопка поиска | колледжа
Результаты поиска:
Имя: Чжан Сан Тел.: 33333333 Подразделение: Факультет компьютерных наук Китайского университета электронных наук и технологий
Имя Ли Си Тел.: 44444444 Подразделение: Факультет биологии Сычуаньского университета
Имя: Ван Эр Тел.: 22222222 Отделение: Факультет архитектуры Юго-Западного университета Цзяотун
Имя: | Телефон: 4444 | Школа: Сычуань | Кнопка поиска |
Результаты поиска:
Имя Ли Си Телефон: 44444444 Подразделение: Факультет биологии Сычуаньского университета.
Имя: | Телефон: | Школа: Оплата% Большая | кнопка поиска |
Результаты поиска:
Имя: Ван Эр Телефон: 22222222 Подразделение: Факультет архитектуры Юго-Западного университета Цзяотун.
4. улучшать:
На самом деле, у этого движка все еще есть некоторые недостатки. Проблема в основном заключается в подстановочном знаке %. С одной стороны, это связано с тем, что люди привыкли использовать * в качестве подстановочного знака. С другой стороны, если % появляется в гиперссылке, % будет «съеден» при получении по запросу следующим образом:
--test.htm--
…
<a href=test.asp?content=test%the%sign>нажмите здесь</a>
…
--test.asp--
<%
контент = запрос («контент»)
ответ.записать контент
%>
При просмотре файла test.htm в IE щелкните гиперссылку, и она отобразится следующим образом:
тестзнак
Видно, что % напрямую игнорируется гиперссылкой. Как мы можем решить эту проблему? Все очень просто, делаем небольшой трюк – подгибаем балку и меняем столб.
Добавьте следующий код перед ядром поиска:
Имя=заменить(Имя,"*","%")
Тел=заменить(Тел,"*","%")
Компания=заменить(Компания,"*","%")
Добавьте следующий код после ядра поиска:
Имя=заменить(Имя,"%","*")
Тел=заменить(Тел,"%","*")
Компания=заменить(Компания,"%","*")
Давайте проанализируем эти высказывания. replace() — это функция замены строк в VB. replace(Name,"*","%") предназначена для замены всех * в имени на %. Другими словами, мы заменяем все вхождения * в трех условиях на %, так что подстановочные знаки в первых трех предложениях заменяются на *. Следующие три предложения могут предотвратить «съедание» %. Все проблемы будут решены.
Имя: | Телефон: | Школа: Оплата% Большая | кнопка поиска |
Результаты поиска:
Имя: Ван Эр Тел.: 22222222 Отделение: Факультет архитектуры Юго-Западного университета Цзяотун
Измените приведенное выше утверждение еще раз и замените * пробелами. Разве это не станет поисковой системой, в которой мы обычно используем пробелы для разделения условий поиска в Google и Baidu?
Рабочая среда: IIS
Язык сценариев: VBScript
База данных: Access/SQL Server
Язык базы данных: SQL
1. краткое содержание:
Будь то динамические веб-сайты, такие как форумы, системы новостей или системы загрузки, вы часто встречаете функции поиска: поиск сообщений, поиск пользователей, поиск программного обеспечения (короче, поиск по ключевым словам) и т. д. В этой статье рассказывается, как создать эффективный Практичный поиск по множеству значений на базе ASP.
В этой статье рассматривается «поиск с нечетким соответствием по множеству условий». После понимания множества условий поиск по одному условию становится проще простого. Вообще говоря, существует два метода поиска по множеству условий: метод перечисления и прогрессивный метод. Когда условий поиска не слишком много ( n <=3), можно использовать метод перебора. Частота операторов равна 2 в n-й степени, растет в геометрической прогрессии. n — номер условия. Очевидно, что при увеличении количества условий следует использовать прогрессивный метод независимо от эффективности или реализуемости программы. Частота операторов равна n и растет линейно. Следует отметить, что идея метода перечисления очень проста. Он определяет, являются ли условия пустыми, одно за другим, а затем выполняет поиск в соответствии с непустыми условиями. В то же время технология таблицы истинности может. использоваться для работы с ситуациями с чрезвычайно большим количеством условий (думаю, никто такого делать не будет), когда условий 4, нужно написать 16 групп утверждений, прогрессивный метод более изобретателен, ориентирован на понимание). Первый — это использование флагов (flag), а второй — умелое использование строковых связей в SQL-символе&. Далее используются примеры для объяснения создания двигателя.
2. Пример:
Мы создаем механизм запросов к адресной книге. Имя базы данных — адресная книга.mdb, имя таблицы — адрес, а поля следующие:
ID | Имя | Тел. | Школа |
1 | Чжан Сан | 33333333 | Факультет компьютерных наук, Университет электронных наук и технологий Китая |
2 | Ли Си | 44444444 | Факультет биологии Сычуаньского университета |
3 | Ван Эр | 22222222 | Факультет архитектуры Юго-Западного университета Цзяотун |
… | … | … | … |
Интерфейс веб-поиска выглядит следующим образом:
Имя: | Телефон: | Школа: | Кнопка «Поиск» |
Исходная программа, использующая метод перечисления, выглядит следующим образом:
<%@ 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")
'Ядро поиска метода перечисления, поскольку есть три условия, поэтому необходимо написать 8 наборов операторов суждения
If if Trim(Name)="" и Trim(Tel)="" и Trim(School)="" then
sql="select * из порядка адресов по идентификатору по возрастанию"
end if
if trip(Name)="" и trip(Tel)="" и Trim(School)<>"" then
sql="select * from Address, где School нравится '%"&trim(School)& Порядок «%' по возрастанию идентификатора»
заканчивается, если
if trip (Name)="" и Trim(Tel)<>"" и Trim(School)="" then
sql="select * from the Address, где Tel, например '%"&trim (Тел)&"%' порядок по возрастанию идентификатора"
заканчивается, если
if Trim(Name)="" и Trim(Tel)<>"" и Trim(School)<>"" then
sql="select * from the Address, где Tel например '%"&trim(Tel)&"%' и School, например '%"&trim(School)&"%', порядок по возрастанию идентификатора"
заканчивается, если
if trip(Name)<>"" и Trim(Tel)="" и Trim(School)="" затем
sql=" выберите * из адреса, где имя типа '%"&trim(Name)&"%' упорядочивается по возрастанию идентификатора"
заканчивается, если
if trip(Name)<>"" и Trim(Tel )="" и Trim(School)<>" " затем
sql="select * из адреса, где имя типа '%"&trim(Name)&"%' и школа типа '%"&trim(School)&"%' порядок по идентификатору по возрастанию"
заканчивается, если
if trip(Name)< >"" и Trim(Tel)<>"" и Trim(School)="" then
sql="select * from Address, где Имя типа '%"&trim(Name) &"%' и Tel, например '%"&trim( Tel)&"%', порядок по возрастанию идентификатора
заканчивается, если
if trip(Name)<>"" и Trim(Tel)<>"" и Trim(School)<> "" then
sql="выберите * из адреса, где имя типа "%"&trim(Name)&"%' и телефон типа "%"&trim(Tel)&"%' и школа типа "%"&trim(School)&" %' order by ID asc"
end if
rs.open sql,conn,1,1
'Отобразить результаты поиска
, если rs.eof и rs.bof then
response.write "В текущей адресной книге нет записей",
иначе
сделать, пока нет rs.eof
response.write "Name:"&rs("Name")&"Telephone:"&rs("Tel")&"School:"&rs("School")&"<br>"
rs.movenext
цикл
end if
'Отключаем базу данных
set rs=nothing
conn.close
set conn=nothing
%>
Понимая приведенную выше программу, сосредоточьтесь на основной части. 8 групп утверждений соответствуют 8 состояниям в 3 полях поиска одно за другим.
Имя | Тел | . |
| |
Пусто | | | Непусто | Пусто | Пусто |
Непусто | |
Непусто | |
| |
| |
Кроме того, обрезка() — это функция VB, которая удаляет пробелы до и после входной строки; % — это многосимвольный подстановочный знак в языке SQL (_ — это односимвольный подстановочный знак), поэтому можно видеть, что %" &trim()&"% очень полезен для поля поиска. Введенные ключевые слова сопоставляются слева направо соответственно; на языке SQL соединение используется для указания того, что между непустыми условиями существует связь "И".
Давайте посмотрим на прогрессивный метод. По сравнению с методом перечисления они отличаются только в основной части:
«Ядро поиска прогрессивного метода заключается в том, чтобы определить, является ли условие пустым или нет. Если оно не пустое, добавьте его. к условию поиска
sql="выбрать * из адреса, где"
if Name<>"" then
sql=sql&" Имя типа '%"&Name&"%' "
flag=1
end if
if Tel<>"" и flag=1 then
sql=sql&" и Tel, как '%"&Tel&"% '"
flag=1
elseif Tel<>"" then
sql=sql&" Tel, как '%"&Tel&"%'"
flag=1
end if
if Company<>"" и flag=1 then
sql=sql&" и компания типа ' %"&Company&"%'"
flag=1
elseif Company <>"" then
sql=sql&" Компания типа '%"&Company&"%'"
flag=1
end if
if flag=0 then
sql="select * из порядка адресов по возрастанию идентификатора"
end if
rs.open sql,conn,1,1
Метод прогрессии — это умный алгоритм, о чем можно судить только по длине операторов. Сложность и суть этого алгоритма заключается в флаге и &. Прежде всего, вы должны знать, что & — это символ конкатенации строк в SQL, который объединяет символы вокруг символа. Снова вернемся к программе, когда Имя не пусто, sql="select * from Address, где Имя типа '%"&Name&"%' "и flag=1; когда Имя не пусто и Тел не пуст, т.е. Tel<>"" и flag=1, sql="select * from the Address, где имя типа '%"&Name&"%' и тело типа '%"&Tel&"%' "пока flag=1, в противном случае, если имя пусто, Tel Not пустой, sql="select * from адрес, где Tel типа '%"&Tel&"%' "и flag=1 и т. д., его можно расширить для поиска с n условиями. Конечно, когда все условия пусты, то есть flag=0, будут выбраны все элементы во всех таблицах.
3. проверять:
На этом этапе устанавливается поисковая система. Вот несколько примеров использования:
Имя: Чжан | Телефон: | Школа: | Кнопка поиска |
Результаты поиска:
Имя: Чжан Сан Тел.: 33333333 Подразделение: Факультет компьютерных наук, Университет электронных наук и технологий Китая
Имя: | Телефон: | Школа: | Кнопка поиска | колледжа
Результаты поиска:
Имя: Чжан Сан Тел.: 33333333 Подразделение: Факультет компьютерных наук Китайского университета электронных наук и технологий
Имя Ли Си Тел.: 44444444 Подразделение: Факультет биологии Сычуаньского университета
Имя: Ван Эр Тел.: 22222222 Отделение: Факультет архитектуры Юго-Западного университета Цзяотун
Имя: | Телефон: 4444 | Школа: Сычуань | Кнопка поиска |
Результаты поиска:
Имя Ли Си Телефон: 44444444 Подразделение: Факультет биологии Сычуаньского университета.
Имя: | Телефон: | Школа: Оплата% Большая | кнопка поиска |
Результаты поиска:
Имя: Ван Эр Телефон: 22222222 Подразделение: Факультет архитектуры Юго-Западного университета Цзяотун.
4. улучшать:
На самом деле, у этого движка все еще есть некоторые недостатки. Проблема в основном заключается в подстановочном знаке %. С одной стороны, это связано с тем, что люди привыкли использовать * в качестве подстановочного знака. С другой стороны, если % появляется в гиперссылке, % будет «съеден» при получении по запросу следующим образом:
--test.htm--
…
<a href=test.asp?content=test%the%sign>нажмите здесь</a>
…
--test.asp--
<%
контент = запрос («контент»)
ответ.записать контент
%>
При просмотре файла test.htm в IE щелкните гиперссылку, и она отобразится следующим образом:
тестзнак
Видно, что % напрямую игнорируется гиперссылкой. Как мы можем решить эту проблему? Все очень просто, делаем небольшой трюк – перегибаем балку и меняем столб.
Добавьте следующий код перед ядром поиска:
Имя=заменить(Имя,"*","%")
Тел=заменить(Тел,"*","%")
Компания=заменить(Компания,"*","%")
Добавьте следующий код после ядра поиска:
Имя=заменить(Имя,"%","*")
Тел=заменить(Тел,"%","*")
Компания=заменить(Компания,"%","*")
Давайте проанализируем эти высказывания. replace() — это функция замены строк в VB. replace(Name,"*","%") предназначена для замены всех * в имени на %. Другими словами, мы заменяем все вхождения * в трех условиях на %, так что подстановочные знаки в первых трех предложениях заменяются на *. Следующие три предложения могут предотвратить «съедание» %. Все проблемы будут решены.
Имя: | Телефон: | Школа: Оплата% Большая | кнопка поиска |
Результаты поиска:
Имя: Ван Эр Тел.: 22222222 Отделение: Факультет архитектуры Юго-Западного университета Цзяотун
Измените приведенное выше утверждение еще раз и замените * пробелами. Разве это не станет поисковой системой, в которой мы обычно используем пробелы для разделения условий поиска в Google и Baidu?