三流君ASPで遊ぶ、失敗する

[三流君] Top ken3.orgへ
[ASP解説] ASPの解説TOP
[ASP記事 バックナンバー] 番号順のバックナンバー
[SOHO/在宅プログラマー/派遣] 派遣のお話ほか
[...サイトマップ(総合案内へ)]




分類別ガイド
ADOで[ADO Mdb接続] ,[ADO Excel接続] ,[ADO CSV接続]

[ASP Form データのやりとりPOSTとGET]
[ASPでTextFile操作]
[ASPでVBScriptを使う]
[その他サンプル]

バックナンバー No.65 〜 No.69


No.65 2003/06/17
配列の復習、2次元配列、Array関数で配列の初期化
[ページTOPへ戻る]

<配列の復習、2次元配列、Array関数で配列の初期化>

こんにちは、三流プログラマーのKen3です。 今回は、 配列の復習、2次元配列、Array関数で初期化 そんなお話です。

/* * 1.今回のキッカケ */

前回、Sessionを使用した名前の管理、 じゃんけんプログラムを作りました。 今回はそのプログラムを改良して、 配列を使用したプログラムを書いてみたいと思います。 ※変に複雑にやせている女性より、ふっくらした女性がいいと思うけど・・・  えっ、でもCtrl+CとCtrl+Vで着膨れしたセンスないプログラム(女性)はチョット? う〜ん、いい表現が、、あっ、外見同じでも体脂肪の違いって感じで・・

/* * 2.勝手な流れの仕様書 */

「先輩、仕様書ください、口頭じゃなくて紙で。でないと組めませんよ」 ちぇ、しょうがねえなぁ、簡単にテキストファイルで書くか。 仕様.TXT ~~~~~~~~ 言語はASPで動作するVBScriptで。 (※言語も書いとくか) 関数名は Sub HANTEI(strNO) (※関数名なんて好きでいいんだけど) 受け取りは文字列で"1","2","3"を受け取る 1 グー 2 チョキ 3 パー (※受け取りパラメータの説明を書いて) 処理 ^^^^ 入力値の判断、エラーならメッセージを表示させ抜ける エラーメッセージは [XXXX]は不正な入力です (※メッセージなんてそれらしく作ってよ、   えっ、仕様書で指定しないくせに、あとから文句言うなって?) 乱数でコンピュータの手を発生させる グー・チョキ・パーを乱数で。 結果の判断と勝負手の表示 USER_NAME(←グローバル変数に格納されてます)さんの手は、グーです コンピュータの手はパーです 引き分けです アナタの勝ちです 私(コンピュータ)の勝ちです と、結果を画面に出力する リターン値は無しで、関数を終了する 関数仕様書作りのポイント ~~~~~~~~~~~~~~~~~~~~ まず重要なのは、入力(INパラメータ)・処理を詳しく・出力(戻り値) 何を受け取って、XXXXと処理をして、XXXと上位関数に結果を返す。 リターン値無しでも私は気にしないけど、 ~~~~~~~~~~~~~~ 無い場合でも必ず0を返す(0正常)と書かないと気になる君も居ます。 ほかに必要なのは、処理に入れるんだけど、 エラー処理は?どうするか? と 意外と質問が多いのが、メッセージの文章。 メッセージ適当でいいよとお任せで渡すけど、 プログラムよりメッセージ考えてた/メッセージに悩んでいた(笑) なんてプログラマーが居るのも事実。 あとは、簡単な仕様書を元に、説明時に詰めていくんだけど。 ※ここで、問題点を話し合って、仕様変更。 パラメータは0〜2にしてほしいとか、処理方法とか。  でも仕様書はそのまま。  そんなんで、初期の仕様書のまま納品なんてパターン多いかも。  お客はわからないよ・・なんて思わないで更新しようね仕様書の。  でもそんなことしていると、 プログラマーってより、ワープロ屋って感じ(これホント)

/* * 3.この仕様書から作られたプログラム */

こんな仕様書を書くなら、自分で作ったほうがハヤイな・・・ と 思いつつ、仕様書を渡し作業をお願いする。 自分は、上位ルーチンの作成(Sessionで名前管理)や次の関数仕様書を作成する And 3が月前に納品した他のシステムのバグ対応、新規システムの打ち合わせ と平行して業務を実行する。 作成された(できあがった)サブ関数をもらいました。
Sub HANTEI(strNO)  'ユーザーの手を受取り判断する

    Dim nCON  'コンピュータの手1〜3の数値が入る
    Dim nPC   'ユーザーさんの手
    Dim strTE(3) '(*1)配列変数を宣言

    strTE(1) = "グー"   '(*2)配列にメッセージを代入
    strTE(2) = "チョキ"
    strTE(3) = "パー"

    '入力値の判断、エラーならメッセージを表示させ抜ける
    'If文で1,2,3以外を判断する
    If strNO <> "1" And strNO <> "2" And strNO <> "3" Then
        Response.Write "[" & strNO & "]は不正な入力です"
        Exit Sub  '<--Exit Subを使用してここでプログラムを抜ける
    End If

    'コンピュータの手を決定
    Randomize   ' 乱数発生ルーチンを初期化します。
    nCON = Int((3 * Rnd) + 1)  '1 から 3 までの乱数を発生させます。

    '結果判断と表示
    'ユーザーの手を表示する
    nPC = CInt(strNO) 'CInt関数で数値型に変換する
    Response.Write USER_NAME & "さんの手は、"
    Response.Write strTE(nPC) & "です<br>" '(*3)ここでnPC番目を表示

    '(*4)同様にコンピュータの手を表示する
    Response.Write "コンピュータの手は" & strTE(nCON) & "です<br>"

    '結果の判断
    'まず、引き分けを判断
    If nPC = nCON Then Response.Write "引き分けです<br>"

    '次に自分が勝ちの手を判断 グーvsチョキ,チョキvsパー,パーvsグー
    If nPC = 1 And nCON = 2 Then Response.Write "アナタの勝ちです<br>"
    If nPC = 2 And nCON = 3 Then Response.Write "アナタの勝ちです<br>"
    If nPC = 3 And nCON = 1 Then Response.Write "アナタの勝ちです<br>"

    'コンピュータが勝ちか判断 グーvsパー,チョキvsグー,バーvsチョキ
    If nPC = 1 And nCON = 3 Then Response.Write "私(コンピュータ)の勝ちです<br>"
    If nPC = 2 And nCON = 1 Then Response.Write "私(コンピュータ)の勝ちです<br>"
    If nPC = 3 And nCON = 2 Then Response.Write "私(コンピュータ)の勝ちです<br>"

End Sub
自分の作成した上位関数に組み込みテスト。 http://www.ken3.org/cgi-bin/test/test064-1.asp でテスト実行できます、遊んでみてください

/* * 4.同じ固定文字列を嫌う病的プログラマーを目指して */

