三流君ASPで遊ぶ、失敗する
バックナンバー No.45 〜 No.49
<HTML FORM INPUT TYPE="CHECKBOX" チェックボックスの入力>
こんにちは、三流プログラマーのKen3です。
今回は、
TYPE="CHECKBOX" チェックボックスの入力
について、軽く書きたいと思います。
何かの参考となれば幸いです。
/*
* 1.いろいろとやってみたくて
*/
[No.41 POST(Request.Form)/GET(Request.QueryString) で 送られてきた値を表示する]
http://www.ken3.org/backno/backno_asp09.html#41
で、
HTMLフォームから値を受取る処理を書いてました。
TYPE="CHECKBOX" チェックボックスの入力テスト
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
このメルマガでやってほしいことにチェックを入れてください
□HTMLから詳しく丁寧に
□VBScriptをもっと詳しく
□ゲーム作ろうよ
と3つのチェックボックスで下記のHTMLでテストしました。
<INPUT TYPE="CHECKBOX" NAME="c_1" VALUE="on">HTMLから詳しく丁寧に<BR>
<INPUT TYPE="CHECKBOX" NAME="c_2" VALUE="on">VBScriptをもっと詳しく<BR>
<INPUT TYPE="CHECKBOX" NAME="c_3" VALUE="on">ゲーム作ろうよ<BR>
http://www.ken3.org/cgi-bin/test/test041-1.asp でテストできます。
基本的には、
NAME=と項目名を付けて、
VALUE=でチェックされた時渡す値
の2つがACTIONで指定したCGI(ASP)へ渡されることを確認しました。
読者代表の心の中>別になんの問題も無いよ、三流君らしくないけど(笑)
誉められてるのか、けなされてるのかは置いといて、
今回は、いろいろとテストしてみます。
/*
* 2.VALUE="on"じゃつまらないので、値を変えてみる
*/
まずは、軽めに
<INPUT TYPE="CHECKBOX" NAME="c1">HTMLから詳しく丁寧に<BR>
<INPUT TYPE="CHECKBOX" NAME="c2" VALUE="VBScript">VBScriptをもっと詳しく<BR>
<INPUT TYPE="CHECKBOX" NAME="c3" VALUE="GAME">ゲーム作ろうよ<BR>
と、
VALUE無しのパターン と VALUEの値を指定(VBScript,GAME)してみた。
http://www.ken3.org/cgi-bin/test/test045-1.asp
でテスト用に値の表示と入力を行ってみた。
<FORM ACTION="test045-1.asp" METHOD="POST">
<font color="blue">TYPE="CHECKBOX" チェックボックスの入力テスト</font><br>
このメルマガでやってほしいことにチェックを入れてください<br>
<INPUT TYPE="CHECKBOX" NAME="c1">HTMLから詳しく丁寧に<BR>
<INPUT TYPE="CHECKBOX" NAME="c2" VALUE="VBScript">VBScriptをもっと詳しく<BR>
<INPUT TYPE="CHECKBOX" NAME="c3" VALUE="GAME">ゲーム作ろうよ<BR>
<INPUT TYPE="submit" NAME="btn1" VALUE="送信">
</FORM>
全てをチェックしてみると、
項目名 値
c1 on
c2 VBScript
c3 GAME
と値を受取りました。
VALUE無し
~~~~~~~~~
<INPUT TYPE="CHECKBOX" NAME="c1">
の場合は、onを受取ることがわかりました。
VALUE="XXXX"と指定
~~~~~~~~~~~~~~~~~~
当然、指定したXXXXを受取れます。
/*
* 3.項目名が同じだとどうなるか?
*/
VALUEの値の指定、まぁ読んでいて普通だったかなぁ。
指定しないとデフォルトのon 指定すれば指定値ってことで。
私、CHECKBOXは項目のON/OFFだから
□HTMLから詳しく丁寧に
□VBScriptをもっと詳しく
□ゲーム作ろうよ
上記3つの項目に対してON/OFFのチェックを取りたい場合は、
<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=c1,c2,c3 項目名を3つ指定して、値を受取ってました。
下記のようにチェックボックスなのに1つの項目にすると、
<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>
どうなるか?
答えはCMの後で
~~~~~~~~~~~~~~~~
-- CM Ken3が http://www.ken3.org/ で使っているレンタルサーバーの紹介
http://www.ken3.org/asp/server.html
※Access MDB / SQL Server がServer.CreateObject("ADODB.Connection")で使えます
※BASP21でメールが送信可能。Server.CreateObject("basp21pro") で使えます。
http://www.ken3.org/asp/server.html (月額少し高いけど安定してますよ)
-- ここまでCM
じゃなくって、
http://www.ken3.org/cgi-bin/test/test045-1.asp
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
で実際にテストしてもらうとわかりますが、
項目名 値
kibou HTML, VBScript, GAME
と
HTML, VBScript, GAME
選択された項目の値をカンマ区切りで受取れます。
1つ2つ選択時、何も選択しなかった場合など、チェックして遊んでください。
/*
* 4.終わりの挨拶 </HTML>
*/
今回は、
よく使われるON/OFFの入力(チェックボックス)
の小話でした。
ポイントは、
・VALUEで値の指定ができます。
・同じ名前の項目名NAME=XXXXを指定すると選択項目がカンマで区切られて渡されます
ぐらいかなぁ。
入力処理の参考になれば幸いです。
素朴な疑問あったら、気軽に、
メール、掲示板に書き込んでくださいね。
掲示板 : http://www.ken3.org/asp/bbs-asp.html
ASP、VBScript勉強中の三流プログラマーのKen3でした。
----------------------------------
関連項目(ただのバックナンバー紹介)
----------------------------------
[No.41 POST(Request.Form)/GET(Request.QueryString) で 送られてきた値を表示する]
http://www.ken3.org/backno/backno_asp09.html#41
のGET(Request.QueryString) を参考に
<SQL文 SELECT WHERE句でIN演算子を使用して複数条件を選択する>
こんにちは、三流プログラマーのKen3です。
前回、TYPE="CHECKBOX" チェックボックスの入力で名前を同じにすると
カンマで区切られてデータが渡ることをやりました。
今回はそれを応用して、複数条件の選択に挑戦してみます。
何かの参考となれば幸いです。
/*
* 1.いろいろとやってみたくて、複数条件でDBを検索
*/
[No.45 HTML FORM INPUT TYPE="CHECKBOX" チェックボックスの入力]
http://www.ken3.org/backno/backno_asp10.html#45
で、
チェックボックスから値を受取る処理を数パターン書きました。
鉄は熱いうちに〜じゃないけど、
チェックボックスで複数条件を選択、
DBから複数条件を指定してデータを取ってくる
なんて処理を書いてみたいと思います。
データは、db029.mdbのKANSOUテーブルを使用します。
フィールドは
ID オートナンバー
F_KUBUN ASP,VBA,GUCHI,24Hの4つの文字列です
F_NO 0:全体 1〜発行号
F_MEMO コメントです
WriteTime 書き込み・更新時刻
http://www.ken3.org/cgi-bin/test/test029-1.asp
で、データと追加と現在保存されているデータが確認できます。
/*
* 2.複数条件の検索に対応したSQL文を作成する
*/
単独条件は簡単で
http://www.ken3.org/cgi-bin/test/test030-1.asp?KUBUN=ASP
でテストしているみたいに、
発行する(した)SQL文は
Select * From KANSOU WHERE F_KUBUN = 'ASP' ORDER BY WriteTime DESC
と、
WHERE F_KUBUN = 'ASP'を条件にして検索をかけてます。
日付 区分 NO. 感想
2003/04/10 17:47:31 ASP 全体
2003/04/07 16:13:11 ASP 全体 モーグファン モーグのBBSで宣伝みたいに誘導するな!!つぶすぞこんなHP(怒)
2003/04/05 13:22:23 ASP 全体 Yahoo,Google馬鹿、こんなページが上位なんて・・・・もっと良いページ探せ
2003/04/03 16:32:21 ASP 全体 俺は素人だから役にたってるよ
2003/04/02 0:37:12 ASP 全体 こんなもんか
2003/04/01 14:36:34 ASP 全体 zzzzzzzzz
2003/03/31 18:40:17 ASP 全体 だれかテストした?
なんて、過激な区分がASPのメッセージを取出すことが出来ます。
※それにしても怖いメッセージだ・・・
複数条件のSQL文を作ればいいので、
Select * From KANSOU
WHERE F_KUBUN = 'ASP' OR F_KUBUN = 'VBA'
ORDER BY WriteTime DESC
と、
区分がASP か(or) VBAと指定すればOKです。
※ハヤイ話、そんなSQL文を作ればいいんだよね。
http://www.ken3.org/cgi-bin/test/test046-1.asp?ASP=on&VBA=on
でテスト可能です、遊んでみてください。
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>SQL SELECT文で WHERE句 条件をOrでつなげ複数にしてみた</title>
</head>
<body>
<h2>SQL SELECT文で WHERE句 条件をOrでつなげ複数にしてみた</h2>
test046-1.asp<br>
<hr>
<% '頭で、入力パラメーターの文字数をチェックする
strWHERE = "Where "
If Request.QueryString("ASP") = "on" Then
strWHERE = strWHERE & "F_KUBUN = 'ASP' "
End If
If Request.QueryString("VBA") = "on" Then
If strWHERE <> "Where " Then strWHERE = strWHERE & " OR " '2個目〜
strWHERE = strWHERE & "F_KUBUN = 'VBA' "
End If
If Request.QueryString("GUCHI") = "on" Then
If strWHERE <> "Where " Then strWHERE = strWHERE & " OR " '2個目〜
strWHERE = strWHERE & "F_KUBUN = 'GUCHI' "
End If
If Request.QueryString("24H") = "on" Then
If strWHERE <> "Where " Then strWHERE = strWHERE & " OR " '2個目〜
strWHERE = strWHERE & "F_KUBUN = '24H' "
End If
'Where文が生成されたかチェックする
If strWHERE = "Where " Then 'そのままだったら条件文を消す
Response.Write "<b>条件がありませんでした</b><hr>"
strWHERE = "" '条件無しに強引にする
Else
Response.Write "作成した条件[<b>" & strWHERE & "</b>]<hr>"
End If
'表示の関数を呼ぶ(外側に出したかったので)
Call DATA_PRINT(strWHERE)
%>
<HR>
<FORM ACTION="test046-1.asp" METHOD="GET">
<font color="blue">表示させたい区分をチェック(選択)して下さい</font><br>
<INPUT TYPE="CHECKBOX" NAME="ASP">ASP系へのご意見を表示<BR>
<INPUT TYPE="CHECKBOX" NAME="VBA">VBA系へのご意見を表示<BR>
<INPUT TYPE="CHECKBOX" NAME="GUCHI">愚痴系へのご意見を表示<BR>
<INPUT TYPE="CHECKBOX" NAME="24H">コンビニ系へのご意見を表示<BR>
<INPUT TYPE="submit" VALUE="送信">←チェック後送信ボタンを押してください
</FORM>
<hr>
関連項目<br>
<A href="test029-1.asp">db029.mdbへデータ追加する</a><br>
</body>
</html>
<% 'パラメータを受け取り、SQLを発行
Sub DATA_PRINT(strWHERE)
'ADO DB Connection オブジェクトを作成する、英文そのままじゃん
Set db=Server.CreateObject("ADODB.Connection")
'.Provider?プロバイダー?通信会社?じゃなくって
'データアクセスにはJet.OLEDB.4.0を使うことを設定
db.Provider = "Microsoft.Jet.OLEDB.4.0"
'次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す
db.ConnectionString = Server.MapPath("db029.mdb")
'やっとデータベースを開ける
db.open
'SQL文を作る
strSQL = "Select * From KANSOU " '感想(KANSOU)テーブルから全項目(*)セレクト
strSQL = strSQL & strWHERE '作成した条件を使用する
strSQL = strSQL & "ORDER BY WriteTime DESC" '並べ替えは時間の降順
'オマケで画面にデータ表示
Response.Write "<hr>発行する(した)SQL文は<br><B><font color='green'>"
Response.Write strSQL & "</font></B><br>です<hr>"
'お約束のレコードセットの作成 SQL文の発行
Set rs = db.Execute(strSQL)
'データの表示をテーブルで行う
Response.Write "<TABLE Border='1'>"
'見出しをバカっぽく、そのまま書き込む
Response.Write "<TR>"
Response.Write "<TD>日付</TD>"
Response.Write "<TD>区分</TD>"
Response.Write "<TD>NO.</TD>"
Response.Write "<TD>感想</TD>"
Response.Write "</TR>"
'お約束のEOFまでループは(データが無くなるまでループ)、
Do While rs.EOF = False 'レコードセットの.EOFがFalseの間
Response.Write "<TR>" '内容を表示する、行開始のタグ<TR>
Response.Write "<TD>" & rs.Fields.Item("WriteTime") & "</TD>"
Response.Write "<TD>" & rs.Fields.Item("F_KUBUN") & "</TD>"
If rs.Fields.Item("F_NO") = 0 Then '0の全体かチェック
Response.Write "<TD>全体</TD>"
Else
Response.Write "<TD>" & rs.Fields.Item("F_NO") & "</TD>" 'NO表示
End If
Response.Write "<TD>" & rs.Fields.Item("F_MEMO") & "</TD>"
Response.Write "</TR>"
'次のレコードにポインタを移動する
rs.MoveNext 'これを忘れると悲惨なことに、、、
Loop
Response.Write "</TABLE>" 'テーブルは終わりです
'開いていたレコードセットを閉じる
rs.Close
'データベースも閉じようよ
db.Close
'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど)
Set db = Nothing
End Sub |
%>
ポイントは、
~~~~~~~~~~~~
'頭で、入力パラメーターの文字数をチェックする
strWHERE = "Where "
と初期値を代入
If Request.QueryString("ASP") = "on" Then
strWHERE = strWHERE & "F_KUBUN = 'ASP' "
End If
チェックボックスがonだったら、
条件としてF_KUBUN='ASP'を追加
同じく、VBAのチェックがされているか
If Request.QueryString("VBA") = "on" Then
If strWHERE <> "Where " Then strWHERE = strWHERE & " OR " '2個目〜
もう1つのポイントが↑ここで、
初めの代入では、ORがいらないので、このIF文で調整してます。
strWHERE が "Where "の初期値以外なら、
"Where F_KUBUN = 'ASP'"に 'OR' を+する
その後、
strWHERE = strWHERE & "F_KUBUN = 'VBA' "
でVBAの条件式を追加してます。
End If
下記の2つの区分も同様に処理します。
If Request.QueryString("GUCHI") = "on" Then
If strWHERE <> "Where " Then strWHERE = strWHERE & " OR " '2個目〜
strWHERE = strWHERE & "F_KUBUN = 'GUCHI' "
End If
If Request.QueryString("24H") = "on" Then
If strWHERE <> "Where " Then strWHERE = strWHERE & " OR " '2個目〜
strWHERE = strWHERE & "F_KUBUN = '24H' "
End If
条件文が作成されたか、チェックして、パラメータ無しで作成されていない場合は
無し(空白)にします。
'Where文が生成されたかチェックする
If strWHERE = "Where " Then 'そのままだったら条件文を消す
Response.Write "<b>条件がありませんでした</b><hr>"
strWHERE = "" '条件無しに強引にする
Else
Response.Write "作成した条件[<b>" & strWHERE & "</b>]<hr>"
End If
'表示の関数を呼ぶ(外側に出したかったので)
Call DATA_PRINT(strWHERE)
作成した文字列を渡し、SQL文を作り、データを表示してます。
まぁ、単純に
Where F_KUBUN = 'ASP' OR F_KUBUN = 'VBA'
とSQLで使用する文字列を作成しただけでした。
/*
* 3.繰り返しで条件を取り出してみよう SplitとUBoundを使用
*/
区分が4つだったからまだいいけど、
strWHERE = "Where "
If Request.QueryString("ASP") = "on" Then
strWHERE = strWHERE & "F_KUBUN = 'ASP' "
End If
If Request.QueryString("VBA") = "on" Then
If strWHERE <> "Where " Then strWHERE = strWHERE & " OR " '2個目〜
strWHERE = strWHERE & "F_KUBUN = 'VBA' "
End If
If Request.QueryString("GUCHI") = "on" Then
If strWHERE <> "Where " Then strWHERE = strWHERE & " OR " '2個目〜
strWHERE = strWHERE & "F_KUBUN = 'GUCHI' "
End If
If Request.QueryString("24H") = "on" Then
If strWHERE <> "Where " Then strWHERE = strWHERE & " OR " '2個目〜
strWHERE = strWHERE & "F_KUBUN = '24H' "
End If
って処理、バカらしいよね(笑)
10個の条件選択だったら、長いよねIf文好きだよね三流君は。
ちっ、そこまで言われちゃ、キライなFor文でも使ってみるか。
入力フォームの作りを
<FORM ACTION="test046-2.asp" METHOD="GET">
<font color="blue">表示させたい区分をチェック(選択)して下さい</font><br>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="ASP">ASP系へのご意見を表示<BR>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="VBA">VBA系へのご意見を表示<BR>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="GUCHI">愚痴系へのご意見を表示<BR>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="24H">コンビニ系へのご意見を表示<BR>
<INPUT TYPE="submit" VALUE="送信">←チェック後送信ボタンを押してください
</FORM>
と
項目をKUBUN1つにして、VALUEで値のパターンとして、
カンマ区切りでデータを貰えるようにします。
Request.QueryString("KUBUN")=ASP, GUCHI
と受取れます。
次にバラして、文字列の作成なので、
strWHERE = "Where " '初期値の代入
strBOX = Split(Request.QueryString("KUBUN"), ",") 'カンマで区切る
Split関数でカンマを条件に簡単にバラしてみました。
バラした個数が知りたいので、UBound関数で調べ、ループの回数に指定します。
'ループでデータを作成する
For i = 0 To UBound(strBOX) 'UBound使用インデックス最大値までループ
If strWHERE <> "Where " Then strWHERE = strWHERE & " OR " '2個目〜
strWHERE = strWHERE & "F_KUBUN = '" & Trim(strBOX(i)) & "' "
Next
無事、Where F_KUBUN = 'ASP' OR F_KUBUN = 'GUCHI'
と複数条件をループで作成できました。
http://www.ken3.org/cgi-bin/test/test046-2.asp
で実行可能です。
無指定の場合(選択無し)/複数指定/1つだけ指定など遊んでみてください。
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>WHERE句 複数条件作成で SplitとUBoundを使用</title>
</head>
<body>
<h2>WHERE句 複数条件作成で SplitとUBoundを使用</h2>
test046-2.asp<br>
<hr>
Request.QueryString("KUBUN")=<%=Request.QueryString("KUBUN")%><br>
<% '頭で、入力パラメーターをチェックする
strWHERE = "Where " '初期値の代入
strBOX = Split(Request.QueryString("KUBUN"), ",") 'カンマで区切る
Response.Write "UBound(strBOX)=" & UBound(strBOX) & "<br>"
'ループでデータを作成する
For i = 0 To UBound(strBOX) 'UBound使用インデックス最大値までループ
Response.Write "strBOX(" & i & ")=" & strBOX(i) & "<br>"
If strWHERE <> "Where " Then strWHERE = strWHERE & " OR " '2個目〜
strWHERE = strWHERE & "F_KUBUN = '" & Trim(strBOX(i)) & "' "
Next
'Where文が生成されたかチェックする
If strWHERE = "Where " Then 'そのままだったら条件文を消す
Response.Write "<b>条件がありませんでした</b><hr>"
strWHERE = "" '条件無しに強引にする
Else
Response.Write "作成した条件[<b>" & strWHERE & "</b>]<hr>"
End If
'表示の関数を呼ぶ(外側に出したかったので)
Call DATA_PRINT(strWHERE)
%>
<HR>
<FORM ACTION="test046-2.asp" METHOD="GET">
<font color="blue">表示させたい区分をチェック(選択)して下さい</font><br>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="ASP">ASP系へのご意見を表示<BR>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="VBA">VBA系へのご意見を表示<BR>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="GUCHI">愚痴系へのご意見を表示<BR>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="24H">コンビニ系へのご意見を表示<BR>
<INPUT TYPE="submit" VALUE="送信">←チェック後送信ボタンを押してください
</FORM>
<hr>
関連項目<br>
<A href="test029-1.asp">db029.mdbへデータ追加する</a><br>
</body>
</html>
<% 'パラメータを受け取り、SQLを発行
Sub DATA_PRINT(strWHERE)
'ADO DB Connection オブジェクトを作成する、英文そのままじゃん
Set db=Server.CreateObject("ADODB.Connection")
'.Provider?プロバイダー?通信会社?じゃなくって
'データアクセスにはJet.OLEDB.4.0を使うことを設定
db.Provider = "Microsoft.Jet.OLEDB.4.0"
'次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す
db.ConnectionString = Server.MapPath("db029.mdb")
'やっとデータベースを開ける
db.open
'SQL文を作る
strSQL = "Select * From KANSOU " '感想(KANSOU)テーブルから全項目(*)セレクト
strSQL = strSQL & strWHERE '作成した条件を使用する
strSQL = strSQL & "ORDER BY WriteTime DESC" '並べ替えは時間の降順
'オマケで画面にデータ表示
Response.Write "<hr>発行する(した)SQL文は<br><B><font color='green'>"
Response.Write strSQL & "</font></B><br>です<hr>"
'お約束のレコードセットの作成 SQL文の発行
Set rs = db.Execute(strSQL)
'データの表示をテーブルで行う
Response.Write "<TABLE Border='1'>"
'見出しをバカっぽく、そのまま書き込む
Response.Write "<TR>"
Response.Write "<TD>日付</TD>"
Response.Write "<TD>区分</TD>"
Response.Write "<TD>NO.</TD>"
Response.Write "<TD>感想</TD>"
Response.Write "</TR>"
'お約束のEOFまでループは(データが無くなるまでループ)、
Do While rs.EOF = False 'レコードセットの.EOFがFalseの間
Response.Write "<TR>" '内容を表示する、行開始のタグ<TR>
Response.Write "<TD>" & rs.Fields.Item("WriteTime") & "</TD>"
Response.Write "<TD>" & rs.Fields.Item("F_KUBUN") & "</TD>"
If rs.Fields.Item("F_NO") = 0 Then '0の全体かチェック
Response.Write "<TD>全体</TD>"
Else
Response.Write "<TD>" & rs.Fields.Item("F_NO") & "</TD>" 'NO表示
End If
Response.Write "<TD>" & rs.Fields.Item("F_MEMO") & "</TD>"
Response.Write "</TR>"
'次のレコードにポインタを移動する
rs.MoveNext 'これを忘れると悲惨なことに、、、
Loop
Response.Write "</TABLE>" 'テーブルは終わりです
'開いていたレコードセットを閉じる
rs.Close
'データベースも閉じようよ
db.Close
'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど)
Set db = Nothing
End Sub |
%>
/*
* 4.WHERE句でIN演算子を使用する
*/
でも何かなぁ、まだバカっぽいんだよね。
何が?ループで回して条件作成、うまくいったよ。。。
作成されたSQL文って、
Select * From KANSOU
Where F_KUBUN = 'ASP'
OR F_KUBUN = 'VBA'
OR F_KUBUN = 'GUCHI'
OR F_KUBUN = '24H'
ORDER BY WriteTime DESC
でしょ。
まぁ条件が4つのうちどれかが一致したらだからねぇ、こんな感じなんだよキット。
日本語で素直に書くと
区分=ASP か 区分=VBA か 区分=GUCHI か 区分=24H のデータって条件かなぁ。
だったら普通、
区分がASP,VBA,GUCHI,24Hのどれか?って聞き方出来ないの?
そんなオレに出来ないのとか言われてもSQL分を判断するのはコンピュータだしねぇ。
だったら、a,b,cどれか?って条件の書き方できるか調べろよ。
はいはい。
あれ、IN演算子ってのがあるじゃん。
Select * From KANSOU
Where F_KUBUN IN ('ASP', 'VBA', 'GUCHI', '24H')
ORDER BY WriteTime DESC
って書き方できるみたいだよ。
サンプル書いて試せよ
人使いが荒いねぇ・・・
なんて小話は置いといて、
Where F_KUBUN IN ('ASP', 'VBA', 'GUCHI', '24H')
と
フィールド In (値1,値2....値n)
で、...のどれかだったらって判断できるみたいです。
<FORM ACTION="test046-3.asp" METHOD="GET">
<font color="blue">表示させたい区分をチェック(選択)して下さい</font><br>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="ASP">ASP系へのご意見を表示<BR>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="VBA">VBA系へのご意見を表示<BR>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="GUCHI">愚痴系へのご意見を表示<BR>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="24H">コンビニ系へのご意見を表示<BR>
<INPUT TYPE="submit" VALUE="送信">←チェック後送信ボタンを押してください
</FORM>
で、受取れる形式は、
Request.QueryString("KUBUN")=ASP, GUCHI
でしたね。
ASP, GUCHI を
IN ('ASP', 'GUCHI') に直したいので、
Replace関数を使用してみます。
moji = "IN ('" Replace(Request.QueryString("KUBUN"), ", ", "', '") & "')"
と
, (カンマとスペース)を
', '(シングルコーテーション+カンマ+スペース)に変換します。
If IsEmpty(Request.QueryString("KUBUN")) = True Then '条件無し
Response.Write "<b>条件がありませんでした</b><hr>"
strWHERE = "" '条件無しに強引にする
Else
'WHERE INを作成する
strKUBUN = Replace(Request.QueryString("KUBUN"), ", ", "', '")
strWHERE = "WHERE F_KUBUN IN ('" & strKUBUN & "') "
Response.Write "作成した条件[<b>" & strWHERE & "</b>]<hr>"
End If
で無事に
Select * From KANSOU
WHERE F_KUBUN IN ('ASP', 'VBA', 'GUCHI', '24H')
ORDER BY WriteTime DESC
を作成できました。
あとは、表示の関数でWHERE条件を受取りSQLを発行・・・と同じです。
http://www.ken3.org/cgi-bin/test/test046-3.asp?KUBUN=ASP&KUBUN=24H
でテストできます、いろいろとチェックして遊んでください。
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>SQL文 SELECT WHERE IN演算子を使用する</title>
</head>
<body>
<h2>SQL文 SELECT WHERE IN演算子を使用する</h2>
test046-3.asp<br>
<hr>
Request.QueryString("KUBUN")=<%=Request.QueryString("KUBUN")%><br>
<% '頭で、入力パラメーターをチェックする
If IsEmpty(Request.QueryString("KUBUN")) = True Then '条件無し
Response.Write "<b>条件がありませんでした</b><hr>"
strWHERE = "" '条件無しに強引にする
Else
'WHERE INを作成する
strKUBUN = Replace(Request.QueryString("KUBUN"), ", ", "', '")
strWHERE = "WHERE F_KUBUN IN ('" & strKUBUN & "') "
Response.Write "作成した条件[<b>" & strWHERE & "</b>]<hr>"
End If
'表示の関数を呼ぶ(外側に出したかったので)
Call DATA_PRINT(strWHERE)
%>
<HR>
<FORM ACTION="test046-3.asp" METHOD="GET">
<font color="blue">表示させたい区分をチェック(選択)して下さい</font><br>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="ASP">ASP系へのご意見を表示<BR>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="VBA">VBA系へのご意見を表示<BR>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="GUCHI">愚痴系へのご意見を表示<BR>
<INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="24H">コンビニ系へのご意見を表示<BR>
<INPUT TYPE="submit" VALUE="送信">←チェック後送信ボタンを押してください
</FORM>
<hr>
関連項目<br>
<A href="test029-1.asp">db029.mdbへデータ追加する</a><br>
</body>
</html>
<% 'パラメータを受け取り、SQLを発行
Sub DATA_PRINT(strWHERE)
'ADO DB Connection オブジェクトを作成する、英文そのままじゃん
Set db=Server.CreateObject("ADODB.Connection")
'.Provider?プロバイダー?通信会社?じゃなくって
'データアクセスにはJet.OLEDB.4.0を使うことを設定
db.Provider = "Microsoft.Jet.OLEDB.4.0"
'次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す
db.ConnectionString = Server.MapPath("db029.mdb")
'やっとデータベースを開ける
db.open
'SQL文を作る
strSQL = "Select * From KANSOU " '感想(KANSOU)テーブルから全項目(*)セレクト
strSQL = strSQL & strWHERE '作成した条件を使用する
strSQL = strSQL & "ORDER BY WriteTime DESC" '並べ替えは時間の降順
'オマケで画面にデータ表示
Response.Write "<hr>発行する(した)SQL文は<br><B><font color='green'>"
Response.Write strSQL & "</font></B><br>です<hr>"
'お約束のレコードセットの作成 SQL文の発行
Set rs = db.Execute(strSQL)
'データの表示をテーブルで行う
Response.Write "<TABLE Border='1'>"
'見出しをバカっぽく、そのまま書き込む
Response.Write "<TR>"
Response.Write "<TD>日付</TD>"
Response.Write "<TD>区分</TD>"
Response.Write "<TD>NO.</TD>"
Response.Write "<TD>感想</TD>"
Response.Write "</TR>"
'お約束のEOFまでループは(データが無くなるまでループ)、
Do While rs.EOF = False 'レコードセットの.EOFがFalseの間
Response.Write "<TR>" '内容を表示する、行開始のタグ<TR>
Response.Write "<TD>" & rs.Fields.Item("WriteTime") & "</TD>"
Response.Write "<TD>" & rs.Fields.Item("F_KUBUN") & "</TD>"
If rs.Fields.Item("F_NO") = 0 Then '0の全体かチェック
Response.Write "<TD>全体</TD>"
Else
Response.Write "<TD>" & rs.Fields.Item("F_NO") & "</TD>" 'NO表示
End If
Response.Write "<TD>" & rs.Fields.Item("F_MEMO") & "</TD>"
Response.Write "</TR>"
'次のレコードにポインタを移動する
rs.MoveNext 'これを忘れると悲惨なことに、、、
Loop
Response.Write "</TABLE>" 'テーブルは終わりです
'開いていたレコードセットを閉じる
rs.Close
'データベースも閉じようよ
db.Close
'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど)
Set db = Nothing
End Sub |
%>
/*
* 5.終わりの挨拶 </HTML>
*/
今回は、
SQL文 SELECT WHERE句で複数条件を指定する方法
の小話でした。
ポイントは、
・OR を使用して条件を複数作ってみた
・WHERE句でIN演算子を使用して複数条件を選択する
ぐらいかなぁ。
入力処理の参考になれば幸いです。
素朴な疑問あったら、気軽に、
メール、掲示板に書き込んでくださいね。
掲示板 : http://www.ken3.org/asp/bbs-asp.html
ASP、VBScript勉強中の三流プログラマーのKen3でした。
----------------------------------
関連項目(ただのバックナンバー紹介)
----------------------------------
[No.45 HTML FORM INPUT TYPE="CHECKBOX" チェックボックスの入力]
http://www.ken3.org/backno/backno_asp10.html#45
で、
チェックボックスから値を受取る処理を数パターン書きました。
[No.21 文字列の置き換え、Replace関数を使用]
http://www.ken3.org/backno/backno_asp05.html#21
でReplace関数の説明を少し
[No.24 Split関数で配列作成、UBoundで個数の判断]
http://www.ken3.org/backno/backno_asp05.html#24
でSplit関数を使用して文字列分解とUBoundで個数の判断をやりました。
<いろいろな削除処理で遊んでみた(笑)>
こんにちは、三流プログラマーのKen3です。
今回は、データの削除処理で遊んでみます。
タイトルいろいろなとなっているけど、数パターンです(笑)
※誇大タイトルかなぁ
拾い読みして、何かの参考となれば幸いです。
/*
* 1.削除処理を振りかえってみた
*/
[No.32 SQL DELETE文でデータを削除してみた]
http://www.ken3.org/backno/backno_asp07.html#32
で、SQL DELETE文を発行してみました。
基本は、
IDが5番のデータを削除するには、
Delete From KANSOU Where ID = 5
と
Delete From テーブル Where 条件
のSQL文を発行します。
削除したいデータを特定するために、IDフィールド(自動連番の)を使っていました。
元データを一覧表示して、
1行単位で、
フォームの隠し項目でIDを管理、
削除ボタンが押されたら削除用のASPを呼び、
呼ばれた側でIDを条件にした削除のSQL DELETE文を発行してました。
http://www.ken3.org/cgi-bin/test/test032-1.asp
でデータを選択して、test032-2.aspで削除処理を行っていました。
※選択・削除実行と2つのASPファイルでした。
/*
* 2.2つの処理を1つにまとめてみた
*/
別に、ムリにまとめなくてもよいのですが、
データ選択処理と削除処理を1つにまとめてみました。
まとめるポイントは、
頭で、削除するIDが送られて来たら削除するSQL文を発行。
データを一覧表示して削除ボタンを作り、ACTIONで自分自身を呼びます。
いつもながら、わかりにくい日本語だね。
そうですよね、、、では、いつものサンプル紹介から。
データベース名:db029.mdb
テーブル名:KANSOU
フィールド
ID オートナンバー型
F_KUBUN テキスト型 ASP,VBA,GUCHI,24Hと4つの区分
F_NO 整数型 0:は全体に対して、1〜はX話にする
F_MEMO テキスト型 一言メッセージ
WriteTime 日付型 書き込み日付
http://www.ken3.org/cgi-bin/test/test047-1.asp
でテスト実行できます。
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>削除データの選択とSQL DELETE文の発行</title>
</head>
<body>
<h2>削除データの選択とSQL DELETE文の発行</h2>
test047-1.asp<br>関連項目
<A href="test029-1.asp">データの登録(SQL INSERT文でテストデータを増やす)</a><br>
<%
'ADO DB Connection オブジェクトを作成する、英文そのままじゃん
Set db=Server.CreateObject("ADODB.Connection")
'データアクセスにはJet.OLEDB.4.0を使うことを設定
db.Provider = "Microsoft.Jet.OLEDB.4.0"
'次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す
db.ConnectionString = Server.MapPath("db029.mdb")
'やっとデータベースを開ける
db.open
'IDが送られてきたかチェックする
If IsEmpty(Request.Form("DELETE_ID")) = False Then 'IDが在りの時
'IDを条件にSQL DELETE文を作る
strSQL = "DELETE From KANSOU " '感想(KANSOU)テーブルを削除するので
strSQL = strSQL & " Where ID=" & Request.Form("DELETE_ID")
Response.Write "<hr>データ削除IDは" & Request.Form("DELETE_ID")
'オマケで画面にデータ表示
Response.Write "<br>発行する(した)SQL文は<br><B><font color='green'>"
Response.Write strSQL & "</font></B><br>です<hr>"
'SQL文の発行
db.Execute(strSQL)
End If
'
'データ表示と削除ボタン生成
'
'一覧表示用のSQL文を作る
strSQL = "Select * From KANSOU " '感想(KANSOU)テーブルから全項目(*)セレクト
strSQL = strSQL & "ORDER BY WriteTime DESC" '並べ替えは時間の降順
'オマケで画面にデータ表示
Response.Write "<hr>発行する(した)SQL文は<br><B><font color='green'>"
Response.Write strSQL & "</font></B><br>です<hr>"
'お約束のレコードセットの作成 SQL文の発行
Set rs = db.Execute(strSQL)
'データの表示をテーブルで行う
Response.Write "<TABLE Border='1'>"
'見出しをバカっぽく、そのまま書き込む
Response.Write "<TR>"
Response.Write "<TD>アクション</TD>"
Response.Write "<TD>日付</TD>"
Response.Write "<TD>区分</TD>"
Response.Write "<TD>NO.</TD>"
Response.Write "<TD>感想</TD>"
Response.Write "</TR>"
'お約束のEOFまでループは(データが無くなるまでループ)、
Do While rs.EOF = False 'レコードセットの.EOFがFalseの間
Response.Write "<TR>" '内容を表示する、行開始のタグ<TR>
'フォームを作成する ※ACTIONで自分自身を呼ぶ
Response.Write "<TD><FORM ACTION='test047-1.asp' METHOD='POST'>"
'IDを隠し項目(DELETE_ID)にする
Response.Write "<INPUT type='hidden' NAME='DELETE_ID' VALUE='"
Response.Write rs.Fields.Item("ID") & "'>"
'ボタンは普通に作成する
Response.Write "<INPUT TYPE='submit' VALUE='削除'>"
Response.Write "</FORM></TD>"
'中身を表示
Response.Write "<TD>" & rs.Fields.Item("WriteTime") & "</TD>"
Response.Write "<TD>" & rs.Fields.Item("F_KUBUN") & "</TD>"
If rs.Fields.Item("F_NO") = 0 Then '0の全体かチェック
Response.Write "<TD>全体</TD>"
Else
Response.Write "<TD>" & rs.Fields.Item("F_NO") & "</TD>" 'NO表示
End If
Response.Write "<TD>" & rs.Fields.Item("F_MEMO") & "</TD>"
Response.Write "</TR>"
'次のレコードにポインタを移動する
rs.MoveNext 'これを忘れると悲惨なことに、、、
Loop
Response.Write "</TABLE>" 'テーブルは終わりです
rs.Close '開いていたレコードセットを閉じる
db.Close 'データベースも閉じようよ
Set db = Nothing 'お行儀よくオブジェクトも開放しましょう
%>
<HR>
終了です。<br>
<A href="test029-1.asp">データの登録(テストデータを増やす、消したら書いてね)</a><br>
</body>
</html>
処理の解説とポイント
~~~~~~~~~~~~~~~~~~~~
・データベースオープン(接続)
・IsEmptyで送られたデータをチェック
データ在りの時、DELETE文の発行
・データ一覧の表示
IDを隠し項目として自分自身を呼ぶ削除ボタンの作成
簡単な流れはこんな感じです。
http://www.ken3.org/cgi-bin/test/test047-1.asp
が初回に呼ばれた時は、
If IsEmpty(Request.Form("DELETE_ID")) = False Then
のチェックで何もしないで、
2回目に呼ばれた時に、削除のSQLを発行してます。
あとは、隠し項目でDELETE_IDを持った自分自身を呼ぶ削除のボタンを作成してます。
'フォームを作成する ※ACTIONで自分自身を呼ぶ
Response.Write "<TD><FORM ACTION='test047-1.asp' METHOD='POST'>"
'IDを隠し項目(DELETE_ID)にする
Response.Write "<INPUT type='hidden' NAME='DELETE_ID' VALUE='"
Response.Write rs.Fields.Item("ID") & "'>"
'ボタンは普通に作成する
Response.Write "<INPUT TYPE='submit' VALUE='削除'>"
Response.Write "</FORM></TD>"
type='hidden'で隠し項目に設定してます。
/*
* 3.複数のデータを削除してみたい
*/
まぁ、なんとなく出来たんだけど(オイオイそんなんでいいの?)
ボタンを押したら該当データの削除から、
今度は、チェックボックスを使用して
チェックされたデータ複数を削除する処理に挑戦してみたいと思います。
[No.45 HTML FORM INPUT TYPE="CHECKBOX" チェックボックスの入力]
http://www.ken3.org/backno/backno_asp10.html#45
で、
チェックボックスから値を受取る処理を数パターン書きました。
下記のようにチェックボックスなのに1つの項目にすると、
<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
で実際にテストしてもらうとわかりますが、
項目名 値
kibou HTML, VBScript, GAME
と
HTML, VBScript, GAME
選択された項目の値をカンマ区切りで受取れます。
[No.46 SQL文 SELECT WHERE句でIN演算子を使用して複数条件を選択する]
http://www.ken3.org/backno/backno_asp10.html#46
でWHERE句でIN演算子を使用して複数条件の選択方法を書きました
IN演算子を使用して、
Select * From KANSOU
Where F_KUBUN IN ('ASP', 'VBA', 'GUCHI', '24H')
ORDER BY WriteTime DESC
とSQL文を発行しました。
読者の心の声:あっ、組み合わせれば出来そう、もうメルマガ見なくてイイヤ
なんて声が聞こえたかどうかはわかりませんが、
組み合わせれば出来そうです。
IDの選択方法をチェックボックスに直し、
削除のDELETE文をWhere ID IN ( 99, 99 ... )に対応させる。
削除IDの94, 93, 92を受取り、
DELETE From KANSOU Where ID IN (94, 93, 92)
と発行すれば複数データを削除できます。
下記、修正した複数削除のサンプルです。
http://www.ken3.org/cgi-bin/test/test047-2.asp
でテストできます。遊んでみてください。
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>複数の削除データ選択とSQL DELETE文の発行</title>
</head>
<body>
<h2>複数の削除データ選択とSQL DELETE文の発行</h2>
test047-2.asp<br>関連項目
<A href="test029-1.asp">データの登録(SQL INSERT文でテストデータを増やす)</a><br>
<%
'ADO DB Connection オブジェクトを作成する、英文そのままじゃん
Set db=Server.CreateObject("ADODB.Connection")
'データアクセスにはJet.OLEDB.4.0を使うことを設定
db.Provider = "Microsoft.Jet.OLEDB.4.0"
'次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す
db.ConnectionString = Server.MapPath("db029.mdb")
'やっとデータベースを開ける
db.open
'IDが送られてきたかチェックする
If IsEmpty(Request.Form("DELETE_ID")) = False Then 'IDが在りの時
'IDを条件にSQL DELETE文を作る
strSQL = "DELETE From KANSOU " '感想(KANSOU)テーブルを削除するので
'複数項目に対応するために、Where ID INを使用する
strSQL = strSQL & " Where ID IN (" & Request.Form("DELETE_ID") & ")"
Response.Write "<hr>データ削除IDは" & Request.Form("DELETE_ID")
'オマケで画面にデータ表示
Response.Write "<br>発行する(した)SQL文は<br><B><font color='green'>"
Response.Write strSQL & "</font></B><br>です<hr>"
'SQL文の発行
db.Execute(strSQL)
End If
'
'データ表示と削除ボタン生成
'
'一覧表示用のSQL文を作る
strSQL = "Select * From KANSOU " '感想(KANSOU)テーブルから全項目(*)セレクト
strSQL = strSQL & "ORDER BY WriteTime DESC" '並べ替えは時間の降順
'オマケで画面にデータ表示
Response.Write "<hr>発行する(した)SQL文は<br><B><font color='green'>"
Response.Write strSQL & "</font></B><br>です<hr>"
'お約束のレコードセットの作成 SQL文の発行
Set rs = db.Execute(strSQL)
'フォームを作成する ※ACTIONで自分自身を呼ぶ
Response.Write "<TD><FORM ACTION='test047-2.asp' METHOD='POST'>"
Response.Write "削除したいデータにチェックを入れ実行ボタンを押してください<br>"
Response.Write "<INPUT TYPE='submit' VALUE='削除実行'>"
'データの表示をテーブルで行う
Response.Write "<TABLE Border='1'>"
'見出しをバカっぽく、そのまま書き込む
Response.Write "<TR>"
Response.Write "<TD>アクション</TD>"
Response.Write "<TD>日付</TD>"
Response.Write "<TD>区分</TD>"
Response.Write "<TD>NO.</TD>"
Response.Write "<TD>感想</TD>"
Response.Write "</TR>"
'お約束のEOFまでループは(データが無くなるまでループ)、
Do While rs.EOF = False 'レコードセットの.EOFがFalseの間
Response.Write "<TR>" '内容を表示する、行開始のタグ<TR>
'CHECKBOX DELETE_ID 作成
Response.Write "<TD><INPUT type='CHECKBOX' NAME='DELETE_ID' VALUE='"
Response.Write rs.Fields.Item("ID") & "'></TD>"
'データの中身を表示
Response.Write "<TD>" & rs.Fields.Item("WriteTime") & "</TD>"
Response.Write "<TD>" & rs.Fields.Item("F_KUBUN") & "</TD>"
If rs.Fields.Item("F_NO") = 0 Then '0の全体かチェック
Response.Write "<TD>全体</TD>"
Else
Response.Write "<TD>" & rs.Fields.Item("F_NO") & "</TD>" 'NO表示
End If
Response.Write "<TD>" & rs.Fields.Item("F_MEMO") & "</TD>"
Response.Write "</TR>"
'次のレコードにポインタを移動する
rs.MoveNext 'これを忘れると悲惨なことに、、、
Loop
Response.Write "</TABLE>" 'テーブルは終わりです
Response.Write "<INPUT TYPE='submit' VALUE='削除実行'>"
Response.Write "<FORM>"
rs.Close '開いていたレコードセットを閉じる
db.Close 'データベースも閉じようよ
Set db = Nothing 'お行儀よくオブジェクトも開放しましょう
%>
<HR>
終了です。<br>
<A href="test029-1.asp">データの登録(テストデータを増やす、消したら書いてね)</a><br>
</body>
</html>
ポイント解説
~~~~~~~~~~~~
strSQL = "DELETE From KANSOU " '感想(KANSOU)テーブルを削除するので
'複数項目に対応するために、Where ID INを使用する
strSQL = strSQL & " Where ID IN (" & Request.Form("DELETE_ID") & ")"
普通に、Where ID INとしただけでした。
次はチェックボックスの作成です、
'CHECKBOX DELETE_ID 作成
Response.Write "<TD><INPUT type='CHECKBOX' NAME='DELETE_ID' VALUE='"
Response.Write rs.Fields.Item("ID") & "'></TD>"
と、type='CHECKBOX'に変更しただけです。
意外と簡単にできましたね。
http://www.ken3.org/cgi-bin/test/test047-2.asp
でテストできます。遊んでみてください。
/*
* 4.終わりの挨拶 </HTML>
*/
今回は、
削除処理のパターンを2つ書きました。
ポイントは、
・自分自身を呼んで処理をまとめる
・WHERE句でIN演算子を使用して複数条件を削除
ぐらいかなぁ。
まぁ、複数削除はあまり無いと思いますが、
複数選択、処理実行のサンプルになれば幸いです。
素朴な疑問あったら、気軽に、
メール、掲示板に書き込んでくださいね。
掲示板 : http://www.ken3.org/asp/bbs-asp.html
ASP、VBScript勉強中の三流プログラマーのKen3でした。
----------------------------------
関連項目(ただのバックナンバー紹介)
----------------------------------
[No.32 SQL DELETE文でデータを削除してみた]
http://www.ken3.org/backno/backno_asp07.html#32
で、SQL DELETE文を発行してみました。
[No.45 HTML FORM INPUT TYPE="CHECKBOX" チェックボックスの入力]
http://www.ken3.org/backno/backno_asp10.html#45
で、チェックボックスから値を受取る処理を数パターン書きました。
[No.46 SQL文 SELECT WHERE句でIN演算子を使用して複数条件を選択する]
http://www.ken3.org/backno/backno_asp10.html#46
でWHERE句でIN演算子を使用して複数条件の選択方法を書きました
<IsXXXXの処理でいろいろと遊んでみた(笑)>
こんにちは、三流プログラマーのKen3です。
今回は、IsEmptyやIsDate、そんなチェック関係の処理で遊んでみます。
タイトルいろいろなとなっているけど、数パターンです(笑)
※誇大タイトルかなぁ
拾い読みして、何かの参考となれば幸いです。
/*
* 1.IsEmptyでデータチェック
*/
変数が初期化されているか、されていないかを
IsEmpty関数でチェックできます。
[No.5 IsEmptyでデータチェック ]
http://www.ken3.org/backno/backno_asp02.html#5
で、パラメータの受取りのチェック処理を軽く書いてます。
使い方は簡単で、IsEmpty(変数)でTrue/Falseの戻り値で判断します。
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>IsEmpty関数でデータのチェック</title>
</head>
<body>
<!-- Ken3 --><!-- #include file="info.inc" -->
<h2>IsEmpty関数でデータのチェック</h2>
Request.QueryString("DATA")をチェックすると、、、<br>
<%
'IsEmptyで変数をチェックする
If IsEmpty(Request.QueryString("DATA")) = True Then 'DATAが無しの時
Response.Write "DATAパラメータを受取れませんでした"
Else
Response.Write "受取ったパラメータは["
Response.Write Request.QueryString("DATA") & "]です"
End If
%>
<HR>
パラメータ無し<A href="test048-1.asp">test048-1.asp</a><br>
パラメータあり<A href="test048-1.asp?DATA=ABC">test048-1.asp?DATA=ABC</a><br>
項目DATAはあり<A href="test048-1.asp?DATA">test048-1.asp?DATA</a><br>
<br>
</body>
</html>
-------
If IsEmpty(Request.QueryString("DATA"))のチェックで
http://www.ken3.org/cgi-bin/test/test048-1.asp
http://www.ken3.org/cgi-bin/test/test048-1.asp?DATA=ABC
はあり/なしなので、想像つきやすいですよね、
問題は、
http://www.ken3.org/cgi-bin/test/test048-1.asp?DATA
と項目だけあった場合どうなるでしょう?
私もわからなかったので、やってみたらFalseで
受取ったパラメータは[]ですと表示されました。
xxx.asp?MODE=DELETE&NO=123
とやらずに
xxx.asp?DELETE&NO=123
として、xxx.asp側でIsEmptyを使用して判断するのもありかなぁ
※好みの問題だけどね
あっ、せっかく作った表示のツール使おう
http://www.ken3.org/cgi-bin/tools/look.asp?MODE=DELETE&NO=123
とここまでは、普通、
http://www.ken3.org/cgi-bin/tools/look.asp?DELETE&NO=123
でテストすると、あれ?項目名がおかしいよ。
http://www.ken3.org/cgi-bin/tools/look.asp?ADD=&NO=777&USERID=Ken3
なんてテストすると、いろいろと処理の感じがつかめるかも。
データチェックや渡し方、、、奥が深そうな予感、、、
/*
* 2.何に使うの? IsArray関数 , IsObject関数
*/
よくわからなかったのが、
IsArray関数 , IsObject関数
の2つ。
IsNull関数は、変数の中身がNullを表しているかのチェックなのでわかるけど、
IsArray関数 変数が配列か?
IsObject関数 変数がOBJECT変数か?
この2つはテストの例題が浮かばなかった。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Function関数やSub関数の引数チェックに使うのかなぁと思いつつ、
かるく触れただけでサヨナラです(思いついたらまた発行します)
/*
* 3.IsDate関数で変換可能か調べ、CDate関数で変換、DateAddで遊ぶ
*/
IsDate関数は式を日付に変換可能かチェックする関数です。
チェック後に変換可能ならCDate関数を使用して変換し、
DateAdd関数を使って+−してみます。
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>IsDate関数で変換可能か調べ、CDate関数で変換、DateAddで遊ぶ</title>
</head>
<body>
<!-- Ken3 --><!-- #include file="info.inc" -->
<h2>IsDate関数で変換可能か調べ、CDate関数で変換、DateAddで遊ぶ</h2>
受取ったパラメータは<br>[<%=Request.QueryString("DATA")%>]<br>
<%
'IsDateで変数をチェックする
If IsDate(Request.QueryString("DATA")) = True Then '変換可能な時
DATA = CDate(Request.QueryString("DATA"))
Response.Write "CDateの結果は" & DATA & "です<br>"
Response.Write "3日後は、" & DateAdd("d", 3, DATA) & "です<br>"
Response.Write "1ヶ月前は、" & DateAdd("m", -1, DATA) & "です<br>"
D = Request.QueryString("DATA") 'パラメータをそのまま
Else '変換不可の時
Response.Write "を日付に変換することはできません"
D=Date() '現在日付を代入
End If
%>
<HR>
<FORM ACTION="test048-2.asp" METHOD="GET">
変換したい日付文字列
<INPUT TYPE="text" SIZE="30" NAME="DATA" VALUE="<%=D%>">
<INPUT TYPE="submit" VALUE="変換テスト"><br>
↑いろいろと遊んでみてください↑
</FORM>
<br>
</body>
</html>
http://www.ken3.org/cgi-bin/test/test048-2.asp?DATA=2003-04-10
http://www.ken3.org/cgi-bin/test/test048-2.asp?DATA=04-15
http://www.ken3.org/cgi-bin/test/test048-2.asp?DATA=2000.4.1
http://www.ken3.org/cgi-bin/test/test048-2.asp?DATA=ABC
など、あとは、テキストボックスに入れて気になる日付書式をテストしてください。
/*
* 4.IsNumeric関数 でチェック
*/
IsNumeric関数で式が数値を表せるかチェックするのかぁ・・
その後、CIntとFormatNumber関数で遊んでます。
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>IsNumeric関数で変換可能か調べ、CInt関数,FormatNumber関数を使う</title>
</head>
<body>
<!-- Ken3 --><!-- #include file="info.inc" -->
<h2>IsNumeric関数で変換可能か調べ、CInt関数,FormatNumber関数を使う</h2>
受取ったパラメータは<br>[<%=Request.QueryString("DATA")%>]<br>
<%
'IsNumericで変数をチェックする
If IsNumeric(Request.QueryString("DATA")) = True Then '変換可能な時
DATA = CInt(Request.QueryString("DATA"))
Response.Write "CInt()の結果は" & DATA & "です<br>"
DATA = FormatNumber(Request.QueryString("DATA"), 2)
Response.Write "FormatNumber(XX,2)の結果は" & DATA & "です<br>"
Else '変換不可の時
Response.Write "を数値に変換することはできません、確認してね"
End If
D = Request.QueryString("DATA") 'パラメータをそのまま保存
%>
<HR>
<FORM ACTION="test048-3.asp" METHOD="GET">
数値に変換したい文字列
<INPUT TYPE="text" SIZE="30" NAME="DATA" VALUE="<%=D%>">
<INPUT TYPE="submit" VALUE="変換テスト"><br>
↑いろいろと遊んでみてください↑<br>
※123456とInt以上を入れてオーバーフローを発生させたりして遊んでね
</FORM>
<br>
</body>
</html>
テストパターンは適当に、
http://www.ken3.org/cgi-bin/test/test048-3.asp?DATA=1234
http://www.ken3.org/cgi-bin/test/test048-3.asp?DATA=12.5
http://www.ken3.org/cgi-bin/test/test048-3.asp?DATA=12.567
http://www.ken3.org/cgi-bin/test/test048-3.asp?DATA=12g (12グラムのつもり)
http://www.ken3.org/cgi-bin/test/test048-3.asp?DATA=1,234 (カンマを付けて)
チョットビックリは、
http://www.ken3.org/cgi-bin/test/test048-3.asp
のパラメータ無しが0になる(IsNumericを通過する)ことです
http://www.ken3.org/cgi-bin/test/test048-3.asp?DATA=+ (+はスペースの意味)
のスペースは変換できないと判断するのだが、、、
あとはお約束のオーバーフロー、
http://www.ken3.org/cgi-bin/test/test048-3.asp?DATA=123456
をテストすると、
受取ったパラメータは
[123456]
Microsoft VBScript 実行時エラー エラー '800a0006'
オーバーフローしました。: 'CInt'
/cgi-bin/test/test048-3.asp, 行 13
あらら、情けないねぇ(笑)
いろいろと変換や自動的な四捨五入など、変換・チェックを試してみて下さい。
/*
* 5.終わりの挨拶 </HTML>
*/
今回は、
IsXXXXXの関数でチェックするパターンを少し書きました。
ポイントは、
・変換前にチェックを行ってみましょう
・IsNumericは数値のチェックなのでIntのオーバーフローまではチェックできない
ぐらいかなぁ。
まぁ、少し不安だけど、なんとかなるかなぁ。
素朴な疑問あったら、気軽に、
メール、掲示板に書き込んでくださいね。
掲示板 : http://www.ken3.org/asp/bbs-asp.html
ASP、VBScript勉強中の三流プログラマーのKen3でした。
----------------------------------
関連項目(ただのバックナンバー紹介)
----------------------------------
[No.5 IsEmptyでデータチェック ]
http://www.ken3.org/backno/backno_asp02.html#5
で、パラメータの受取りのチェック処理を軽く書いてます。
<送られてきたパラメータをそのまま使う怖さについて>
こんにちは、三流プログラマーのKen3です。
今回は、
パラメータをノーチェックでそのまま使う怖さについて
少し書きたいと思います。
拾い読みして、何かの参考となれば幸いです。
/*
* 1.自分にダメ出し、パラメータチェックの甘さ
*/
そろそろ、機能別にASPのサンプルをまとめないとなぁと思い、
過去のサンプルをチェックしてます。
下記、ASP系で発行したサンプルです。
削除のSQL文を発行するサンプルなのですが、
'IDを条件にSQL DELETE文を作る
strSQL = "DELETE From KANSOU " '感想(KANSOU)テーブルを削除するので
strSQL = strSQL & " Where ID=" & Request.Form("DELETE_ID")
を注目してみて下さい。
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>削除のSQL文 DELETE文を発行する</title>
</head>
<body>
<h2>削除のSQL文 DELETE文を発行する</h2>
test032-2.asp<br>
<hr>
<% '関数をコールする
Call TEST_DELETE_DATA()
%>
<HR>
終了です。<br>
<A href="test032-1.asp">再度削除選択処理へ</a><br>
<A href="test029-1.asp">データ確認と登録</a><br>
</body>
</html>
<% '削除処理
Sub TEST_DELETE_DATA()
'ADO DB Connection オブジェクトを作成する、英文そのままじゃん
Set db=Server.CreateObject("ADODB.Connection")
'.Provider?プロバイダー?通信会社?じゃなくって
'データアクセスにはJet.OLEDB.4.0を使うことを設定
db.Provider = "Microsoft.Jet.OLEDB.4.0"
'次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す
db.ConnectionString = Server.MapPath("db029.mdb")
'やっとデータベースを開ける
db.open
'IDを条件にSQL DELETE文を作る
strSQL = "DELETE From KANSOU " '感想(KANSOU)テーブルを削除するので
strSQL = strSQL & " Where ID=" & Request.Form("DELETE_ID")
'オマケで画面にデータ表示
Response.Write "<hr>発行する(した)SQL文は<br><B><font color='green'>"
Response.Write strSQL & "</font></B><br>です<hr>"
'SQL文の発行
db.Execute(strSQL)
'データベースも閉じようよ
db.Close
'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど)
Set db = Nothing
End Sub |
%>
読者さんの一言:キタナイなぁ(笑)なんてお思いだと思いますが、続けると、
/*
* 2.まずは、そのまま呼ぶとエラーが発生する 危険度小
*/
'IDを条件にSQL DELETE文を作る
strSQL = "DELETE From KANSOU " '感想(KANSOU)テーブルを削除するので
strSQL = strSQL & " Where ID=" & Request.Form("DELETE_ID")
と
フォームからPOSTされたDELETE_IDを使用しているのですが、
パラメータなしで直接呼ばれると、エラーが発生します。
(通常はTest032-1.asp で削除データ選択、032-2で実行の作りになってます)
http://www.ken3.org/cgi-bin/test/test032-2.asp
を直接起動すると、
発行する(した)SQL文は
DELETE From KANSOU Where ID=
です
Microsoft JET Database Engine エラー '80040e14'
クエリ式 'ID=' の 構文エラー : 演算子がありません。
/cgi-bin/test/test032-2.asp, 行 47
と、SQL文の作成が、
strSQL = strSQL & " Where ID=" & Request.Form("DELETE_ID")
なので、
IDの条件が渡っていないので、実行時エラーで止まります。
こんなエラー発生状態を防ぐためにも
[No.48 IsXXXXの処理でいろいろと遊んでみた(笑)]
http://www.ken3.org/backno/backno_asp10.html#48
の
IsEmpty関数などのチェックは必要です。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/*
* 3.もっと怖いのが違うパラメータが送られて来た時
*/
もっと怖いのが、違うパラメータが送られて来た時です。
想像し易いように、問題点は、
'IDを条件にSQL DELETE文を作る
strSQL = "DELETE From KANSOU " '感想(KANSOU)テーブルを削除するので
strSQL = strSQL & " Where ID=" & Request.Form("DELETE_ID")
と
SQL文を作成してます。
ID無しは、
If IsEmpty(Request.Form("DELETE_ID"))
でチェックできるのですが、
IDしか来ないと思って作成している坊ちゃんプログラムに
簡単なHTMLを作成して
"10 Or ID < 20"を渡してみます。
<HTML>
<FORM ACTION="http://www.ken3.org/cgi-bin/test/test032-2.asp" METHOD="POST">
DELETE_ID
<INPUT TYPE="text" SIZE="20" NAME="DELETE_ID" VALUE="10 Or ID < 20"><br>
<INPUT TYPE="submit" VALUE="テスト実行">
</FORM>
</HTML>
http://www.ken3.org/cgi-bin/test/test049-1.html
でテストできます(ローカルHDからでもできます)
テストを実行すると、プログラムは下記のように正常終了
発行する(した)SQL文は
DELETE From KANSOU Where ID=10 Or ID < 20
です
と、SQL文を発行してくれました。
/*
* 4.対策など
*/
削除番号なので、
strSQL = strSQL & " Where ID=" & Request.Form("DELETE_ID")
を
strSQL = strSQL & " Where ID=" & CInt(Request.Form("DELETE_ID"))
と数値に変換してしまう。
えっ、そんなことしても、適当に番号を送られてデータ消されちゃうよ。
DBのオートナンバー型だから、1から連番で消しに来たりしてね。
送信元にも細工をする必要がありそうですね。
test032-1の選択処理から送られてきたか?
Sectionなどのサーバー変数に入れておくなど、
POST/GETでデータを送信する時は、かなりの注意が必要ですね。
調査してからまた追加で対策案を報告します。
/*
* 5.終わりの挨拶 </HTML>
*/
今回は、
送られてきたパラメータをそのまま使う怖さについて
書いてみました。
怖かった?常識なので怖くなかった?アナタの感じかたは?
ポイントは、
・データチェックが入っていないとマズイよ
・フォームからPOST/GETで送られてきた値は注意が必要
ぐらいかなぁ。
まぁ、社内システムはそんなに気にしないでも、なんとかなるかなぁ。
でも、不特定多数がアクセスするシステムではかなりの注意が必要だと思います。
*オイオイ、どっちなんだよ?ヤッパ発行回数稼ぎ?だったの(笑)
素朴な疑問あったら、気軽に、
メール、掲示板に書き込んでくださいね。
掲示板 : http://www.ken3.org/asp/bbs-asp.html
ASP、VBScript勉強中の三流プログラマーのKen3でした。
----------------------------------
関連項目(ただのバックナンバー紹介)
----------------------------------
[No.5 IsEmptyでデータチェック ]
http://www.ken3.org/backno/backno_asp02.html#5
で、パラメータの受取りのチェック処理を軽く書いてます。
[No.48 IsXXXXの処理でいろいろと遊んでみた(笑)]
http://www.ken3.org/backno/backno_asp10.html#48
の
IsEmpty関数などのチェックは必要です。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
三流君のHP主な飛び先
分類別ガイド
[アクセスランキング]
[サイトマップ]
[リンク先・相互リンク先など]
Ken3の日記(weblog) --
[広告・副収入系]
[プログラマー業務の愚痴]
[VBA系の話題]
[ASP系の話題]
[コンビニ系ネタ]
[その他]
種類別のサービス紹介ページ
[イーバンク銀行(eBANK)の口座開設]
[ジャパンネットバンク(JNB)の口座開設]
[ネットで小遣い稼ぎ(笑)]
[在宅プログラマー/SOHO]
[プログラマー転職/派遣/就職]
[バナー広告アフィリエイトで稼ぐ実態]
種類別の商品 通信販売ページ
[自作PCパーツ]
[ゲームソフトの通信販売]
[CD/DVD/ビデオ]
[花・フラワー ]
[ダイエット・健康食品・サプリメントの通信販売]
[美容・化粧品の通信販売]
[ブランド・ジュエリー・香水の通信販売]
[グルメ・おいしい食品の通信販売]
[日本酒・焼酎の通信販売]
[ワインの通信販売]
[チーズの通信販売]
[デザート・お菓子の通信販売]
[ペット関係]
ネットワーク関係
ネットワーク技術が基礎から身につく 日経NETWORK
最適ソリューションを実現するための実務専門誌「日経システム構築」
Web制作・Webクリエイター - All About [Webプロデュース]
サンプル・ライブラリ・素材 - All About [JavaScript]
All About [ビジネスへのネット活用]
All About [ソフトウエアエンジニア]