ランニング環境:IIS
スクリプト言語:VBScript
データベース:アクセス/SQLサーバー
データベース言語:SQL
1。まとめ:
フォーラム、ニュースシステム、ダウンロードシステムなどの動的なWebサイトに関係なく、誰もが検索機能を検索することがよくあります:検索投稿、検索ユーザー、検索ソフトウェア(短い検索キーワード)など。この記事では、効率的なものを確立する方法を紹介します。実用的な効率、ASPに基づいた多値検索の検索。
この記事は、複数の条件と曖昧な一致する検索に直面しています。これは、多条件を理解しており、単一の条件検索はケーキではありません。一般的に言えば、複数の条件を検索するには、列挙方法と進歩的な方法の2つの方法があります。検索条件はあまり長くなく(n <= 3)、列挙方法は2です。明らかに、条件が増加すると、両方の手順で進行状況方法を採用し、達成することができます。判断の条件が空であるかどうかにかかわらず、列挙方法は非常に単純であると同時に、条件に応じて検索することができます。多くの条件がある(誰も4つの条件でこの種のことをすることはないと思いますが、すでに16セットの文章を書く必要があります)。その1つは、ロゴの位置(フラグ)を使用することであり、2つ目はSQL String Connectionの文字列を使用します。例でエンジンの確立を説明しましょう。
2。例:
アドレス帳クエリエンジンを確立しました。
ID名Tel School
1 3333333333電子科学技術大学電子科学技術大学
2 Li 4444444444四川大学生物学部
3 Wang 2222222222 Southwest Jiaotong大学建築局
…... ... ...
Web検索インターフェイスは次のとおりです。
名前:電話:学校:検索ボタン
列挙法のソース手順は次のとおりです。
<%@ codepage = 936%>
'接続データベース
<%
dim conn
dim dboath
薄暗いrs
dim sql
conn = server.createObject(adodb.connection)を設定します
dbpath = server.mappath(addasbook.mdb)
conn.open driver = {microsoftアクセスドライバー(*.mdb)};
rs = server.createObject(adodb.oldset)を設定します
'Webページから名前、電話、学校の価値を取得する
薄暗い名前
Dim Tel
薄暗いショール
name = request(name)
tel = request(tel)
学校=リクエスト(学校)
「列挙方法の中核、3つの条件があるため、IF判断声明の8つのグループを記述する必要があります
trim(name)= and trim(tel)= and trim(school)= if if then
sql = select * ascによるアドレス注文から
ifを終了します
if trim(name)= and trim(tel)= and trim(school)<> then
sql = select * '%&trim(school)&%order by id ascのような住所から *
ifを終了します
if trim(name)= and trim(tel)<> and trim(school)= then
sql = select *は、 '%&trim(tel)&%' by id ascのようなTelが好きなアドレスから * select *
ifを終了します
if trim(name)= and trim(tel)<> and trim(school)<> then
sql = select *は、 '%&trim(tel)&%'のようなTelが '%&Trim(School)&%Order by id ASCのような場所にあるアドレスから *
ifを終了します
if trim(name)<> and trim(tel)= and trim(school)= then
sql = select * fromアドレスから '%&trim(name)&%' Order by id ascのような名前
ifを終了します
if trim(name)<> and trim(tel)= and trim(school)<> then
sql = select * from address from '%&trim(name)&%'およびschool like '%&trim(school)&%' Order by id asc
ifを終了します
if trim(name)<> and trim(tel)<> and trim(school)= then
sql = select * fromアドレスから「%&trim(name)&%」やtel like '%&trim(tel)&%' Order by id ascのような名前
ifを終了します
if trim(name)<> and trim(tel)<> and trim(school)<> then
sql = select * from [name&trim(name)&% '&tel like'%&trim(tel)&% 'およびSchool like'%&trim(School)&%Order by Ad Scのような名前から
ifを終了します
rs.oopen sql、conn、1,1
'検索結果を表示します
rs.eofとrs.bofの場合
Response.Writeは現在、アドレス帳に記録されていません
それ以外
rs.eofではありません
Response.Write Name:&rs(name)&tel:&rs(tel)&School:&rs(school)&<br>
rs.movenext
ループ
ifを終了します
'データベースを壊します
rs = Nothingを設定します
conn.close
conn =何も設定しません
%>
上記の手順を理解するときは、コアパーツに焦点を当て、3つの検索ボックスの8つの状態に1つずつ、1つずつ、1つの文のセットに焦点を当てます。
テルスクールに名前を付けます
空の
空で空
空で空
空の非空白式
非空白
非空白の非空白
非空白の非空白
非空白の非空白式
さらに、TRIM()はVBの関数であり、入力文字列の前後にスペースを削除します。 &%入力検索ボックス入力キーワードは、左右に一致します。
列挙方法と比較して、進行状況を見てみましょう。
'検索方法の中核、判断条件は空であり、非空白はそれを検索条件に追加します
sql = select *アドレスから
名前が<>の場合
sql = sql&name '%&name&%'
フラグ= 1
ifを終了します
tel <>およびflag = 1の場合
sql = sql&and tel like '%&tel&%'
フラグ= 1
elseif tel <> then
sql = sql&tel like '%&tel&%'
フラグ= 1
ifを終了します
会社<>およびflag = 1の場合
sql = sql&and and company '%&Company&%'
フラグ= 1
Elseif Company <> then
sql = sql&company '%&company&%'
フラグ= 1
ifを終了します
フラグ= 0の場合
sql = select * ascによるアドレス注文から
ifを終了します
rs.oopen sql、conn、1,1
進捗方法は賢明なアルゴリズムであり、ステートメントの長さから単独で見ることができます。このアルゴリズムの難しさと本質は、フラグにあります。まず第一に、あなたは明確でなければなりません、そして、SQLは文字列接続記号であり、シンボルの周りの文字を一緒に縫います。プログラムに戻り、名前が空でない場合、sql = select * from '%&name&%'同時にflag = 1; tel <> and and and flag = 1、sql = select * from from address from '%&name&%'やtel like '%&tel&%'など、そうでなければ名前が空の場合、sql select * from adress wは、flag = 1などで「%&tel&%」のように。もちろん、条件が空の場合、つまりFlag = 0はテーブル内のすべてのアイテムを選択します。
3。確認する:
この時点で、検索エンジンが確立されます。使用の例をいくつか紹介します。
名前:Zhang Tel:学校:検索ボタン
検索結果は次のとおりです。
名前:Zhang San Tel:333333333ユニット:電子科学技術大学のコンピューター部門
名前:電話:学校:大学検索ボタン
検索結果は次のとおりです。
名前:Zhang San Tel:333333333ユニット:電子科学技術大学のコンピューター部門
名前Li SI Tel:444444444ユニット:四川大学生物学部
名前:Wang ER Tel:22222222ユニット:南西ジョートン大学建築局
名前:Tel:4444学校:四川検索ボタン
検索結果は次のとおりです。
名前Li SI Tel:444444444ユニット:四川大学生物学部
名前:電話:学校:ペイ%検索ボタン
検索結果は次のとおりです。
名前:Wang ER Tel:22222222ユニット:南西ジョートン大学建築局
4。改善する:
実際、このエンジンにはいくつかの欠陥があります。一方では、人々が通常*をチャンネルとして使用し、他方ではハイパーリンクに表示される場合、次のようにリクエストを介してそれを取得するときに食べられるためです。
-test.htm--
刈り取り
<a href = test.asp = test%sign>ここをクリック</a>
刈り取り
-test.asp---
<%
content = request(content)
Response.writeコンテンツ
%>
IEでtest.htmを閲覧したら、ハイパーリンクをクリックすると、次のように表示されます。
TestTheSign
%はハイパーリンクによって直接無視されることがわかります。この問題をどのように解決できますか?それは非常にシンプルです、少し手と足を盗むビームと変更を変更しましょう。
検索コアの前に次のコードを追加します。
名前=置き換え(name、*、%)
tel =置換(tel、*、%)
会社=交換(会社、*、%)
検索のコアに次のコードを追加します。
名前=置換(名前、%、*)
tel =置換(tel、%、*)
会社=交換(会社、%、*)
これらの文章を分析しましょう。置換()は、VBの文字列交換機能(名前、%)です。つまり、3つの条件の3つの条件のすべてを%に置き換えたため、最初の3つの文が*に変更されます。最後の3つの文は、%が食べるのを防ぐことができます。すべての問題が解決されます。
名前:電話:学校:ペイ%検索ボタン
検索結果は次のとおりです。
名前:Wang ER Tel:22222222ユニット:南西ジョートン大学建築局
上記のステートメントを変更し、空のグリッドに置き換えます。
補足機能:タイトルとコンテンツを同じ表に照会したいが、タイトルを満たす最初のディスプレイを見つけるなど、これら2つの順に配置したい場合、タイトルの背後にどのように実現できますか?交差点
sql = select * from製品から「%&keyword&%」のようなタイト
SQL = SQL + UNION SELECT * IDDESCによる「%&キーワード&% '注文などのコンテンツからの製品から
2つのSQLステートメントの中央に1つ追加すると、組合は組み合わせて問い合わせることができますが、列は同じでなければならず、1つもあります。
Unionの共同クエリを使用します。これにより、上記の機能が実現されます。
分析:データベースクエリは、タイトルのデータに従って照会され、その後、コンテンツのデータクエリの実現が分割されます。