まず、よほどのことが無い限り、 依頼したプログラムにケチや評価しないんだけど(そのまま使うんだけど) 風通しの良い会社なら、後輩が作成したプログラムに対して、 ここを直すと、修正入った時楽だよとか、 作ってもらったお礼と一緒に指導したりするのかなぁ。 ※そして個人能力と一緒に会社の能力も上がっていく・・・ なんて話は、置いといて、 同じ仕様書でも違う中身のプログラムが作成される。 面白いよね And 同じ動作なんだけどプログラマーのレベルって出てくるよ。 ※仕様書の内容が粗いほど、イロイロ出てくるって話もあるけど。  処理フローまで書いては渡さないし、入出力設計のみで、  あとは、人任せ(担当プログラマー任せ)かなぁ。 動作は同じ、中身が違うプログラム、そんな話に強引にもって行きます。 同じ固定文字列を嫌う先輩 ~~~~~~~~~~~~~~~~~~~~~~~~ 世の中には少しのムダも許せない、そんな人も居る が 無駄遣いが好きな人も居る。 プログラム中のムダっていろいろとあるんだけど、 同じ固定のメッセージなどの文字列を嫌う人は多いです。 '次に自分が勝ちの手を判断 グーvsチョキ,チョキvsパー,パーvsグー If nPC = 1 And nCON = 2 Then Response.Write "アナタの勝ちです<br>" If nPC = 2 And nCON = 3 Then Response.Write "アナタの勝ちです<br>" If nPC = 3 And nCON = 1 Then Response.Write "アナタの勝ちです<br>" ここ、あきらかにコピープログラムだよね。 上のIf文をコピーして、数値だけ修正してる。 このResponse.Write "アナタの勝ちです<br>"がムダに見えるらしい。 strMSGPC = "アナタの勝ちです<br>" 'ユーザー勝利 strMSGCON = "私(コンピュータ)の勝ちです<br>" 'コンピュータ勝利 '次に自分が勝ちの手を判断 グーvsチョキ,チョキvsパー,パーvsグー If nPC = 1 And nCON = 2 Then Response.Write strMSGPC If nPC = 2 And nCON = 3 Then Response.Write strMSGPC If nPC = 3 And nCON = 1 Then Response.Write strMSGPC 'コンピュータが勝ちか判断 グーvsパー,チョキvsグー,バーvsチョキ If nPC = 1 And nCON = 3 Then Response.Write strMSGCON If nPC = 2 And nCON = 1 Then Response.Write strMSGCON If nPC = 3 And nCON = 2 Then Response.Write strMSGCON って、すればいいんだろ。 なるほどねぇ、メッセージを変えてくれと言われても、 1箇所で済むんだぁ、へぇ〜すごいすごい(笑)(バカにしたような笑い) なんか文句あるんですか?ボクのプログラムに対して? 別に動いているから文句無いんだけど、 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^(どんな書き方でも動くプログラムじゃないと) 配列の使い方、知ってるようで知らないよね。 どこが?ですか? まず、上のほうでは、 Dim strTE(3) '(*1)配列変数を宣言 strTE(1) = "グー" '(*2)配列にメッセージを代入 strTE(2) = "チョキ" strTE(3) = "パー" と、配列に手の文字列を入れて置き(下準備) 'ユーザーの手を表示する nPC = CInt(strNO) 'CInt関数で数値型に変換する Response.Write USER_NAME & "さんの手は、" Response.Write strTE(nPC) & "です<br>" '(*3)ここでnPC番目を表示 '(*4)同様にコンピュータの手を表示する Response.Write "コンピュータの手は" & strTE(nCON) & "です<br>" と、 strTE(nPC), strTE(nCON) 配列の中身を参照して表示してるよね。 下記のコピー君から卒業してて、 If nPC = "1" Then Response.Write "グーです<br>" If nPC = "2" Then Response.Write "チョキです<br>" If nPC = "3" Then Response.Write "パーです<br>" と比べると、配列を使用してメッセージの管理はOKかなぁ。 それと一緒で、 strMSGPC = "アナタの勝ちです<br>" 'ユーザー勝利 strMSGCON = "私(コンピュータ)の勝ちです<br>" 'コンピュータ勝利 の 結果のメッセージも配列で管理してみては? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Dim nMSGNO 'メッセージの番号 Dim strMSG(3) 'メッセージ表示用の配列 strMSG(1) = "アナタの勝ちです<br>" 'メッセージの代入 strMSG(2) = "引き分けです<br>" strMSG(3) = "私(コンピュータ)の勝ちです<br>" '結果の判断 'まず、引き分けを判断 If nPC = nCON Then nMSGNO = 2 '引き分け '次に自分が勝ちの手を判断 グーvsチョキ,チョキvsパー,パーvsグー If nPC = 1 And nCON = 2 Then nMSGNO = 1 'ユーザーの勝ちをセット If nPC = 2 And nCON = 3 Then nMSGNO = 1 If nPC = 3 And nCON = 1 Then nMSGNO = 1 'コンピュータが勝ちか判断 グーvsパー,チョキvsグー,バーvsチョキ If nPC = 1 And nCON = 3 Then nMSGNO = 3 'コンピュータの勝ちをセット If nPC = 2 And nCON = 1 Then nMSGNO = 3 If nPC = 3 And nCON = 2 Then nMSGNO = 3 '結果のメッセージを表示する(メッセージ番号を使用して) Response.Write strMSG(nMSGNO) と、表示メッセージを配列で用意して、 結果の判断では、nMSGNO = X と メッセージの場号を代入。 最後にメッセージを表示する。 そんな感じに変更すると、 strMSGPC = "アナタの勝ちです<br>" 'ユーザー勝利 '次に自分が勝ちの手を判断 グーvsチョキ,チョキvsパー,パーvsグー If nPC = 1 And nCON = 2 Then Response.Write strMSGPC If nPC = 2 And nCON = 3 Then Response.Write strMSGPC If nPC = 3 And nCON = 1 Then Response.Write strMSGPC 処理は似ているけど、メッセージ内容の変更があっても対応可能で、 Response.Write strMSGPC を3回も書かなくていいしね。 http://www.ken3.org/cgi-bin/test/test065-1.asp でテスト実行できます、遊んでみてください ※動作は同じなんだけど

/* * 5.2次元配列で結果を管理する */

まぁ、配列を使用して、 If nPC = "1" Then Response.Write "グーです<br>" If nPC = "2" Then Response.Write "チョキです<br>" If nPC = "3" Then Response.Write "パーです<br>" から Dim strTE(3) '(*1)配列変数を宣言 strTE(1) = "グー" '(*2)配列にメッセージを代入 strTE(2) = "チョキ" strTE(3) = "パー" 'ユーザーの手を表示する Response.Write strTE(nPC) & "です<br>" '(*3)ここでnPC番目を表示 と、しました。 これをさらに応用して、 じゃんけんの勝敗を ~~~~~~~~~~~~~~~~~~ '結果の判断 'まず、引き分けを判断 If nPC = nCON Then nMSGNO = 2 '引き分け '次に自分が勝ちの手を判断 グーvsチョキ,チョキvsパー,パーvsグー If nPC = 1 And nCON = 2 Then nMSGNO = 1 'ユーザーの勝ちをセット If nPC = 2 And nCON = 3 Then nMSGNO = 1 If nPC = 3 And nCON = 1 Then nMSGNO = 1 'コンピュータが勝ちか判断 グーvsパー,チョキvsグー,バーvsチョキ If nPC = 1 And nCON = 3 Then nMSGNO = 3 'コンピュータの勝ちをセット If nPC = 2 And nCON = 1 Then nMSGNO = 3 If nPC = 3 And nCON = 2 Then nMSGNO = 3 '結果のメッセージを表示する(メッセージ番号を使用して) Response.Write strMSG(nMSGNO) と判断しているんだけど、 条件を表にすると、 ~~~~~~~~~~~~~~~~~~    グー(1) チョキ(2) パー(3) ←コンピュータの手 グー(1) 引き分け 勝ち    負け チョキ(2) 負け   引き分け  勝ち パー(3)  勝ち 負け 引き分け ↑自分の手 ですね。 まぁ、そんなこと言われなくても(表に書かなくても)わかるか。 この表を見て判断じゃないけど、 If nPC = 1 And nCON = 3 Then nMSGNO = 3 'コンピュータの勝ちをセット と、nPC=1グーとnCON=3パーをみて(1,3)負け(コンピュータの勝ち)を判断してます。 メッセージ番号で結果を判断してます。 strMSG(1) = "アナタの勝ちです<br>" 'メッセージの代入 strMSG(2) = "引き分けです<br>" strMSG(3) = "私(コンピュータ)の勝ちです<br>" この、1,2,3を表にすると ~~~~~~~~~~~~~~~~~~~~~~~    グー(1) チョキ(2) パー(3) ←コンピュータの手 グー(1) 2引き分け 1勝ち    3負け チョキ(2) 3負け   2引き分け  1勝ち パー(3)  1勝ち 3負け 2引き分け ↑自分の手 ですね。 これをそのまま、2次元配列にして、管理してみます。 '結果の判断 '   グー(1) チョキ(2) パー(3) ←コンピュータの手 'グー(1) 2引き分け 1勝ち    3負け 'チョキ(2) 3負け   2引き分け  1勝ち 'パー(3)  1勝ち 3負け 2引き分け '↑自分の手 '勝負の結果表を作る Dim strCHK(3, 3) '3x3の結果の表 strCHK(1, 1) = 2 : strCHK(1, 2) = 1 : strCHK(1, 3) = 3 strCHK(2, 1) = 3 : strCHK(2, 2) = 2 : strCHK(2, 3) = 1 strCHK(3, 1) = 1 : strCHK(3, 2) = 3 : strCHK(3, 3) = 2 '結果を代入 nMSGNO = strCHK(nPC, nCON) '結果表の値を代入 '結果のメッセージを表示する(メッセージ番号を使用して) Response.Write strMSG(nMSGNO) なんて、2次元配列を使用した書き方ができます。 だいぶ、変わりましたね。 同じ動作なんだけどねぇ・・・
Sub HANTEI(strNO)  'ユーザーの手を受取り判断する

    Dim nCON  'コンピュータの手1〜3の数値が入る
    Dim nPC   'ユーザーさんの手

    Dim strTE(3) '(*1)配列変数を宣言
    strTE(1) = "グー"   '(*2)配列にメッセージを代入
    strTE(2) = "チョキ"
    strTE(3) = "パー"

    Dim nMSGNO     'メッセージの番号
    Dim strMSG(3)  'メッセージ表示用の配列
    strMSG(1) = "アナタの勝ちです<br>"  'メッセージの代入
    strMSG(2) = "引き分けです<br>"
    strMSG(3) = "私(コンピュータ)の勝ちです<br>"

    '入力値の判断、エラーならメッセージを表示させ抜ける
    'If文で1,2,3以外を判断する
    If strNO <> "1" And strNO <> "2" And strNO <> "3" Then
        Response.Write "[" & strNO & "]は不正な入力です"
        Exit Sub  '<--Exit Subを使用してここでプログラムを抜ける
    End If

    'コンピュータの手を決定
    Randomize   ' 乱数発生ルーチンを初期化します。
    nCON = Int((3 * Rnd) + 1)  '1 から 3 までの乱数を発生させます。

    '結果判断と表示
    'ユーザーの手を表示する
    nPC = CInt(strNO) 'CInt関数で数値型に変換する
    Response.Write USER_NAME & "さんの手は、"
    Response.Write strTE(nPC) & "です<br>" '(*3)ここでnPC番目を表示

    '(*4)同様にコンピュータの手を表示する
    Response.Write "コンピュータの手は" & strTE(nCON) & "です<br>"

    '結果の判断
    '         グー(1)  チョキ(2)  パー(3)  ←コンピュータの手
    'グー(1)    2引き分け 1勝ち    3負け
    'チョキ(2) 3負け   2引き分け  1勝ち
    'パー(3)  1勝ち     3負け       2引き分け
    '↑自分の手

    '勝負の結果表を作る
    Dim strCHK(3, 3)  '3x3の結果の表
    strCHK(1, 1) = 2 : strCHK(1, 2) = 1 : strCHK(1, 3) = 3
    strCHK(2, 1) = 3 : strCHK(2, 2) = 2 : strCHK(2, 3) = 1
    strCHK(3, 1) = 1 : strCHK(3, 2) = 3 : strCHK(3, 3) = 2

    '結果を代入
    nMSGNO = strCHK(nPC, nCON)  '結果表の値を代入

    '結果のメッセージを表示する(メッセージ番号を使用して)
    Response.Write strMSG(nMSGNO)

