[三流君] −−> [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 でテスト可能です。 遊んでみてください。 -【けんぞう!】--------------------------------------------------------- 転職関係、在宅プログラマー、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でした。

フィードバック

ASP系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.068を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

三流君の主なリンク先

[アクセスランキング] [サイトマップ] [リンク先・相互リンク先など]
ASPで遊ぶ、失敗する 掲示板 バックナンバー 登録と解除
三流プログラマー 業務の愚痴 掲示板 バックナンバー 登録と解除
VBAで楽しくプログラミング 掲示板 バックナンバー 登録と解除
コンビニのオモテとウラ話 掲示板 バックナンバー 登録と解除
www.ken3.org(サイト内)から Google を利用して、

Ken3の日記(weblog) -- [広告・副収入系] [プログラマー業務の愚痴] [VBA系の話題] [ASP系の話題] [コンビニ系ネタ] [その他]

その他 宣伝広告