[三流君] −−>
[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系の→[掲示板]←を覗く、質問を書き込む
評価・感想
三流君の主なリンク先
[アクセスランキング]
[サイトマップ]
[リンク先・相互リンク先など]
Ken3の日記(weblog) --
[広告・副収入系]
[プログラマー業務の愚痴]
[VBA系の話題]
[ASP系の話題]
[コンビニ系ネタ]
[その他]
その他 宣伝広告