End Sub
http://www.ken3.org/cgi-bin/test/test065-2.asp でテスト実行できます、遊んでみてください ※動作は同じなんだけど

/* * 6.配列の初期化でArray関数を使用する */

Array関数を使用して配列の初期化 http://www.ken3.org/cgi-bin/test/test014-2.asp で、 *2Array関数を使用して、評価コメントを初期化 strBOX = Array("かなり不満", "不満", "少し不満", "どちらとも言えない", _ "まぁまぁ", "満足", "大変満足") と、配列初期化の解説をしてました。 下記の代入文 Dim strTE(3) '(*1)配列変数を宣言 strTE(1) = "グー" '(*2)配列にメッセージを代入 strTE(2) = "チョキ" strTE(3) = "パー" これを strTE = Array("", "グー", "チョキ", "パー") と、Array関数を使用してみた。 同様に 'メッセージ表示用の配列 strMSG = Array("", "アナタの勝ちです<br>", "引き分けです<br>", _ "私(コンピュータ)の勝ちです<br>" としてみました。 あれ? なんですか? strTE = Array("", "グー" と、””が頭に入っているのは? あっ、これですか、作成される配列の番号が0からなので、 ダミーデータ””でかわしてました。 さてと、 次は2次元配列の初期化ですね。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ '勝負の結果表を作る Dim strCHK(3, 3) '3x3の結果の表 strCHK(1, 1) = 2 : strCHK(1, 2) = 1 : strCHK(1, 3) = 3 strCHK(2, 1) = 3 : strCHK(2, 2) = 2 : strCHK(2, 3) = 1 strCHK(3, 1) = 1 : strCHK(3, 2) = 3 : strCHK(3, 3) = 2 これを初期化するには、う〜ん。。。 '勝負の結果表を作る strCHK = Array( "", Array( 0, 2, 1, 3 ), _ Array( 0, 3, 2, 1 ), _ Array( 0, 1, 3, 2 ) ) と、強引にArrayを多重化してみました。 でも、 Microsoft VBScript 実行時エラー エラー '800a0009' インデックスが有効範囲にありません。: 'strCHK' /cgi-bin/test/test065-3.asp, 行 110 と '結果を代入 nMSGNO = strCHK(nPC, nCON) '結果表の値を代入 の部分で怒られました。 一工夫して ~~~~~~~~~~ nMSGNO = strCHK(nPC)(nCON) '結果表の値を代入 とstrCHK(nPC)(nCON)なんてすると、見事に参照できます。 ※私もハマりました(笑) で、完成したのが、 <% '乱数を発生させて勝負する
Sub HANTEI(strNO)  'ユーザーの手を受取り判断する

    Dim nCON  'コンピュータの手1〜3の数値が入る
    Dim nPC   'ユーザーさんの手

    '配列にメッセージを代入
    strTE = Array("", "グー", "チョキ", "パー")

    Dim nMSGNO     'メッセージの番号
    'メッセージ表示用の配列
    strMSG = Array("", "アナタの勝ちです<br>", "引き分けです<br>", _
                   "私(コンピュータ)の勝ちです<br>" )

    '入力値の判断、エラーならメッセージを表示させ抜ける
    'If文で1,2,3以外を判断する
    If strNO <> "1" And strNO <> "2" And strNO <> "3" Then
        Response.Write "[" & strNO & "]は不正な入力です"
        Exit Sub  '<--Exit Subを使用してここでプログラムを抜ける
    End If

    'コンピュータの手を決定
    Randomize   ' 乱数発生ルーチンを初期化します。
    nCON = Int((3 * Rnd) + 1)  '1 から 3 までの乱数を発生させます。

    '結果判断と表示
    'ユーザーの手を表示する
    nPC = CInt(strNO) 'CInt関数で数値型に変換する
    Response.Write USER_NAME & "さんの手は、"
    Response.Write strTE(nPC) & "です<br>" '(*3)ここでnPC番目を表示

    '(*4)同様にコンピュータの手を表示する
    Response.Write "コンピュータの手は" & strTE(nCON) & "です<br>"

    '結果の判断
    '         グー(1)  チョキ(2)  パー(3)  ←コンピュータの手
    'グー(1)    2引き分け 1勝ち    3負け
    'チョキ(2) 3負け   2引き分け  1勝ち
    'パー(3)  1勝ち     3負け       2引き分け
    '↑自分の手

    '勝負の結果表を作る
    strCHK = Array( "", Array( 0, 2, 1, 3 ), _
                        Array( 0, 3, 2, 1 ), _
                        Array( 0, 1, 3, 2 ) )

    '結果を代入
    nMSGNO = strCHK(nPC)(nCON)  '結果表の値を代入

    '結果のメッセージを表示する(メッセージ番号を使用して)
    Response.Write strMSG(nMSGNO)

End Sub
%>
です。 テストは、 http://www.ken3.org/cgi-bin/test/test065-3.asp でテスト実行できます、遊んでみてください ※動作は同じなんだけど

/* * 7.終わりの挨拶 </HTML> */

今回は、 配列を使ったプログラム方法 と Array関数で配列の作成、2次元配列の初期化 ※2次元配列の初期化でハマりかけたけど。 何かの参考となれば幸いです。 素朴な疑問やリクエスト、クレームなどがあったら、 掲示板 : http://www.ken3.org/cgi-bin/bbs/asp/wforum.cgi に気軽に書き込んでください。 ASP、VBScript勉強中の三流プログラマーのKen3でした。

No.66 2003/06/23
クッキーを使ってみた Request.Cookies
[ページTOPへ戻る]

