[三流君] −−>
[ASPで遊ぶ、失敗する] −−>
[バックナンバー一覧]
−−> No.093 FORM CHECKBOXから受け取った値を使用してWHERE句の作成
FORM CHECKBOXから受け取った値を使用してWHERE句の作成
本文(発行内容)
<FORM CHECKBOXから受け取った値を使用してWHERE句の作成>
こんにちは、三流プログラマーのKen3です。
今回は、
FORM CHECKBOXから受け取ったデータ
を使用して、WHERE句を作成してみます。
※いろいろなパターンが考えられるのでお好きなやつで。
(みなさんの丸秘テクニックがあったら、教えてください)
/*
* 1.今回のキッカケ
*/
入力フォームのチェックボックスでチェックされた値の使用方法を見直したいなぁ〜
と
思い、今回の発行となりました。
SQLのWHERE句を数パターン作ったので、参考になれば幸いです。
/*
* 2.名前(name="xxx")が一緒のパターンと違うパターン
*/
自分のライブラリを見ると、チェックボックスの事例は、
No.45 HTML FORM INPUT TYPE="CHECKBOX" チェックボックスの入力
http://www.ken3.org/backno/backno_asp10.html#45
で簡単な解説をしてますが、
TYPE="CHECKBOX"で
name="xxxx"が違うパターン
<INPUT TYPE="CHECKBOX" NAME="c1">HTMLから詳しく丁寧に<BR>
<INPUT TYPE="CHECKBOX" NAME="c2" VALUE="VBScript">VBScriptをもっと詳しく<BR>
<INPUT TYPE="CHECKBOX" NAME="c3" VALUE="GAME">ゲーム作ろうよ<BR>
name="xxxx"が同じパターン
<INPUT TYPE="CHECKBOX" NAME="kibou" VALUE="HTML">HTMLから詳しく丁寧に<BR>
<INPUT TYPE="CHECKBOX" NAME="kibou" VALUE="VBScript">VBScriptをもっと詳しく<BR>
<INPUT TYPE="CHECKBOX" NAME="kibou" VALUE="GAME">ゲーム作ろうよ<BR>
実際に、
http://www.ken3.org/cgi-bin/test/test045-1.asp
で、テストすると、
c1,c2,c3と違う場合はそれぞれ、
c1 on (Value=設定無し)
c2 VBScript (Value="VBScript"と値を指定)
など、
チェックした値をRequest.Form("c1")など項目別に取得することができます。
NAME="kibou"と各チェックボックスの名前が同じ場合は、
Request.Form("kibou")の共通の項目名で取得すると、
Valueで指定した値がVBScript, GAMEとカンマで区切られて取得できます。
/*
* 3.TYPE="CHECKBOX"でname="xxxx"が違うパターン
*/
値の受け渡しがなんとなくわかったので、
TYPE="CHECKBOX"でname="xxxx"が違うパターン で Where句を作成してみます。
入力は、
□VBA,□ASP,□24H,□GUCHI
と区分をチェックさせチェックありのデータをWhere句でor指定して取り出します。
<INPUT TYPE="CHECKBOX" NAME="ASP">ASP<br>
<INPUT TYPE="CHECKBOX" NAME="VBA">VBA<br>
<INPUT TYPE="CHECKBOX" NAME="24H">コンビニ系<br>
<INPUT TYPE="CHECKBOX" NAME="GUCHI">愚痴系<br>
と、NAME=の部分を4つ作成して、フォームを作りました。
ア.Ifの連続でWHERE句を作成してみた
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
オマエ何年プログラマーやってんの?
と
読者の心の声が聞こえる書き方で、WHERE句を作成すると、
'WHERE句を作成する
strWHERE = "" '条件を初期化する
'4つの区分をそれぞれ判断する
If Request.Form("VBA") = "on" Then 'VBAの判断
If strWHERE = "" Then
strWHERE = " Where KUBUN='VBA' "
Else
strWHERE = strWHERE & " Or KUBUN='VBA'"
End If
End If
If Request.Form("ASP") = "on" Then 'ASPの判断
If strWHERE = "" Then
strWHERE = " Where KUBUN='ASP' "
Else
strWHERE = strWHERE & " Or KUBUN='ASP'"
End If
End If
If Request.Form("24H") = "on" Then '24Hの判断
If strWHERE = "" Then
strWHERE = " Where KUBUN='24H' "
Else
strWHERE = strWHERE & " Or KUBUN='24H'"
End If
End If
If Request.Form("GUCHI") = "on" Then 'GUCHIの判断
If strWHERE = "" Then
strWHERE = " Where KUBUN='GUCHI' "
Else
strWHERE = strWHERE & " Or KUBUN='GUCHI'"
End If
End If
'SQL文を作成する (作成したWHERE句を組み合わせる)
strSQL = "Select * From KANSOU " '感想(KANSOU)テーブルから全項目(*)
strSQL = strSQL & strWHERE
strSQL = strSQL & "ORDER BY WriteTime DESC" '並べ替えは時間の降順
こんな感じかな。
テストは、
http://www.ken3.org/cgi-bin/test/test093-1.asp
で、実行できます。(カスイ 工夫無しのソースの全てもここで見れます。)
ポイントは、If文でRequest.Form("xxxx")それぞれの区分がonかチッェクして、
さらに前の条件が無ければWHERE あれば or にしただけです。
なんの工夫も無い、よく見かけるプログラムですよね。
イ.同じ処理なんだからループで回そうよ
さてと、みっともないプログラムを見せてしまいましたね。
お口直しのデザートじゃないのですが、
ArrayとUboundで項目名を管理して、同様のWhere句を作成してみました。
'WHERE句を作成する
strKUBUN = Array("VBA", "ASP", "24H", "GUCHI") '区分を配列にする
strWHERE = "" '条件を初期化する
'区分の数だけループさせる
For n = 0 To Ubound(strKUBUN)
If Request.Form(strKUBUN(n)) = "on" Then '区分n番目の項目がonか?
If strWHERE = "" Then '初めの項目か?チェックする
strWHERE = " Where F_KUBUN='" & strKUBUN(n) & "' "
Else '2番目以降はorでつなぐ
strWHERE = strWHERE & " Or F_KUBUN='" & strKUBUN(n) & "' "
End If
End If
Next
'SQL文を作成する (作成したWHERE句を組み合わせる)
strSQL = "Select * From KANSOU " '感想(KANSOU)テーブルから全項目(*)
strSQL = strSQL & strWHERE
strSQL = strSQL & " ORDER BY WriteTime DESC" '並べ替えは時間の降順
テストは、
http://www.ken3.org/cgi-bin/test/test093-2.asp
で、実行できます。(少し工夫したソースの全てもここで見れます。)
ポイントは、Array("VBA", "ASP", "24H", "GUCHI") で項目名の配列作成
For n = 0 To Ubound(strKUBUN)で0番目からループを作成して、
あとは、Request.Form(strKUBUN(n))やstrKUBUN(n)と使用しただけです。
少しはまとまったし、項目増やすだけで変更対応も容易になりました。
まぁ、なんだかんだ言っても、
If Request.Form("ASP") = "on"
If Request.Form(strKUBUN(n)) = "on"
など、項目単位にチェックして、Where句を作る方法でした。
/*
* 4.TYPE="CHECKBOX"でname="xxxx"を同じにしてVALUE=を区分とする
*/
個別にチェックする方法はどうでしたか?
次は、name="KUBUN"と同一にしてValueの値を使ってみます。
入力は、
□VBA,□ASP,□24H,□GUCHI
と区分をチェックさせまでは一緒ですが(見た目は一緒)
NAME="KUBUN"にしてVALUE="XXXX"を下記のように指定してみます。
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="ASP">ASP<br>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="VBA">VBA<br>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="24H">コンビニ系<br>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="GUCHI">愚痴系<br>
と、VALUE=の部分を4つ作成して、フォームを作りました。
ウ.Replaceで途中のカンマを置き換え WHERE IN句を使用する
Request.Form("KUBUN")とすると、
選択された項目がVBA, 24Hとカンマとスペースで区切られて渡ります。
これを利用して、
VBA, 24H
を
WHERE F_KUBUN IN ('VBA','24H')
と、IN句で条件を作ってみます。
'WHERE句を作成する
strKUBUN = Request.Form("KUBUN") 'フォームから区分を受け取る
If strKUBUN = "" Then '区分が選択されていなかったら
strWHERE = "" 'データ無しの時は条件をカラにする
Else ',を変換してWHERE句を作成する
' ASP, 24Hの文字を", "(カンマとスペース1つ)を','に変換する
strWORK = Replace(strKUBUN, ", ", "','") '置き換える
strWHERE = " Where F_KUBUN IN ('" & strWORK & "') "
End If
http://www.ken3.org/cgi-bin/test/test093-3.asp
でテストできます。(ソースの全ても見れます。)
ポイントは特に無く、
", "(カンマとスペース1つ)を','にReplace関数を使って変換してみました。
エ.Request.Form(xxx).Countで複数チェック
いろいろと探っていた副産物なのですが、
If Request.Form("KUBUN").Count > 0 Then '項目数をチェック
と、.Countで同じNAMEで送られて来たデータの個数を取得できます。
それと同時に、
項目名Name="KUBUN"と同一のデータが送られてきたときに、
Request.Form("KUBUN")(1) や Request.Form("KUBUN")(2)
とすると、個別に値を取得することが出来ます。
※(1)からデータが始まります。
※※(0)にはVBA, 24Hとカンマ区切りの値が格納されています。
これを利用して、
'WHERE句を作成する
If Request.Form("KUBUN").Count > 0 Then '項目数をチェック
'複数の時、1番目(最初の条件をまず代入)
strWHERE = " Where F_KUBUN = '" & Request.Form("KUBUN")(1) & "' "
'次の条件((2)から)をループで追加する
For n = 2 To Request.Form("KUBUN").Count
'Orで条件をつなげる
strWHERE = strWHERE & " Or F_KUBUN = '" & Request.Form("KUBUN")(n) & "' "
Next
Else
strWHERE = "" 'データ無しの時は条件をカラにする
End If
http://www.ken3.org/cgi-bin/test/test093-4.asp
でテストできます。(ソースの全ても見れます。)
ポイントは、Request.Form("KUBUN").Countで1以上の時はデータありと判断。
まず、一番目を代入して、
" Where F_KUBUN = '" & Request.Form("KUBUN")(1) & "' "
頭のWhereを付けて作成。
あとは、ループで2番目から数分ORを頭につけて作成してみました。
※Orで条件をつなげたけど、Where INで書くなら、下記のようにしてください
strWHERE = " Where F_KUBUN IN ('" & Request.Form("KUBUN")(1) & "'"
'次の条件((2)から)をループで追加する
For n = 2 To Request.Form("KUBUN").Count
'Orで条件をつなげる
strWHERE = strWHERE & ",'" & Request.Form("KUBUN")(n) & "'"
Next
strWHERE = strWHERE & ")" '最後忘れずに)で閉じてね。
/*
* 5.終わりの挨拶 </HTML>
*/
今回は、
CHECKBOXの値を使って、複数の条件を受け取り、
WHERE句を作成する方法を数パターン書いてみました。
自分にあった方法を使ってみてください。
次回は、
やっと質問の処理、プルダウンとチェックボックスの組み合わせをやってみます。
いろいろと問題点や疑問点を残しつつ、脱線・寄り道の多いメルマガですが、
今後とも、よろしくお願いします。
何かの参考となれば幸いです。
ASP、VBScript勉強中の三流プログラマーのKen3でした。
フィードバック
ASP系の→[掲示板]←を覗く、質問を書き込む
評価・感想
三流君の主なリンク先
[アクセスランキング]
[サイトマップ]
[リンク先・相互リンク先など]
Ken3の日記(weblog) --
[広告・副収入系]
[プログラマー業務の愚痴]
[VBA系の話題]
[ASP系の話題]
[コンビニ系ネタ]
[その他]
その他 宣伝広告