<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%> ポイントは ~~~~~~~~~~ 特に無いんだけど(オイオイ)、 私がハマったヶ所を恥ずかしいけど暴露します。 発行する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を発行しただけでした。 これで、データの新規登録ができたので、 次は、ログイン処理を作成します。
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/* * 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%> ポイントは ~~~~~~~~~~ 送られてきたユーザーIDとパスワードをチェックして、 結果をリターン値で返してます。 http://www.ken3.org/cgi-bin/test/test068.html でテスト可能です。 遊んでみてください。
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/* * 5.終わりの挨拶 </HTML> */
今回は、 ログイン処理のサンプルを駆け足で説明しました。 一番ためになったのは、[]で予約語は囲うってことかなぁ。 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。
ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
[三流君(TOP ken3.org へ戻る)]
/ [ASPで遊ぶ、失敗する]
/ [ASP記事 バックナンバー目次]
まぁ、基本はデータの受け取りかなぁ。
・[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記事 バックナンバー目次]