<クッキーを使ってみた Request.Cookies>

こんにちは、三流プログラマーのKen3です。 今回は、 クッキーを使ってみた そんなお話です。

/* * 1.今回のキッカケ */

前回、Session("変数名")で、ユーザー単位でセッション変数を設定可能です。 とやりました。 でも、セッションって、一度接続を切るとクリアされてしまいます。 改ざんされたりするんだけど、 簡単な記録、記憶にはクッキーを使う方法があります。 なんだかよくわからん? えっと、 USER_NAME = Request.Cookies("USERNAME") で、情報の取り出し、 データのセット、 Response.Cookies("USERNAME") = "AAAAAA" '名前の代入 '期限のセット、 Response.Cookies("USERNAME").Expires = DateAdd("d", 7, Date) と簡単です。 あっそ? 冷たいなぁ、、、それを利用して、 今回は、ユーザーの名前をクッキーで覚えてみます。

/* * 2.Request.Cookiesを使用したサンプル */

またまた、いつもの実行結果から入る解説です。 http://www.ken3.org/cgi-bin/test/test066-1.asp でテスト可能です。 <%@LANGUAGE=VBScript%> <% 'ユーザー名が送られていたら、クッキーにセットする D = Request.QueryString("UNAME") 'データを代入 If Len(D) <> 0 Then 'データあり Response.Cookies("USERNAME") = D '名前の代入 '期限のセット Response.Cookies("USERNAME").Expires = DateAdd("d", 7, Date) End If %> <html> <head> <title>Request.Cookies("USERNAME")とクッキーを使ってみた</title> </head> <body> <h2>Request.Cookies("USERNAME")とクッキーを使ってみた</h2> クッキーのセットと参照で<br> <b>Request.Cookies("USERNAME")</b><br> 有効期限のテストで<br> <b>Response.Cookies("USERNAME").Expires = DateAdd("d", 7, Date)</b><br> を使用してみました。<br> 期限の設定を忘れなければ、比較的簡単に使えると思います<br> <h3>じゃんけんゲーム(Cookies クッキーで名前の管理)</h3> <% 'パラメータをチェックする、クッキーに名前が入っているか? USER_NAME = Request.Cookies("USERNAME") 'クッキーから変数へ代入 'Lenで変数の長さをチェックする If Len(Trim(USER_NAME)) = 0 Then '名前が未入力なら Call INPUT_NAME() '名前入力フォームの表示 Else D = Request.QueryString("DATA") 'データを代入(選択された手) If Len(D) = 1 Then 'データあり Call HANTEI(D) '判断用の関数を呼ぶ End If Call INPUT_FORM() '入力用のフォームを表示する、再度入力させる End If %> <hr> セッション変数と違って、一回クッキーとして登録すると、<br> 再度このHPへきた時に、<br> USER_NAME = Request.Cookies("USERNAME") 'クッキーから変数へ代入<br> と、USERNAMEを取り出すことが出来る。<br> パソコンのHD内のクッキーを参照するので、使い方によっては便利です<br> </body> </html> <% '名前入力フォームの表示
Sub INPUT_NAME()
  Response.Write "<HR>"
  Response.Write "<FORM ACTION='test066-1.asp' METHOD='GET'>"
  Response.Write "あなたのお名前は?<br>"
  Response.Write "<INPUT TYPE='text' NAME='UNAME'><br>"
  Response.Write "<INPUT TYPE='submit' VALUE='名前の登録'><br>"
  Response.Write "</FORM>"
End Sub
%>
<% '入力フォームの表示(勝負する手を入力)
Sub INPUT_FORM()
  Response.Write "<HR>"
  Response.Write "<FORM ACTION='test066-1.asp' METHOD='GET'>"
  Response.Write "<b>" & USER_NAME & "</b>さん、あなたの手は?<br>"
  Response.Write "<INPUT TYPE='RADIO' NAME='DATA' VALUE='1'>1.グー<br>"
  Response.Write "<INPUT TYPE='RADIO' NAME='DATA' VALUE='2'>2.チョキ<br>"
  Response.Write "<INPUT TYPE='RADIO' NAME='DATA' VALUE='3'>3.パー<br>"
  Response.Write "<INPUT TYPE='submit' VALUE='勝負する'><br>"
  Response.Write "</FORM>"
End Sub
%>
<% '乱数を発生させて勝負する
Sub HANTEI(strNO)  'ユーザーの手を受取り判断する

    Dim nCON  'コンピュータの手1〜3の数値が入る
    Dim nPC   'ユーザーさんの手

    '配列にメッセージを代入
    strTE = Array("", "グー", "チョキ", "パー")

    Dim nMSGNO     'メッセージの番号
    'メッセージ表示用の配列
    strMSG = Array("", "アナタの勝ちです<br>", "引き分けです<br>", _
                   "私(コンピュータ)の勝ちです<br>" )

    '入力値の判断、エラーならメッセージを表示させ抜ける
    'If文で1,2,3以外を判断する
    If strNO <> "1" And strNO <> "2" And strNO <> "3" Then
        Response.Write "[" & strNO & "]は不正な入力です"
        Exit Sub  '<--Exit Subを使用してここでプログラムを抜ける
    End If

    'コンピュータの手を決定
    Randomize   ' 乱数発生ルーチンを初期化します。
    nCON = Int((3 * Rnd) + 1)  '1 から 3 までの乱数を発生させます。

    '結果判断と表示
    'ユーザーの手を表示する
    nPC = CInt(strNO) 'CInt関数で数値型に変換する
    Response.Write USER_NAME & "さんの手は、"
    Response.Write strTE(nPC) & "です<br>" '(*3)ここでnPC番目を表示

    '(*4)同様にコンピュータの手を表示する
    Response.Write "コンピュータの手は" & strTE(nCON) & "です<br>"

    '結果の判断
    '         グー(1)  チョキ(2)  パー(3)  ←コンピュータの手
    'グー(1)    2引き分け 1勝ち    3負け
    'チョキ(2) 3負け   2引き分け  1勝ち
    'パー(3)  1勝ち     3負け       2引き分け
    '↑自分の手

    '勝負の結果表を作る
    strCHK = Array( "", Array( 0, 2, 1, 3 ), _
                        Array( 0, 3, 2, 1 ), _
                        Array( 0, 1, 3, 2 ) )

    '結果を代入
    nMSGNO = strCHK(nPC)(nCON)  '結果表の値を代入

    '結果のメッセージを表示する(メッセージ番号を使用して)
    Response.Write strMSG(nMSGNO)

End Sub
%>
ポイントは、 ~~~~~~~~~~~~ 後半のじゃんけん判断は、置いといて、 Response.Cookies("USERNAME") = D '名前の代入 Response.Cookies("USERNAME").Expires = DateAdd("d", 7, Date) で、簡単にクッキーを書き込むことが出来ます。 .Expires = DateAdd("d", 7, Date) で、このクッキーの有効期限を設定してます。 ※これを忘れると、ブラウザを閉じたときに消えてしまいます。 あとは、簡単で、 Request.Cookies("USERNAME") で、値を取り出せます。 よくある使い方は、ID,パスワードを保存しておいて、 ログインをやりやすくする方法があります。 *たまに、クッキーで保存とか目にすると思います。 蛇足ですが、クッキーの中身を見てみました。 これって、テキストファイルなので、いくらでも改ざんできそうです。 ※データを変更してから、アクセスしたり。 USERNAME %82%AF%82%F1%82%BC%82%A4 www.ken3.org/ 1536 4216707072 29565243 2617689824 29564031 *

/* * 3.クッキー有効期限.Expiresを120秒(2分)にDateAdd("s", 120, Now) */

