[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.068 DBでユーザー管理、ログイン処理(復習で作成)

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



本文(発行内容)


<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 でテスト可能です。 遊んでみてください。

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

今回は、 ログイン処理のサンプルを駆け足で説明しました。 一番ためになったのは、[]で予約語は囲うってことかなぁ。 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。


ページフッター

ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、

三流君へ メッセージを送る

感想や質問・要望・苦情など 三流君へメッセージを送る。
返信例 XXXXさんへ
下記のフォームからメッセージを送ることができます。


あなたのお名前(ニックネーム):さん
返信は?:

アドレス:に返事をもらいたい
感想や質問↓:


(感想や質問・要望・苦情はHPで記事に載せることがあります。)

種類別のリンク や 広告など

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


Blogとリンク:[三流君のMemo別館]/ [ASP 三流君のソースコード置き場]/ [Ken3Video YouTubeで動画解説]
広告:

気になった ジャンル ↓を選択してください。

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

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

広告:



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

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



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


広告: