ここでのいわゆる複合フォームとは、ドロップダウン リスト ボックス、単一行テキスト、複数行テキスト、数値など、複数の異なる入力タイプを含むフォームを指します。このようなフォームを頻繁に置き換える必要がある状況では、フォームの動的生成プログラムが必要になります。この記事では、データベースを使用してフォーム定義データを保存し、ASP スクリプトを使用してフォームの HTML コードとフォーム入力を検証するスクリプトを動的に生成する、まさにそのようなシステムを紹介します。
1. データベースのテーブル構造を定義する
Web 上でよく見かける「週次調査」などのフォームは、頻繁に更新する必要があります。フォームとその検証スクリプトを動的に生成するプログラムがあれば、フォーム作成の作業負荷を大幅に軽減できます。
この記事の動的フォームの生成と検証の例では、Access データベースを使用してフォームに関する定義情報を保存します。同時に、簡単にするために、ユーザーがフォームに入力したデータも同じデータベースに保存されます。 。フォームの定義には 2 つのテーブルが必要です。最初のテーブル (定義) はフォーム入力フィールドの定義に使用され、2 番目のテーブル (リスト) は選択リストの選択項目など、各入力フィールドに関する追加情報を保存します。
テーブル定義には次のフィールドが含まれます:
FieldName - フォーム入力フィールドに割り当てられた変数名
ラベル - テキストラベル、入力フィールドの前に表示される情報テキスト
タイプ - 次のように、フォーム入力フィールドの形式と入力値のタイプを表す 1 文字です:
(t) テキスト入力ボックス、つまり < INPUT TYPE="TEXT" >。
(n) テキスト入力ボックスですが、数値が必要です。
(m) メモの内容。コメントまたはその他の大量のテキストの入力に使用されます。複数行のテキスト編集ボックスです。
(b) 「はい」または「いいえ」の入力が必要です。この実装では、この入力を取得するためにチェックボックスが使用され、チェックボックスのテキスト ラベルは「はい」になります。ユーザーが選択した場合、戻り値は「on」になります。
(r) ラジオボタン。
(l) ドロップダウン リスト ボックス。
Min - 数値入力値にのみ有効で、最小値がここに与えられます。この例では、最小値が 1 に設定された「年齢」数値入力ボックスがあります。
Max – このフィールドの値は、入力フィールドのフォームに相対的です。数値入力ボックスの場合、これは許容される最大値を表します。たとえば、「年齢」の最大値は 100 です。テキスト入力ボックスの場合、Max は許可される最大文字数を表します。複数行のテキスト編集ボックスの場合、Max は表示領域内のテキスト行数を表します。
必須 - 入力が必須かどうかを示します。このタイプの値が入力されていない場合、入力バリデータはエラーを報告します。フォームでは、入力する必要がある値はアスタリスクでマークされており、ユーザーにはそのような値を入力する必要があることが脚注の形式で求められます。
この記事のサンプル フォームは、ASP プログラマのアンケートです。定義テーブルのフォームの定義は次のとおりです。
FieldName ラベル タイプ Min Max Required
Name 名前テキスト (t) - 50 いいえ
年齢 年齢番号 (n) 1 100 いいえ
性別。性別単一 選択ボタン (r) - - はい 電子
メールの電子メール アドレス テキスト (t) - - はい 言語
プログラミング言語ドロップダウン リスト ボックス (l) - - いいえ
リストは、入力フィールドで定義されたいくつかの追加情報を保存するために使用されます。この例では、「性別」と「言語」の 2 つの入力値に使用されます。 Lists テーブルは非常に単純で、次の 3 つのフィールドのみが含まれています。
FieldName - 現在のレコードが属するフォーム入力フィールド
Value - 選択項目の値
Label - ユーザーに表示される選択項目のプロンプト テキスト
入力フィールド "Sex"からのみ入力できます。「男性」または「女性」の 2 つの値から選択します。 「言語」には、VBScript、JavaScript、C、Perl、「その他」など、ASP 環境に適用できるいくつかのプログラミング言語がリストされます。
3 番目のテーブル「レコード」には、ユーザーが送信したコンテンツが保存されます。各レコードは、
レコード - コメント タイプ、クエリ文字列の形式で保存されたユーザー入力に対応します。
作成日 – ユーザーがフォームを送信した日時。 RemoteIP - フォーム送信者の IP アドレス。
実際のアプリケーションでは、ユーザーに関するさらに多くの情報を収集する必要がある場合があります。簡単にするために、この例では、送信時刻とユーザー IP アドレスという 2 つの追加情報のみを記録します。
2. 準備
上記のデータ構造と形式の定義が完了したら、スクリプトを記述します。スクリプトの仕事は、フォームを生成し、ユーザーが送信したフォームを処理することです。
フォームを生成する場合でも処理する場合でも、次の 3 つのプロセス (タスク) が不可欠です。 1 つ目は、フォームの生成時とフォームの処理時に検証タイプの値を取得することです。 、フォームから非表示のフィールドが取得されます。プログラムでサポートされているフォーム検証方法には、検証なし、クライアント側 JavaScript 検証、サーバー側 ASP スクリプト検証、クライアント側とサーバー側の両方の検証 (コード名はそれぞれ 0 ~ 3) の 4 種類があります。クエリ文字列に有効な認証方法が指定されていない場合は、4 番目の認証方法がデフォルトになります。この検証処理方法により、クライアントがJavaScript検証の使用を禁止している場合に、サーバ側でのみ検証処理を行うことができるため、柔軟に適用することができます。検証タイプを決定するコードは次のとおりです:
Check Validation Type
引用スニペットは次のとおりです。
iValType = Request.QueryString("val")
IsNumeric(iValType) = False の場合、iValType = 3
iValType > 3 または iValType < 0 の場合、iValType =3
2 番目のタスクは、データベース接続を開き、2 つのレコードセット オブジェクトを作成することです。RS オブジェクトは、このプログラムの主要なレコードセット オブジェクトであり、Definitions テーブルの操作に使用され、主に Lists テーブルからデータを読み取るために使用されます。サンプル プログラムには、ODBC DSN を使用するか、ODBC DSN を使用しない 2 つのデータベース接続方法が用意されています (DSN を使用する場合は、最初に Dynamic という名前の DSN を作成する必要があります。また、DSN を使用してデータベースに接続するためのコードはコメントアウトされています)。
3 番目のタスクは、<HEAD>< /HEAD> などのフォーム スクリプトを生成 (または処理) する前 (および後) に静的 HTML コードを出力し、スクリプト リソースの終了時に占有されていた RS、RSList、およびその他のオブジェクトを解放することです。 。
上記のタスクを完了するコードに加えて、サンプル アプリケーションの残りの ASP スクリプトによって生成される可能性のある 2 種類のページがあります。質問フォーム (上の図を参照) と、フォームの入力後に表示される結果ページです。 submit (後者は、ユーザーによって送信された結果を記録する責任もあります)。実行するスクリプトの部分を決定する最も簡単な方法は、フォームが送信されているかどうかを確認することです。送信されている場合はフォームを処理し、送信されていない場合はフォームを生成します。
フォームを生成していますか? それともフォームを処理していますか?
以下は引用のスニペットです:
Len(Request.Form) = 0 の場合
「フォームを生成します...わずかに...
それ以外
'フォームを処理します...少し...
End If
3. フォームを動的に生成する フォームを
生成するとき、プログラムは定義テーブルの各入力フィールドに従ってレコードを定義し、対応するフォーム HTML コードと JavaScript コードを順番に生成します。 HTML コードで最初に生成されるのはテキスト タグです。
引用スニペットは次のとおりです。
sHTML = sHTML & vbTab & "< TR >" & vbCrLf & vbTab & vbTab
sHTML = sHTML & "< TD VALIGN=" & Chr(34) & "TOP" & Chr(34)
sHTML = sHTML & " >" & vbCrLf & vbTab & vbTab & vbTab
sHTML = sHTML & "< B >" & RS.Fields("ラベル")
次に、プログラムは現在の入力フィールドに入力が必要かどうかを確認します。必要に応じて、ラベル テキストの後にアスタリスクを追加します (値を入力する必要があることを示します)。入力する必要がある値については、対応する JavaScript コードを生成して検証する必要があります。ラジオ ボタンまたは選択リストの場合、他のすべての入力タイプについては、ユーザーが実際にオプションを選択したかどうかがさらに確認されます。入力値が空でないことだけを確認します。
テキスト ラベルの後にはフォームの入力要素が続き、これらの要素の HTML コードは、定義テーブルで指定されたタイプと属性に基づいて生成されます。次のステップでは、入力値の要件に基づいてクライアント側の検証タスクを実行する JavaScript コードを生成します。この例では、数値のみについて、ユーザーの入力が実際に数値であること、およびその数値が許容される最大値と最小値の間にあることを確認するためのさらなるチェックが必要です。上記のコードを生成した後、テーブルの行 (つまり、入力フィールド) を終了し、定義テーブルの次のレコードの処理を続行できます。すべてのデータベース レコードが処理されたら、次のステップは、[送信] ボタンと [クリア] ボタンの HTML コードを追加することです。別の角度から見ると、ここでのプログラムのタスクは、データベース レコードに基づいて各入力フィールドを生成することです。各入力フィールドはテーブルの行を占め、テーブルの各行には 2 つのセルがあります。最初のセルは表示に使用されます。テキスト ラベル、および 2 番目のユニットは入力要素自体を表示します (コードについては dForm.asp を参照)。
上記のプロセスが完了すると、フォームの HTML コードと検証 JavaScript 関数がそれぞれ変数 sHTML と sJavaScript に保存されます。これらのコンテンツをページに書き込む前に、プログラムはクライアントが JavaScript 検証を必要とするかどうかをチェックします。そのような検証が必要ない場合、sJavaScript 変数はクリアされます。
If iValType = 0 Or iValType = 2 then sJavaScript = ""
BODY タグを出力した後、プログラムは次の JavaScript 関数を出力します。
以下は引用部分です。
< スクリプト言語="JavaScript" >
< !--
関数 validate(TheForm){
//クライアントフォームの検証
< %=sJavaScript% >
true を返します。
}
function CheckRadio(objRadio){
//ラジオボタンの値が選択されているかどうか
for(var n = 0; n < objRadio.length; n++){
if(objRadio[n].checked){
true を返します。
}
}
false を返します。
}
関数 CheckList(objList){
//値が選択リストで選択されているかどうか
for(var n = 1; n < objList.length; n++){
if(objList.options[n].selected){
true を返します。
}
}
false を返します。
}
//-- >
</ /スクリプト>
クライアントが JavaScript 検証を必要としない場合、検証関数には「return true」ステートメントが残ります。上記のコードの最後の 2 つの静的 JavaScript 関数 (CheckRadio と CheckList) は、ラジオ ボタンとドロップダウン リスト ボックスを検証するために使用され、これら 2 つの入力フィールドを検証する必要がある場合に、validate 関数がそれらを呼び出します。
これで、ページへのフォームの書き込みを開始できます。
< FORM ACTION="./dform.asp" METHOD="POST" NAME="MyForm" onSubmit="return validate(this)" >
ここでは、validate 関数が返した場合のみtrue その後のみ、フォーム送信操作を実行します。したがって、クライアント側の JavaScript 検証機能がオフになっている場合、validate 関数は自動的に true を返します。
次に追加するのは、val という隠しフィールドです。前述したように、この値はフォームの検証モードを示します。
< INPUT TYPE="HIDDEN" NAME="val" VALUE="< %=iValType% >" >
ユーザーがフォームを送信すると、処理スクリプトはこの値を使用してサーバー側検証を実行するかどうかを決定します。
次に、出力はテーブルマークとテーブルタイトルです。タイトルは変数 sTitleLabel に保存され、この値はスクリプトの実行開始時に初期化されます。
引用部分は次のとおりです。
< テーブルボーダー="0" >
<TR>
< TD COLSPAN="2" ALIGN="CENTER" >
< H2 >< %=sTitleLable% >< /H2 >
< /TD >
< /TR >
改善策として、フィールド FormID をテーブル定義、リスト、およびレコードに追加できます。 FormID はフォームを一意に識別するため、プログラムは複数のフォームを同時に定義し、複数のフォームのユーザー応答結果を保存できます。上記の sTitleLabel については、別のテーブル (Forms など) を使用して保存できます。
表マークと表タイトルに続いて、HTML フォームと「送信」ボタンと「クリア」ボタンのコードが出力されます。この後、sHTML 文字列に「*」が含まれているかどうかをチェックします。含まれている場合は、フォームに入力する必要がある内容があることを意味します。このとき、アスタリスクの意味を説明する脚注が出力されます。
ここに引用があります:
< %=sHTML% >
<TR>
< TD COLSPAN="2" ALIGN="CENTER" >
< INPUT TYPE="SUBMIT" VALUE="フォームを送信" > < INPUT TYPE="リセット" VALUE="クリア" >
< /TD >
<%
'入力が必要なフォームフィールドがあるかどうか、ある場合は'*'の意味を説明するフォームの脚注を出力します
If InStr(sHTML,"*") then
%>
< /TR >
< TD COLSPAN="2" ALIGN="CENTER" >
< FONT SIZE="2" >注: アスタリスクの付いた値は必須です。 </FONT>
< /TD >
< /TR >
<%
終了の場合
%>
< /TABLE >
</ /フォーム >
ここまでで、フォーム生成タスクは完了しました。
4. 送信結果の処理
ASP スクリプトの残りのタスクは、検証、結果のデータベースへの保存、「送信成功/失敗」ページの表示など、サーバー側のフォーム処理です。文字列変数 sBadForm はフォーム検証コードのこの部分で使用されており、プログラムはそれを使用してエラー情報を保存します。検証プロセスの終了時に sBadForm が空の場合は、ユーザーが送信したフォームが正当であることを意味します。それ以外の場合、フォームの送信は拒否され、sBadForm がブラウザに返されます。
フォームでどの検証モードが使用されているかに関係なく、HTTP_REFERER を確認することをお勧めします。このチェックにより、スクリプトの盗難が防止されます。特定の POST がこの Web サイトのページまたはスクリプトからのものであるかどうかを確認するには、2 つのサーバー変数を比較するだけです。
引用スニペットは次のとおりです。
If InStr(Request.ServerVariables("HTTP_REFERER"), _
Request.ServerVariables("HTTP_HOST")) = 0 次に
sBadForm = "<LI>フォームは間違った場所から送信されました。" & vbCrlf
終了の場合
フォームの非表示フィールドがサーバー側検証を実行する必要があることを示している場合、プログラムはフォーム定義データベース レコードを走査し、対応するチェックを実行します。ただし、今回はプログラムが検証する点が異なります。フォームを削除し、sBadForm に不正な入力値情報を追加します。具体的なコードについては、dForm.asp を参照してください。
プログラムは最後に、sBadForm が空かどうかをチェックします。空でない場合、フォームの送信は拒否され、sBadForm がブラウザに書き込まれます。 sBadForm が空の場合は、レコード テーブルにレコードを追加してフォーム データを保存します。フォームのコンテンツを保存する前に、隠しフィールド val を削除する必要があります。この隠しフィールドは常にフォームの最初の入力フィールドになります。
以下は引用部分です。
Len(sBadForm) = 0 の場合
RS.Open「レコード」、DB、3、2、&H0002
RS.AddNew
RS.Fields("レコード") = Mid(Request.Form, InStr(Request.Form, "&") + 1)
RS.Fields("作成済み") = Now()
RS.Fields("RemoteIP") = Request.ServerVariables("REMOTE_ADDR")
RS.アップデート
Response.Write("< H1 >ありがとうございます。< /H1 >")
RS.閉じる
それ以外
Response.Write("< H1 >フォームの送信に失敗しました。< /H1 >")
Response.Write(vbCrLf & sBadForm)
終了の場合
終了の場合
サーバー側のフォーム処理はこれで終わりです。送信されたフォームがあるかどうかに応じて、前のフォーム生成コードとここでのフォーム処理コードを If ステートメントでカプセル化することができます。これにより、スクリプトの 2 つの部分が HTML ドキュメントのヘッダーなどの共通コードを共有します。データベースオブジェクトの作成とリソースの解放を待ちます。
全体として、dForm.asp には動的なフォームの生成と検証に必要なコア機能のみが含まれており、多くの詳細な問題の処理は無視されています。たとえば、前述の複数フォームの問題: 複数のフォームを管理するテーブルを追加すると、スクリプトで指定されたフォームを管理、生成、処理できるようになります。もう 1 つの明らかな欠如は、フォーム定義データを追加、削除、更新する機能と、ユーザーが送信した結果データにアクセスする機能です。このような機能はスタンドアロン プログラムで実装でき、ほとんどの場合、プログラムに組み込むことができます。従来のアプリケーション (B/S 構造のないアプリケーション)。最後に、dForm.asp でサポートされる入力フィールドの種類も制限されており、実際には、専用の電子メール アドレス入力ボックスなど、他のフォーム入力要件が存在する場合があります。ただし、フォームを頻繁に更新する Web サイトの場合、この記事で説明した動的フォーム生成機能と動的検証機能は実際に非常に役立ちます。