クッキー、7日後とか、テストの仕方が悪かったですね。 有効期限を設定したら、有効期限切れをチェックしたいのが人情でしょう。 あっ、人情じゃなくって、プログラマー心理かなぁ。 下記、単純に期限を Response.Cookies("USERNAME2").Expires = DateAdd("s", 120, Now) と、120秒後の(2分)としてみました。 名前を入力してから(一度クッキーに保存してから)、 しばらく放置して、アクセスしてください。 有効期限切れで、値を取得できないので、 名前の再入力処理を行います。 http://www.ken3.org/cgi-bin/test/test066-2.asp でテスト可能です。 <%@LANGUAGE=VBScript%> <% 'ユーザー名が送られていたら、クッキーにセットする D = Request.QueryString("UNAME") 'データを代入 If Len(D) <> 0 Then 'データあり Response.Cookies("USERNAME2") = D '名前の代入 '期限のセット 期限切れのテストを兼ねて、120秒(2分)としてみた。 Response.Cookies("USERNAME2").Expires = DateAdd("s", 120, Now) End If %> <html> <head> <title>クッキー有効期限.Expiresを120秒(2分)にDateAdd("s", 120, Now)</title> </head> <body> <h2>Response.Cookies("USERNAME2").Expires=DateAdd("s", 120, Now)でテスト</h2> 有効期限のテストで<br> <b>Response.Cookies("USERNAME2").Expires = DateAdd("d", 120, Now)</b><br> を使用してみました。<br> ポイントは、<br> .Expires = DateAdd("d", 120, Now)で、120秒後をセットしました。<br> <h3>じゃんけんゲーム(Cookies.Expiresを120秒(2分)2分以内に回答を(笑))</h3> <% 'パラメータをチェックする、クッキーに名前が入っているか? USER_NAME = Request.Cookies("USERNAME2") 'クッキーから変数へ代入 'Lenで変数の長さをチェックする If Len(Trim(USER_NAME)) = 0 Then '名前が未入力なら Call INPUT_NAME() '名前入力フォームの表示 Else D = Request.QueryString("DATA") 'データを代入(選択された手) If Len(D) = 1 Then 'データあり Call HANTEI(D) '判断用の関数を呼ぶ End If Call INPUT_FORM() '入力用のフォームを表示する、再度入力させる End If %> <hr> .Expires = DateAdd("d", 120, Now)で<b>有効期限</b>を2分にしました<br> チョット待ってから、アクセスしてみてください<br> USERNAME2のクッキーが切れることを確認します。<br> 応用で、ログイン後XX分以内の回答処理にも使えるかも<br> <br> </body> </html> <% '名前入力フォームの表示
Sub INPUT_NAME()
  Response.Write "<HR>"
  Response.Write "<FORM ACTION='test066-2.asp' METHOD='GET'>"
  Response.Write "あなたのお名前は?<br>"
  Response.Write "<INPUT TYPE='text' NAME='UNAME'><br>"
  Response.Write "<INPUT TYPE='submit' VALUE='名前の登録'><br>"
  Response.Write "</FORM>"
End Sub
%>
<% '入力フォームの表示(勝負する手を入力)
Sub INPUT_FORM()
  Response.Write "<HR>"
  Response.Write "<FORM ACTION='test066-2.asp' METHOD='GET'>"
  Response.Write "<b>" & USER_NAME & "</b>さん、あなたの手は?<br>"
  Response.Write "<INPUT TYPE='RADIO' NAME='DATA' VALUE='1'>1.グー<br>"
  Response.Write "<INPUT TYPE='RADIO' NAME='DATA' VALUE='2'>2.チョキ<br>"
  Response.Write "<INPUT TYPE='RADIO' NAME='DATA' VALUE='3'>3.パー<br>"
  Response.Write "<INPUT TYPE='submit' VALUE='勝負する'><br>"
  Response.Write "</FORM>"
End Sub
%>
<% '乱数を発生させて勝負する
Sub HANTEI(strNO)  'ユーザーの手を受取り判断する

    Dim nCON  'コンピュータの手1〜3の数値が入る
    Dim nPC   'ユーザーさんの手

    '配列にメッセージを代入
    strTE = Array("", "グー", "チョキ", "パー")

    Dim nMSGNO     'メッセージの番号
    'メッセージ表示用の配列
    strMSG = Array("", "アナタの勝ちです<br>", "引き分けです<br>", _
                   "私(コンピュータ)の勝ちです<br>" )

    '入力値の判断、エラーならメッセージを表示させ抜ける
    'If文で1,2,3以外を判断する
    If strNO <> "1" And strNO <> "2" And strNO <> "3" Then
        Response.Write "[" & strNO & "]は不正な入力です"
        Exit Sub  '<--Exit Subを使用してここでプログラムを抜ける
    End If

    'コンピュータの手を決定
    Randomize   ' 乱数発生ルーチンを初期化します。
    nCON = Int((3 * Rnd) + 1)  '1 から 3 までの乱数を発生させます。

    '結果判断と表示
    'ユーザーの手を表示する
    nPC = CInt(strNO) 'CInt関数で数値型に変換する
    Response.Write USER_NAME & "さんの手は、"
    Response.Write strTE(nPC) & "です<br>" '(*3)ここでnPC番目を表示

    '(*4)同様にコンピュータの手を表示する
    Response.Write "コンピュータの手は" & strTE(nCON) & "です<br>"

    '結果の判断
    '         グー(1)  チョキ(2)  パー(3)  ←コンピュータの手
    'グー(1)    2引き分け 1勝ち    3負け
    'チョキ(2) 3負け   2引き分け  1勝ち
    'パー(3)  1勝ち     3負け       2引き分け
    '↑自分の手

    '勝負の結果表を作る
    strCHK = Array( "", Array( 0, 2, 1, 3 ), _
                        Array( 0, 3, 2, 1 ), _
                        Array( 0, 1, 3, 2 ) )

    '結果を代入
    nMSGNO = strCHK(nPC)(nCON)  '結果表の値を代入

    '結果のメッセージを表示する(メッセージ番号を使用して)
    Response.Write strMSG(nMSGNO)

End Sub
%>
-【けんぞう!】--------------------------------------------------------- 三流君の、小金稼ぎ、お小遣い稼ぎシリーズ第3弾(稼げないだろコラ!!) 参加無料:予想が当たれば一攫千金?今月はプロ野球のセパ勝敗とホームラン数 http://www.ken3.org/etc/500yen/5050.html ← 100万を当たった人数で山分け 『チッ、大穴横浜の勝利に賭けてるのに当たらない(笑)』(横浜ファン:31歳) ------------------------------------------------------------------------

/* * 4.終わりの挨拶 </HTML> */

今回は、 クッキーを使用して、ユーザー名の保存 そんなサンプルプログラムでした。 何かの参考となれば幸いです。 素朴な疑問やリクエスト、クレームなどがあったら、 掲示板 : http://www.ken3.org/cgi-bin/bbs/asp/wforum.cgi に気軽に書き込んでください。 ASP、VBScript勉強中の三流プログラマーのKen3でした。

No.67 2003/06/30
FileSystemObjectの.GetFolderを使用
[ページTOPへ戻る]

<FileSystemObjectの.GetFolderを使用>
(ディレクトリ内のファイル一覧を表示する)

こんにちは、三流プログラマーのKen3です。 今回は、 ファイル一覧を表示してみたいと思います。

/* * 1.今回のキッカケ */

いつものように、検索で、 ASP ファイル一覧 で検索すると、 VBA系のDir関数がひっかかります(笑) 今回は、苦情メールもらっていないけど、 ASPでサーバー上のファイル一覧を取ってみたいと思います。

/* * 2.FileSystemObjectの.GetFolderを使用 */

いつもの、いきなりサンプルを掲載する http://www.ken3.org/cgi-bin/test/test067-1.asp でテスト可能です。 <%@LANGUAGE=VBScript%> <html> <head> <title>ディレクトリ内のファイル一覧表示 FileSystemObjectの.GetFolder</title> </head> <body> <!-- Ken3 --><!-- #include file="info.inc" --> <h2>ディレクトリ内のファイル一覧を表示する<br>FileSystemObjectの.GetFolder</h2> FileSystemObjectの.GetFolderを使用して、ファイルの一覧を取得してみます<br> まずは、今のフォルダーが知りたいので(自分のHD上の位置)<br> Server.MapPath(".")とドットを指定すると<br> [<%=Server.MapPath(".")%>]とフォルダー名が取得できます<br> <br> 次は、.GetFolderを使用して、フォルダーオブジェクトを取得します<br> For Each OBJ In .Files でファイルのコレクションにアクセスします。<br> ※下記の実行結果とソースを見てください。<br> <hr> <% '*1 FileSystemObjectを生成します、、って英文、そのままジャン。 Set objFS = Server.CreateObject("Scripting.FileSystemObject") '*2 フォルダーの名称を取り出す strFDIRNAME = Server.MapPath(".") 'フォルダー名取得 Response.Write strFDIRNAME & "のファイル一覧です<br>" & vbCRLF '*3 .GetFolderで、フォルダーオブジェクトを取得します Set objDIR = objFS.GetFolder(strFDIRNAME) '*4 .Filesコレクションにアクセスする For Each objFILE In objDIR.Files strFNAME = objFILE.Name '取り出したobjFILEの.Nameを取得 If Right(strFNAME, 4) = ".asp" Then '.ASPならリンクを作る Response.Write "<a href='" & strFNAME & "'>" Response.Write strFNAME & "</a>" & vbTab Else Response.Write strFNAME & vbTab End If 'おまけで更新日の表示 Response.Write objFILE.DateLastModified & "<br>" & vbCRLF Next %> <hr> </body> </html>

