⇒[[山内の授業のページ/09春/プロジェクト]]

アクセス数 &counter();  このページの最終更新 &lastmod();

***セッション管理のサンプルコード [#o230adb2]

注意: セッションの仕組を理解する・使ってみるためのサンプルであり、実用的にはセキュリティが不十分な点が多い。このまま実用にしてはいけないだろう。
注意: セッションの仕組を理解する/使ってみるためのサンプルであり、実用的にはセキュリティが不十分な点が多い。このまま実用にしてはいけないだろう。

ファイル &ref(mytestauth.php); はメインの画面になる。
 <?php
 // ユーザ名入力画面からデータを取り込む
 $id = $_POST["userid"];
 $pass = $_POST["password"];
 
 // データベース上のテーブルunameで探して、正しいユーザか確認する
 
 include(".ht_mypassword");
 $MyLink = mysql_connect($MySQLHost, $MySQLUserName, $MySQLPassword);
 $MySQLDatabase = 'test';
 mysql_select_db($MySQLDatabase, $MyLink);
 $Query = "SELECT password FROM useridtable WHERE name='". $id . "'";
 $Result = mysql_query($Query, $MyLink);
 
 if ( ($numrows = mysql_num_rows($Result)) == 0 ) {	//もしヒットしなければ
 	// print("<p>ユーザ名/パスワードが間違っています1</p>");
 	// もう一度、ログイン認証
 	print('<form action="mytestauth.php" method="POST">');
 	print('ユーザID <input type="text" name="userid" size="16"><br>');
 	print('パスワード <input type="password" name="password" size="16"><br>');
 	print('<INPUT type="submit" name="send" value="送信"><br>');
 	print('</form>');
 	return;
 } else {	// ヒットしたが
 	$Row = mysql_fetch_array($Result, MYSQL_ASSOC);
        if ($pass != $Row["password"]) {	// もしパスワードが合っていなければ
 		// print("<p>ユーザ名/パスワードが間違っています2</p>");
 		// もう一度、ログイン認証
 		print('<form action="mytestauth.php" method="POST">');
 		print('ユーザID <input type="text" name="userid" size="16"><br>');
 		print('パスワード <input type="password" name="password" size="16"><br>');
 		print('<INPUT type="submit" name="send" value="送信"><br>');
 		print('</form>');
 		return;
 	}
 }
 
 // これでOKなので、セッション確認
 session_start();
 if (!isset($_SESSION['id'])) {	// 初めて使うので$_SESSION['id']に値がセットされていない
 	$_SESSION['id'] = $id; $_SESSION['password'] = $pass;  //ユーザIDとパスワードをSESSION変数にしまって置く
 } else if ($_SESSION['id']!=$id) {	// 既に別名のセッションが開始している
 	print("<p>" . $_SESSION['id'] . "</p>");
 	print('<p>セッションがおかしい</p>');
 	return;
 } else {
 	$_SESSION['id'] = $id; $_SESSION['password'] = $pass;  //この代入は要らないかもしれない。
 }
 
 // ここからページ本体
 print('<h1>私のページ</h1>');
 
 print('<FORM action="myaction.php" method="post">');
 print('<P><TEXTAREA rows="3" cols="20" name="freecomment">コメント</TEXTAREA></P>');
 print('<P>動物がすき?');
 print('<INPUT type="radio" name="animal" value="yes">はい');
 print('<INPUT type="radio" name="animal" value="no">いいえ');
 print('<INPUT type="radio" name="animal" value="neither">どちらでもない');
 print('</P>');
 print('<P><INPUT type="submit" name="send" value="送信"></P>');
 print('</FORM>');
 
 ?>

これに対してFORMで起動されるスクリプト、&ref(myaction.php); はこんな風に作ることができる。
 <?php
 // 中で使う関数mymatchを定義
 function mymatch( $myid, $mypassword) {
 // 引数で与えられた$myid, $mypasswordがあるとき、データベース内の
 // ユーザIDの表(useridtable)中に、マッチするエントリつまり
 // (name,password)==($myid,$mypassword)となるエントリがあるか検索し、
 // あればtrueを、なければfalseを返す関数
 
 	include(".ht_mypassword");
 	$MyLink = mysql_connect($MySQLHost, $MySQLUserName, $MySQLPassword);
 	$MySQLDatabase = 'test';
 	mysql_select_db($MySQLDatabase, $MyLink);
 	$Query = "SELECT password FROM useridtable WHERE (name='". $myid . "' and password='" . $mypassword . "')";
 	$Result = mysql_query($Query, $MyLink);
 	
 	if ( ($numrows = mysql_num_rows($Result)) == 0 ) {	//もしヒットしなければ
 		return false;
 	} else {						//ヒットすれば
 		return true;
 	}
 }
 
 
 // 先頭でセッション中であるかどうかをチェックする
 //  このチェックはすべてのページに必要。横から飛び込むことを禁止する。
 //  (トップページが入り口で1回しか使われないなら、そこでは不要)
 session_start();
 if (!isset($_SESSION['id'])) {		// セッション情報が未設定
 	print("<p>不正アクセス1" . $_SESSION['id'] . "</p>");
 	return;
 } else if (!mymatch($_SESSION['id'], $_SESSION['password'])) {	// セッション情報が不適当
 	print("<p>不正アクセス2</p>");
 }
 // ここまでチェック
 
 $comment = $_POST["freecomment"];
 $animal = $_POST["animal"];
 print("<p>名前 :" . $name . "</p>\n");
 print("<p>コメント:" . $comment . "</p>\n");
 print("<p>パスワード:" . $pass . "</p>\n");
 print("<p>どの果物:" . $fruit1result . ", " . $fruit2result . ", " . $fruit3result . "</p>\n");
 print("<p>動物好き:" . $animal . "</p>\n");
 
 // ログアウトボタン 〜 セッション情報を消去するためにぜひログアウト処理が必要で、それを呼び出す。
 print("<p></p> <p></p>");
 print('<form action="mylogout.php" method="POST">');
 print('<INPUT type="submit" name="send" value="ログアウト">');
 print('</form>');
 
 ?>

ログアウト処理のページ &ref(mylogout.php);  は次のようにしてみた。
 <?php
 session_start();
 session_destroy();	// これでセッションを削除する
 // 削除しないと、同じブラウザから次に別ユーザでログインしようとしても
 // 旧ユーザで使用中なので、別ユーザではログインできない
 print("<p>セッション終了</p>");
 print('<a href="mytestauth.php">ログイン画面へ戻る</a>');
 ?>

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS