実行環境:IIS
スクリプト言語:VBScript
データベース:Access/SQL Server
データベース言語:SQL
1.まとめ:
フォーラム、ニュース システム、ダウンロード システムなどの動的な Web サイトで、投稿の検索、ユーザーの検索、ソフトウェアの検索 (つまり、キーワードの検索) などの検索機能がよく使用されます。この記事では、効率的な実用的な ASP ベースのサイト複数値検索。
この記事では「複数条件あいまい一致検索」について説明します。複数条件を理解すれば、単一条件検索は簡単です。複数条件検索には、大きく分けて列挙方式とプログレッシブ方式の 2 つの方式があります。検索条件があまり多くない場合 ( n <=3)、ステートメントの頻度は 2 のn乗となり、条件数は指数関数的に増加します。条件の数が増加する場合、プログラムの効率や実現可能性に関係なく、プログレッシブ手法を採用する必要があることは明らかです。ステートメントの頻度はnであり、直線的に増加します。列挙メソッドの考え方は非常に単純であり、条件が空であるかどうかを 1 つずつ判断し、空ではない条件に従って検索することができます。非常に多くの条件がある状況に対処するために使用されます (このようなことを行う人はいないと思います)。条件が 4 つある場合、16 グループのステートメントを作成する必要があります)。進歩的な方法は、理解に焦点を当て、より独創的です。 1 つ目はフラグ (flag) を使用する方法で、2 つ目は SQL シンボルと文字列接続を賢く使用する方法です。以下に例を使用してエンジンの確立を説明します。
2.例:
アドレス帳クエリ エンジンを構築します。データベース名は addressbook.mdb、テーブル名は address、フィールドは次のとおりです。
ID | 名前 | 電話 | 学校 |
1 | Zhang San | 33333333 | 中国電子科学技術大学コンピューターサイエンス学科 |
2 | Li Si | 44444444 | 四川大学生物学科 |
3 | Wang Er | 22222222 | 西南交通大学建築学科 |
… | … | … | … |
Web 検索インターフェイスは次のとおりです。
列挙メソッドを使用したソースプログラムは以下のとおりです。
<%@ 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")
'名前と電話番号を取得しますWeb ページからの番号、学校の値
dim Name
dim Tel
dim School
Name=request("Name")
Tel=request("Tel")
School=request("School")
'列挙メソッドの検索コア、条件が3つあるので、8組のIf判定文を書く必要がある
if Trim(Name)="" and Trim(Tel)="" and Trim(School)="" then
sql="select * from address order by ID asc"
end if
トリム(名前)= "" および トリム(電話番号)="" および トリム(スクール)<>"" の場合、
sql="select * from address where School like '%"&trim(School)& "%' order by ID asc"
end if
トリム (名前)="" とトリム (電話番号)<>"" とトリム (学校)="" then
sql="sql="select * from address where Tel like '%"&trim (Tel)&"%' ID asc 順に並べる"
end if
トリム(名前)=""、トリム(Tel)<>""、トリム(スクール)<>"" の場合、
sql="select * from address where Tel like '%"&trim(Tel)&"%' および School like '%"&trim(School)&"%' ID 順 asc"
end if
if トリム(Name)<>"" および trim(Tel)=""そして、trim(School)="" then
sql=" select * from address where Name like '%"&trim(Name)&"%' order by ID asc"
end if
if トリム(Name)<>"" andrim(Tel )="" そして、trim(School)<>" " 次に、
sql="select * from address where Name like '%"&trim(Name)&"%' and School like '%"&trim(School)&"%' order by ID asc"
end if
トリム(名前)< >""、トリム(電話番号)<>""、トリム(学校)=""の場合、
sql="sql="select * from address where Name like '%"&trim(Name) &"%" と Tel like '%"&trim( Tel)&"%' ID 順に並べる asc"
end if
トリム(名前)<>"" および Trim(Tel)<>"" および Trim(School)<> "" 次に
sql="select * from address where Name は '%"&trim(Name)&"%'、Tel は '%"&trim(Tel)&"%'、学校は '%"&trim(School)&" %' ID 順 asc"
end if
rs.open sql,conn,1,1
'検索結果を表示
if rs.eof と rs.bof then
response.write "現在のアドレス帳にレコードがありません"
else
do while not rs.eof
response.write "名前:"&rs("名前" )&"電話番号:"&rs("電話番号")&"学校:"&rs("学校")&"<br>"
rs.movenext
ループ
終了 if
'データベースを切断します
set rs=nothing
conn.close
set conn=nothing
%>
上記のプログラムを理解するときは、8 つのステートメント グループが 3 つの検索ボックスの 8 つの状態に 1 つずつ対応していることに注目してください。
さらに、trim() は入力文字列の前後のスペースを削除する VB 関数です。% は SQL 言語の複数文字のワイルドカード (_ は 1 文字のワイルドカード) であるため、%" であることがわかります。 &trim()&"% は検索ボックスに非常に便利です。入力されたキーワードは SQL 言語で左から右にそれぞれ照合され、空ではない条件の間に "AND" 関係があることを示すために接続が使用されます。
プログレッシブ メソッドを見てみましょう。列挙メソッドと比較すると、
「プログレッシブ メソッドの検索の核心は、条件が空かどうかを判断し、空でない場合はそれを追加する」という部分だけが異なります。検索条件に
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
Company<>"" and flag=1 then
sql=sql&" and Company like ' %"&Company&"%'"
flag=1
elseif Company <>"" then
sql=sql&" Company like '%"&Company&"%'"
flag=1
end if
if flag=0 then
sql="select * from address order by ID asc"
end if
rs.open sql,conn,1,1
ステートメントの長さだけを見てもわかるように、プログレッション メソッドは賢いアルゴリズムです。このアルゴリズムの難しさと本質はフラグと&にあります。まず、& は SQL の文字列連結記号であり、記号の周囲の文字をつなぎ合わせることを知っておく必要があります。再びプログラムに戻ります。Name が空でない場合は、sql="select * from address where Name like '%"&Name&"%' "、次に、Name が空でない場合、および Tel が空でない場合は、flag=1 になります。 Tel<>"" および flag=1、sql="select * from address where Name like '%"&Name&"%' and Tel like '%"&Tel&"%' "while flag=1、そうでない場合、Name が空の場合 Tel Not empty, sql="select * from address where Tel like '%"&Tel&"%' " and flag=1; など、n 個の条件で検索するように拡張できます。もちろん、条件がすべて空の場合、つまり flag=0 では、すべてのテーブルのすべての項目が選択されます。
3.確認する:
この時点で、検索エンジンが確立されます。以下にいくつかの使用例を示します。
検索結果は次のとおりです。
名前: Zhang San 電話番号: 33333333 部署: 中国電子科学技術大学コンピューターサイエンス学部
検索結果は次のとおりです。
名前: Zhang San 電話番号: 33333333 単位: 中国電子科学技術大学コンピューターサイエンス学科
名前 Li Si 電話番号: 44444444 単位: 四川大学生物学部
名前: Wang Er 電話番号: 22222222 単位:西南交通大学建築学科
検索結果は次のとおりです。
名前: Li Si 電話: 44444444 所属: 四川大学生物学部
名前: | 電話番号: | 学校: Pay% 大きな | 検索ボタン |
検索結果は次のとおりです。
名前: Wang Er 電話: 22222222 所属: 西南交通大学建築学科
4.改善する:
実際、このエンジンにはまだいくつかの欠陥があります。問題は主にワイルドカード文字 % にあります。これは、ユーザーが * をワイルドカード文字として使用することに慣れているためです。その一方で、% がハイパーリンクに表示されると、次のように、リクエストを通じて取得されたときに % が「食べられる」ことになります。
--test.htm--
…
<a href=test.asp?content=test%the%sign>ここをクリック</a>
…
--test.asp--
<%
content=リクエスト("コンテンツ")
応答.コンテンツの書き込み
%>
IE で test.htm を参照するときに、ハイパーリンクをクリックすると、次のように表示されます。
サインをテストする
% はハイパーリンクによって直接無視されることがわかります。この問題はどうすれば解決できるでしょうか?それは非常に簡単です。ちょっとしたトリックを実行します。梁をひっくり返して柱を変更します。
検索コアの前に次のコードを追加します。
名前=replace(名前,"*","%")
Tel=replace(Tel,"*","%")
Company=replace(会社,"*","%")
検索コアの後に次のコードを追加します。
名前=replace(名前,"%","*")
Tel=replace(Tel,"%","*")
Company=replace(会社,"%","*")
これらのステートメントを分析してみましょう。 replace() は VB の文字列置換関数です。 replace(Name,"*","%") は、Name のすべての * を % に置き換えます。つまり、3 つの条件に出現するすべての * を % に置き換え、最初の 3 つの文のワイルドカード文字が * に変更されます。次の 3 つの文は、% が「食べられる」のを防ぐことができます。すべての問題は解決されます。
名前: | 電話番号: | 学校: Pay% 大きな | 検索ボタン |
検索結果は次のとおりです。
名前: 王爾 電話: 22222222 所属: 西南交通大学建築学部
上記の文を再度変更して、* をスペースに置き換えると、Google や Baidu で検索条件を区切るためにスペースを使用するのが一般的になるのではないでしょうか。
実行環境:IIS
スクリプト言語:VBScript
データベース:Access/SQL Server
データベース言語:SQL
1.まとめ:
フォーラム、ニュース システム、ダウンロード システムなどの動的な Web サイトで、投稿の検索、ユーザーの検索、ソフトウェアの検索 (つまり、キーワードの検索) などの検索機能がよく使用されます。この記事では、効率的な実用的な ASP ベースのサイト複数値検索。
この記事では「複数条件あいまい一致検索」について説明します。複数条件を理解すれば、単一条件検索は簡単です。複数条件検索には、大きく分けて列挙方式とプログレッシブ方式の 2 つの方式があります。検索条件があまり多くない場合 ( n <=3)、ステートメントの頻度は 2 のn乗となり、条件数は指数関数的に増加します。条件の数が増加する場合、プログラムの効率や実現可能性に関係なく、プログレッシブ手法を採用する必要があることは明らかです。ステートメントの頻度はnであり、直線的に増加します。列挙メソッドの考え方は非常に単純であり、条件が空であるかどうかを 1 つずつ判断し、空ではない条件に従って検索することができます。非常に多くの条件がある状況に対処するために使用されます (このようなことを行う人はいないと思います)。条件が 4 つある場合、16 グループのステートメントを作成する必要があります)。進歩的な方法は、理解に焦点を当て、より独創的です。 1 つ目はフラグ (flag) を使用する方法で、2 つ目は SQL シンボルと文字列接続を賢く使用する方法です。以下に例を使用してエンジンの確立を説明します。
2.例:
アドレス帳クエリ エンジンを構築します。データベース名は addressbook.mdb、テーブル名は address、フィールドは次のとおりです。
ID | 名前 | 電話 | 学校 |
1 | Zhang San | 33333333 | 中国電子科学技術大学コンピューターサイエンス学科 |
2 | Li Si | 44444444 | 四川大学生物学科 |
3 | Wang Er | 22222222 | 西南交通大学建築学科 |
… | … | … | … |
Web 検索インターフェイスは次のとおりです。
列挙メソッドを使用したソースプログラムは以下のとおりです。
<%@ 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")
'名前と電話番号を取得しますWeb ページからの番号、学校の値
dim Name
dim Tel
dim School
Name=request("Name")
Tel=request("Tel")
School=request("School")
'列挙メソッドの検索コア、条件が3つあるので、8組のIf判定文を書く必要がある
if Trim(Name)="" and Trim(Tel)="" and Trim(School)="" then
sql="select * from address order by ID asc"
end if
トリム(名前)= "" および トリム(電話番号)="" および トリム(スクール)<>"" の場合、
sql="select * from address where School like '%"&trim(School)& "%' order by ID asc"
end if
トリム (名前)="" とトリム (電話番号)<>"" とトリム (学校)="" then
sql="sql="select * from address where Tel like '%"&trim (Tel)&"%' ID asc 順に並べる"
end if
トリム(名前)=""、トリム(Tel)<>""、トリム(スクール)<>"" の場合、
sql="select * from address where Tel like '%"&trim(Tel)&"%' および School like '%"&trim(School)&"%' ID 順 asc"
end if
if トリム(Name)<>"" および trim(Tel)=""そして、trim(School)="" then
sql=" select * from address where Name like '%"&trim(Name)&"%' order by ID asc"
end if
if トリム(Name)<>"" andrim(Tel )="" そして、trim(School)<>" " 次に、
sql="select * from address where Name like '%"&trim(Name)&"%' and School like '%"&trim(School)&"%' order by ID asc"
end if
トリム(名前)< >""、トリム(電話番号)<>""、トリム(学校)=""の場合、
sql="sql="select * from address where Name like '%"&trim(Name) &"%" と Tel like '%"&trim( Tel)&"%' ID 順に並べる asc"
end if
トリム(名前)<>"" および Trim(Tel)<>"" および Trim(School)<> "" 次に
sql="select * from address where Name は '%"&trim(Name)&"%'、Tel は '%"&trim(Tel)&"%'、学校は '%"&trim(School)&" %' ID 順 asc"
end if
rs.open sql,conn,1,1
'検索結果を表示
if rs.eof と rs.bof then
response.write "現在のアドレス帳にレコードがありません"
else
do while not rs.eof
response.write "名前:"&rs("名前" )&"電話番号:"&rs("電話番号")&"学校:"&rs("学校")&"<br>"
rs.movenext
ループ
終了 if
'データベースを切断します
set rs=nothing
conn.close
set conn=nothing
%>
上記のプログラムを理解するときは、8 つのステートメント グループが 3 つの検索ボックスの 8 つの状態に 1 つずつ対応していることに注目してください。
さらに、trim() は入力文字列の前後のスペースを削除する VB 関数です。% は SQL 言語の複数文字のワイルドカード (_ は 1 文字のワイルドカード) であるため、%" であることがわかります。 &trim()&"% は検索ボックスに非常に便利です。入力されたキーワードは SQL 言語で左から右にそれぞれ照合され、空ではない条件の間に "AND" 関係があることを示すために接続が使用されます。
プログレッシブ メソッドを見てみましょう。列挙メソッドと比較すると、
「プログレッシブ メソッドの検索の核心は、条件が空かどうかを判断し、空でない場合はそれを追加する」という部分だけが異なります。検索条件に
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
Company<>"" and flag=1 then
sql=sql&" and Company like ' %"&Company&"%'"
flag=1
elseif Company <>"" then
sql=sql&" Company like '%"&Company&"%'"
flag=1
end if
if flag=0 then
sql="select * from address order by ID asc"
end if
rs.open sql,conn,1,1
ステートメントの長さだけを見てもわかるように、プログレッション メソッドは賢いアルゴリズムです。このアルゴリズムの難しさと本質はフラグと&にあります。まず、& は SQL の文字列連結記号であり、記号の周囲の文字をつなぎ合わせることを知っておく必要があります。再びプログラムに戻ります。Name が空でない場合は、sql="select * from address where Name like '%"&Name&"%' "、次に、Name が空でない場合、および Tel が空でない場合は、flag=1 になります。 Tel<>"" および flag=1、sql="select * from address where Name like '%"&Name&"%' and Tel like '%"&Tel&"%' "while flag=1、そうでない場合、Name が空の場合 Tel Not empty, sql="select * from address where Tel like '%"&Tel&"%' " and flag=1; など、n 個の条件で検索するように拡張できます。もちろん、条件がすべて空の場合、つまり flag=0 では、すべてのテーブルのすべての項目が選択されます。
3.確認する:
この時点で、検索エンジンが確立されます。以下にいくつかの使用例を示します。
検索結果は次のとおりです。
名前: Zhang San 電話番号: 33333333 部署: 中国電子科学技術大学コンピューターサイエンス学部
検索結果は次のとおりです。
名前: Zhang San 電話番号: 33333333 単位: 中国電子科学技術大学コンピューターサイエンス学科
名前 Li Si 電話番号: 44444444 単位: 四川大学生物学部
名前: Wang Er 電話番号: 22222222 単位:西南交通大学建築学科
検索結果は次のとおりです。
名前: Li Si 電話: 44444444 所属: 四川大学生物学部
名前: | 電話番号: | 学校: Pay% 大きな | 検索ボタン |
検索結果は次のとおりです。
名前: Wang Er 電話: 22222222 所属: 西南交通大学建築学科
4.改善する:
実際、このエンジンにはまだいくつかの欠陥があります。問題は主にワイルドカード文字 % にあります。これは、ユーザーが * をワイルドカード文字として使用することに慣れているためです。その一方で、% がハイパーリンクに表示されると、次のように、リクエストを通じて取得されたときに % が「食べられる」ことになります。
--test.htm--
…
<a href=test.asp?content=test%the%sign>ここをクリック</a>
…
--test.asp--
<%
content=リクエスト("コンテンツ")
応答.コンテンツの書き込み
%>
IE で test.htm を参照するときに、ハイパーリンクをクリックすると、次のように表示されます。
サインをテストする
% はハイパーリンクによって直接無視されることがわかります。この問題はどうすれば解決できるでしょうか?それは非常に簡単です。ちょっとしたトリックを行います。梁をひっくり返し、柱を変更します。
検索コアの前に次のコードを追加します。
名前=replace(名前,"*","%")
Tel=replace(Tel,"*","%")
Company=replace(会社,"*","%")
検索コアの後に次のコードを追加します。
名前=replace(名前,"%","*")
Tel=replace(Tel,"%","*")
Company=replace(会社,"%","*")
これらのステートメントを分析してみましょう。 replace() は VB の文字列置換関数です。 replace(Name,"*","%") は、Name のすべての * を % に置き換えます。つまり、3 つの条件に出現するすべての * を % に置き換え、最初の 3 つの文のワイルドカード文字が * に変更されます。次の 3 つの文は、% が「食べられる」のを防ぐことができます。すべての問題は解決されます。
名前: | 電話番号: | 学校: Pay% 大きな | 検索ボタン |
検索結果は次のとおりです。
名前: 王爾 電話: 22222222 所属: 西南交通大学建築学科
上記の文を再度変更して、* をスペースに置き換えると、Google や Baidu で検索条件を区切るためにスペースを使用するのが一般的になるのではないでしょうか。