/* * 3.簡単な解説 */

'*1 FileSystemObjectを生成します、、って英文、そのままジャン。 Set objFS = Server.CreateObject("Scripting.FileSystemObject") まずは、File処理基本の窓口、FileSystemObjectを作成します。 窓口って表現が適切かわからないけど、入り口のオブジェクトです。 次は、フォルダーの名前がほしかったので、 '*2 フォルダーの名称を取り出す strFDIRNAME = Server.MapPath(".") 'フォルダー名取得 Response.Write strFDIRNAME & "のファイル一覧です<br>" & vbCRLF と Server.MapPath(".") で、現在位置を取り出します。 取り出したフォルダー名を.GetFolderへ引数で渡し、 '*3 .GetFolderで、フォルダーオブジェクトを取得します Set objDIR = objFS.GetFolder(strFDIRNAME) 今度は、フォルダーのオブジェクトを取得します。 フォルダーのオブジェクトが取得できたら、 For Each objFILE In objDIR.Files で、フォルダーオブジェクトから、ファイルのオブジェクトを取り出します。 '*4 .Filesコレクションにアクセスする For Each objFILE In objDIR.Files strFNAME = objFILE.Name '取り出したobjFILEの.Nameを取得 If Right(strFNAME, 4) = ".asp" Then '.ASPならリンクを作る Response.Write "<a href='" & strFNAME & "'>" Response.Write strFNAME & "</a>" & vbTab Else Response.Write strFNAME & vbTab End If 'おまけで更新日の表示 Response.Write objFILE.DateLastModified & "<br>" & vbCRLF Next あとは、取り出したファイルオブジェクトの ..Name で、ファイル名 ..DateLastModified で、更新日 を取り出し、画面に表示してます。 それだけだと、味気ないので、 Right関数で後ろから4文字取り出し、 ..aspだったら、リンクのタグ処理を行いました。 意外と今回も簡単にフォルダー内のファイル一覧を取得することが出来ました。 http://www.ken3.org/cgi-bin/test/test067-1.asp でテスト可能です。 -【けんぞう!】--------------------------------------------------------- 転職関係、在宅プログラマー、SOHOの広告まとめました http://www.ken3.org/etc/500yen/zaitaku.html いろいろとあるので転機の人はぜひ 『だだ、広告料稼ぎたいだけだろ、紹介料300円〜1500円の小金稼ぎ』 ギクっ、、、バレた(笑)登録料無料、匿名で探せるので在宅で小金稼ぎの人も見てね ------------------------------------------------------------------------ 

/* * 4.終わりの挨拶 </HTML> */

今回は、 FileSystemObjectの.GetFolderを使用して、 フォルダーのオブジェクトを取得、 For Each objFILE In objDIR.Filesでファイル単位にまわし、 ファイルの一覧を表示してみました。 そんなサンプルプログラムでした。 何かの参考となれば幸いです。 素朴な疑問やリクエスト、クレームなどがあったら、 掲示板 : http://www.ken3.org/cgi-bin/bbs/asp/wforum.cgi に気軽に書き込んでください。 ASP、VBScript勉強中の三流プログラマーのKen3でした。

No.68 2003/07/01
DBでユーザー管理、ログイン処理(復習で作成)
[ページTOPへ戻る]

<DBでユーザー管理、ログイン処理(復習で作成)>

こんにちは、三流プログラマーのKen3です。 今回は、 DBへユーザー情報を登録、 そのデータを使用して、ログイン処理を実行。 そんなサンプルを復習で作ってみます。

/* * 1.今回のキッカケ */

No.35 パスワードの入力画面 http://www.ken3.org/backno/backno_asp08.html#35 では、 単に、 パスワード:<INPUT TYPE="password" NAME="pass" SIZE="12"> ポイントは、TYPE="password"です。 なんて、感じで、入力フォームのことを書いてました。 が、普通、パスワード管理と言えば、 ユーザーマスターがあり、IDとパスワードのチェックです。 なんてクレームは来てないけど、 今回、DBにIDとパスワードを保存しておき、 普通のログイン処理を作成してみたいと思います。

/* * 2.テーブルの作成 と ログイン画面(入り口)HTMLを作る */

ユーザー管理、よく見かけるパターンが、 ユーザーID : [ Ken3 ] パスワード : [ 1234 ] ニックネーム [ 三流PG ]  ・  ・ です。 せっかくDB化しても、DBを見つけられて、発覚。 なんてこともありますが、 今回はテストなので、そこまでは気にしないで、 普通に作成してみます。 ※パスワードの扱いは、注意が必要です。  軽い気持ちはこのメルマガだけにしてくださいね。 データベース名は、db068.mdb テーブルは、t_user フィールドは、 userid ユーザーID 最大12桁 password パスワード 最大12桁 username ユーザー名 最大20文字 point ポイント long lastlogin ログイン日時 date型 と、データベースとテーブルを作成します。 初期画面に userid [ ___________ ] password [ ___________ ] ログイン(ボタン) 新規ユーザー登録(リンク) を作成する。 ログインボタンが押されたら、 test068-1.asp(login.asp)を呼び出し、userid,passwordのチェックを行う。 エラーの時は、メッセージを表示して、再度ログインさせる。 正常時、セッション変数にuseridとユーザー名、ポイントを保存。 lastloginの日時を更新する 新規ユーザー登録のリンクがクリックされたら、 test068-2.asp(adduser.asp)を起動する。 userid [ ___________ ] password [ ___________ ] ユーザー名 [ ____________ ] を入力させる。 useridが重複していないかチェックを行い、エラー時は、再度入力させる。 さてと、まずは、入り口 test068.html(index.html)を作成しますか。 <html> <head> <title>けんぞうのへんてこな世界へようこそ</title> </head> <body bgcolor=#ffffff text=#000000> <center> <h2>けんぞうのへんてこな世界へようこそ</h2> <br> <table bolder=1> <FORM ACTION="test068-1.asp" METHOD="POST"> USER ID:<INPUT TYPE="text" NAME="userid" SIZE="12"><br> パスワード:<INPUT TYPE="password" NAME="pass" SIZE="12"><br> <INPUT TYPE="submit" VALUE="ログイン"> <INPUT TYPE="reset" VALUE="クリア"> </FORM> </table><br> <a Href="test068-2.asp" TARGET="_top">新規ユーザー登録</a><br> </center> </body> </html> 就職活動向けのHPだったら、 入り口をキレイに作ったほうがいいですよ。 ポイントは、 ~~~~~~~~~~ フォームの パスワード:<INPUT TYPE="password" NAME="pass" SIZE="12"><br> と、TYPE="password"ぐらいかなぁ。 あとは、 test068-1.asp が ログイン処理 test068-2.asp が 新規ユーザー追加処理です http://www.ken3.org/cgi-bin/test/test068.html でテスト可能です。

/* * 3.新規ユーザーの追加 */

まずは、新規ユーザーの追加から、作成してみます。 test068-2.asp ここに、2つの機能を持たせてみます。 1つは、ID、パスワード、名前の入力 もう1つは、実際にDBへ登録する処理です。 機能の切り替えは、MODEのパラメータ、 パラメータが何も無ければ、入力処理、 MODE="ADDNEW"だったら、データチェックと追加処理にします。 少し、ダラダラと長いけど、ソースから掲載。 <%@LANGUAGE=VBScript%> <html> <head> <title>新規ユーザーの追加処理</title> </head> <body bgcolor=#ffffff text=#000000> <!-- Ken3 --><!-- #include file="info.inc" --> <h1>新規ユーザーの追加処理</h1> <% Call START()%> <HR> <!-- Ken3 --><% Call OUT_SRC("") 'ソースの表示関数を呼ぶ %> <!-- Ken3 --><!-- #include file="inc_mokuji.inc" --> </body> </html> <!-- Ken3 --><!-- #include file="out_src.inc" --> <%
Sub START()

 If Request("mode") = "addnew" Then
   ret = USERCHK()  'ユーザーを重複チェックする
   If ret = 0 Then
     'データを追加する
     Call add_data()  'MDBへ追加する
     Response.Write "<hr>"
     Response.Write "正常終了<br>"
     Response.Write "<h2>作成が終了しました</h2><br>"
     Response.Write "テストを兼ねてログインしてみてください<br>"
     Response.Write "<a Href='test068.html'>ログイン処理へ戻る</a><br>"
   Else
     Response.Write "<hr><font color='red'><b>"
     Response.Write "ユーザーIDが重複してます</b></font><br>"
     Response.Write "<b>再度データを入力してください</b><br>"
     Call input_data()  'データの入力
     Response.Write "<a Href='test068.html'>戻る</a><br>"
   End If
 Else 
   Call input_data()  'データの入力
 End if

End Sub
Sub add_data()  'マスターへデータを追加する

  '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("db068.mdb")
  'やっとデータベースを開ける
  db.open

  'SQL文を作る
  strSQL = "INSERT INTO t_user"
  strSQL = strSQL & "(userid, [password], username, lastlogin) VALUES("
  strSQL = strSQL & "'" & Request.Form("userid") & "'"
  strSQL = strSQL & " , '" & Request.Form("pass") & "'"
  strSQL = strSQL & " , '" & Request.Form("username") & "'"
  strSQL = strSQL & " , #" & now & "#"
  strSQL = strSQL & ")"

  'strSQL = "INSERT INTO t_user(userid) Values('ZZZZ')"を発行したい

  Response.Write "発行するSQL=" & strSQL & "<hr>"

  'SQL文の発行
  db.Execute(strSQL)

  db.Close 'データベースも閉じようよ
  Set db = Nothing 'お行儀よくオブジェクトも開放しましょう

End Sub
Function USERCHK()  'ユーザーが存在するかチェックする

  '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("db068.mdb")
  'やっとデータベースを開ける
  db.open

  'SQL文を作る
  strSQL = "Select * From t_user "  'ユーザーマスター(*)セレクト
  strSQL = strSQL & "WHERE userid = '" & Request.Form("userid") & "' " 

  'お約束のレコードセットの作成 SQL文の発行
  Set rs = db.Execute(strSQL)

  'ユーザーIDが存在したか?
  If rs.EOF = True Then  'データ無しの時
    USERCHK = 0  'データが無いので、チェックはOKです。
  Else
    USERCHK = -1 'データがあったので、エラーをセットする
  End If

  rs.Close '開いていたレコードセットを閉じる
  db.Close 'データベースも閉じようよ
  Set db = Nothing 'お行儀よくオブジェクトも開放しましょう

End Function
Sub input_data()  'データ入力フォームの表示

  Response.Write "<table bolder=1>"
  Response.Write "<FORM ACTION='test068-2.asp' METHOD='POST'>"
  Response.Write "<INPUT type='hidden' NAME='mode' VALUE='addnew'>"
  Response.Write "USER ID:<INPUT TYPE='text' NAME='userid' SIZE='12'><br>"
  Response.Write "パスワード:<INPUT TYPE='password' NAME='pass' SIZE='12'><br>"
  Response.Write "お名前:<INPUT TYPE='text' NAME='username' SIZE='20'>"
  Response.Write "<BR>"
  Response.Write "<INPUT TYPE='submit' VALUE='登録'>"
  Response.Write "<INPUT TYPE='reset'  VALUE='クリア'>"
  Response.Write "</FORM>"
  Response.Write "</table>"

End Sub
%>
ポイントは ~~~~~~~~~~ 特に無いんだけど(オイオイ)、 私がハマったヶ所を恥ずかしいけど暴露します。 発行するSQL= INSERT INTO t_user(userid, password, username, lastlogin) VALUES('ABC' , 'abc' , 'ZZZ' , #2003/07/01 23:08:20#) ------------------------------------------------------ Microsoft JET Database Engine エラー '80040e14' INSERT INTO ステートメントの構文エラーです。 /cgi-bin/test/test068-2.asp, 行 67 おいおい、どこが間違っているの? と思うけど、怪しいのが、 passwordって単語なんですね。 'SQL文を作る strSQL = "INSERT INTO t_user" strSQL = strSQL & "(userid, [password], username, lastlogin) VALUES(" strSQL = strSQL & "'" & Request.Form("userid") & "'" と、 [password]単語を[]囲い、フィールド名ですよ、 なんて指定が必要なんですね。 どこがエラーなのか、、、ハマりました。 フィールド名に必ずF_XXXとやっている人は、ひっかからないエラーでした。 あとの流れは、入力データのチェックはDBを読みに行って、 同じIDで登録されているかをチェックする簡単な処理 と ハマった、InsertのSQLを発行しただけでした。 これで、データの新規登録ができたので、 次は、ログイン処理を作成します。

/* * 4.ログインの処理 */

さてと、登録が出来たら、今度はログインの処理ですね。 test068-1.asp これも、長いけど、 ポイントは、データをチェックするSQLを発行しているぐらいかなぁ。 <%@LANGUAGE=VBScript%> <html> <head> <title>ユーザー管理処理</title> </head> <body bgcolor=#ffffff text=#000000> <!-- Ken3 --><!-- #include file="info.inc" --> <h1>ユーザー管理処理</h1> <% Call START()%> <HR> <!-- Ken3 --><% Call OUT_SRC("") 'ソースの表示関数を呼ぶ %> <!-- Ken3 --><!-- #include file="inc_mokuji.inc" --> </body> </html> <!-- Ken3 --><!-- #include file="out_src.inc" --> </body> </html> <%
Sub START()

  ret = USERCHK()  'ユーザーをチェックする
  if ret = 0 then
     Response.Write "<hr>"
     Response.Write "正常終了<br>"
     Response.Write "<h2>無事ログインできました</h2><br>"
  end if

  if ret = -1 then
     Response.Write "<hr><font color='red'>"
     Response.Write "<b>ユーザーIDが登録されてません</b></font><br>"
     Call rlogin()
  end if

  if ret = -2 then
     Response.Write "<hr><font color='red'>"
     Response.Write "<b>パスワードが違います</b></font><br>"
     call rlogin()
  end if

End Sub
Function USERCHK()

  '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("db068.mdb")
  'やっとデータベースを開ける
  db.open

  'SQL文を作る
  strSQL = "Select * From t_user "  'ユーザーマスター(*)セレクト
  strSQL = strSQL & "WHERE userid = '" & Request.Form("userid") & "' "

  'お約束のレコードセットの作成 SQL文の発行
  Set rs = db.Execute(strSQL)

  'ユーザーIDが存在したか?
  If rs.EOF = True Then  'データ無しの時
    USERCHK = -1
    rs.Close '開いていたレコードセットを閉じる
    db.Close 'データベースも閉じようよ
    Set db = Nothing 'お行儀よくオブジェクトも開放しましょう
    Exit Function
  End If

  'パスワードのチェック
  If rs.Fields.Item("password") <> Request.Form("pass") Then
    USERCHK = -2
    rs.Close '開いていたレコードセットを閉じる
    db.Close 'データベースも閉じようよ
    Set db = Nothing 'お行儀よくオブジェクトも開放しましょう
    Exit Function
  End If

  USERCHK = 0   '正常

  'データの表示を行う
  Response.Write "<H2>"
  Response.Write rs.Fields("username")
  Response.Write "さん、ようこそ</H2>"
  Response.Write "<HR>"

  Response.Write "現在のポイントは、"
  Response.Write rs.Fields("point") & "ポイントです。<br>"
  Response.Write "前回ログイン時刻は"
  Response.Write rs.Fields("lastlogin")
  Response.Write "でした。<br>"

  Response.Write "<h2>会員メニューなどを表示する</h2>"
  Response.Write "<h2>工事中(笑)</h2>"

  rs.close

  '更新用のSQL文を作る、ログイン毎に1ポイント追加 と ログイン時刻を更新
  strSQL = "UPDATE t_user "  'ユーザーマスター更新する
  strSQL = strSQL & " Set point = point + 1"
  strSQL = strSQL & ", lastlogin = #" & Now & "#"
  strSQL = strSQL & " WHERE userid = '" & Request.Form("userid") & "' " 

  'SQL文の発行
  db.Execute(strSQL)

  db.Close 'データベースも閉じようよ
  Set db = Nothing 'お行儀よくオブジェクトも開放しましょう

End Function
Sub rlogin()  '再ログイン処理

  Response.Write "<table bolder=1>"
  Response.Write "<FORM ACTION='test068-1.asp' METHOD='POST'>"
  Response.Write "<INPUT type='hidden' NAME='mode' VALUE='login'>"
  Response.Write "USER ID:<INPUT TYPE='text' NAME='userid' SIZE='20'><br>"
  Response.Write "パスワード:<INPUT TYPE='password' NAME='pass' SIZE='20'>"
  Response.Write "<BR>"
  Response.Write "<INPUT TYPE='submit' VALUE='ログイン'>"
  Response.Write "<INPUT TYPE='reset'  VALUE='クリア'>"
  Response.Write "</FORM>"
  Response.Write "</table>"

End Sub
%>
ポイントは ~~~~~~~~~~ 送られてきたユーザーIDとパスワードをチェックして、 結果をリターン値で返してます。 http://www.ken3.org/cgi-bin/test/test068.html でテスト可能です。 遊んでみてください。 -【けんぞう!】--------------------------------------------------------- 転職関係、在宅プログラマー、SOHOの広告まとめました http://www.ken3.org/etc/500yen/zaitaku.html いろいろとあるので転機の人はぜひ 『だだ、広告料稼ぎたいだけだろ、紹介料300円〜1500円の小金稼ぎ』 ギクっ、、、バレた(笑)登録料無料、匿名で探せるので在宅で小金稼ぎの人も見てね ------------------------------------------------------------------------ 

/* * 5.終わりの挨拶 </HTML> */

今回は、 ログイン処理のサンプルを駆け足で説明しました。 一番ためになったのは、[]で予約語は囲うってことかなぁ。 何かの参考となれば幸いです。 素朴な疑問やリクエスト、クレームなどがあったら、 掲示板 : http://www.ken3.org/cgi-bin/bbs/asp/wforum.cgi に気軽に書き込んでください。 ASP、VBScript勉強中の三流プログラマーのKen3でした。

No.69 2003/07/04
FileSystemObjectの.GetTempName(一時ファイル名作成)
[ページTOPへ戻る]

<FileSystemObjectの.GetTempName(一時ファイル名作成)>

こんにちは、三流プログラマーのKen3です。 今回は、 FileSystemObjectの.GetTempName を使用して、テンポラリファイルを作成してみます。

/* * 1.今回のキッカケ */

一時的な作業ファイルを作成する時、どうするのだろう? と探っていたら、 FileSystemObjectの.GetTempName を見つけたので、サンプルを作ってみます。

/* * 2.FileSystemObjectの.GetTempName */

使い方は、簡単で、 '*1 FileSystemObjectを生成します、、って英文、そのままジャン。 Set objFS = Server.CreateObject("Scripting.FileSystemObject") と、 ファイルシステムのオブジェクトを作成してから、 '*2 .GetTempNameを使用して、一時ファイル名を作成する strTEMPNAME = objFS.GetTempName '.GetTempNameを使用してリターン値をもらう たんに、 objFS.GetTempName とやるだけで、一時ファイルのファイル名を取得できます。 私が勘違いしてたんだけど、 .GetTempName って、ファイル名を返してくれるだけで、実際のファイルは作成されません(笑) なので、自分で、.CreateTextFileなどで作成します。 ※同時に作られるかと思っていたけど、  ディレクトリがあるよねよく考えたら。  システムのデフォルトに捨てファイルを作ってくれるかと大きく勘違い。  あっ、あと、一時ファイルなんだけど、自動的にファイルは消えないので、  自分で消さないと、ゴミが貯まるよ(笑)  *平和な私は、一時エリアにファイルを勝手に作り、 ASP終了後、勝手に消えると思ってた(予想したけど)   実際は、ファイル名だけ作ってくれるので、そこから先はご自分で(爆) http://www.ken3.org/cgi-bin/test/test069-1.asp で、テスト可能です。 下記が使用サンプルです、 .GetTempNameでファイル名取得後、テキストファイル作成、中身に時刻を書く。 ファイル閉じた後、ディレクトリの一覧を確認で表示してます。 実行結果とあわせて、ソースを確認してください。 <%@LANGUAGE=VBScript%> <html> <head> <title>FileSystemObjectの.GetTempName(一時ファイル名を作成する)</title> </head> <body> <h2>一時ファイル名を作成する<br>FileSystemObjectの.GetTempName</h2> <b>FileSystemObjectの.GetTempName</b>を使用して、一時ファイル名を取得してみます<br> <br> .GetTempNameを使用すると、一時ファイルの名称を作成してくれます。<br> あとは、その名称を使用して、ファイルを作成します<br> (自動的にファイルは作られないので注意してください)<br> ※下記の実行結果とソースを見てください。<br> <hr> <% '*1 FileSystemObjectを生成します、、って英文、そのままジャン。 Set objFS = Server.CreateObject("Scripting.FileSystemObject") '*2 .GetTempNameを使用して、一時ファイル名を作成する strTEMPNAME = objFS.GetTempName '.GetTempNameを使用してリターン値をもらう Response.Write ".GetTempNameで作成した名称[<b>" & strTEMPNAME & "</b>]<br>" '現在のフォルダーから相対位置のworkディレクトリの名称を取り出す strFDIRNAME = Server.MapPath("work/") 'フォルダー名取得 'work/xxxxのファイルを作成して、テストデータを書き込む Response.Write strFDIRNAME & "\" & strTEMPNAME & "を作成<br><br>" Set objTEXTFILE = objFS.CreateTextFile(strFDIRNAME & "\" & strTEMPNAME) objTEXTFILE.WriteLine "現在時刻は" & Now() objTEXTFILE.WriteLine "テンポラリファイルのテストでした(笑)" objTEXTFILE.Close Set objTEXTFILE = Nothing '確認でファイルリストの表示.GetFolderで取得後、一覧表示 Response.Write strFDIRNAME & "のファイル一覧です<br>" & vbCRLF Set objDIR = objFS.GetFolder(strFDIRNAME) '.Filesコレクションにアクセスする For Each objFILE In objDIR.Files strFNAME = objFILE.Name '取り出したobjFILEの.Nameを取得 If strFNAME = strTEMPNAME Then Response.Write "<b>" Response.Write "<a href='work/" & strFNAME & "'>" Response.Write strFNAME & "</a>" & vbTab 'おまけで更新日の表示 Response.Write objFILE.DateLastModified & "<br>" & vbCRLF If strFNAME = strTEMPNAME Then Response.Write "</b>" Next %> <hr> </body> </html> -【けんぞう!】--------------------------------------------------------- 転職関係、在宅プログラマー、SOHOの広告まとめました http://www.ken3.org/etc/500yen/zaitaku.html いろいろとあるので転機の人はぜひ 『だだ、広告料稼ぎたいだけだろ、紹介料300円〜1500円の小金稼ぎ』 ギクっ、、、バレた(笑)登録料無料、匿名で探せるので在宅で小金稼ぎの人も見てね ------------------------------------------------------------------------ 

/* * 3.終わりの挨拶 </HTML> */

今回は、 一時ファイルの作成のサンプルでした。 ※一時ファイルを使うような大きなシステムを作らないとなぁ。。。 何かの参考となれば幸いです。 素朴な疑問やリクエスト、クレームなどがあったら、 掲示板 : http://www.ken3.org/cgi-bin/bbs/asp/wforum.cgi に気軽に書き込んでください。 ASP、VBScript勉強中の三流プログラマーのKen3でした。



ページフッター リンクや広告、質問送信など

三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。

次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません

DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く

VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。

ニガテな環境設定系など
[Win2003 Server に IIS を Setup]・・・ポイントの無い、ほぼ一本道解説だけど。
[IIS 仮想ディレクトの作成とASP動作TEST]・・・Web拡張でASPを有効にしただけです。

Blog:[三流君の作業日記]/ [サンプルコードのゴミ箱]/ 広告-[通販人気商品の足跡]

質問や要望など メッセージを送る(三流君に連絡する)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。

あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)


急ぎで連絡がほしい、そんな時は:[三流君連絡先アドレス]を見て連絡してください。



[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]