忍者ブログ
バナヤンの忍者風呂
忍者ブログのカスタマイズ、各種WEBツールのテストなど試行錯誤の日々。 VMLによる地図の作成を研究していましたが、一時中断して、今はPHPを勉強しているところです。
ニュース
この欄には、このブログの内容に関連するニュースを掲載する予定です。
お知らせ
この欄には管理人からのお知らせなどを掲載します。
[50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60]

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

PHP 会員登録システム(テキストファイル版)

PHPで会員登録システムを作りたい。そのために必要な知識をひとつひとつ確認してきました。セキュリティの面など、まだ足りない面はあるとは思いますが、ようやく形にできそうです。

ユーザーID、パスワード、メールアドレス、クラスなどのユーザー情報をテキストファイルに記録した場合の処理についてまとめておきましょう。この記録をテキストファイルではなく、PHPファイルにした場合、SQLiteを使用した場合などについては、後日発表することにします。

ユーザーリストについては、下記のような形式で作ってみました。カンマ「,」で区切ったCSV形式です。左のフィールドから順番にユーザーID、パスワード、メールアドレス、クラスです。

[サンプル]member.txt

bbbb,d41d8cd98f00b204e9800998ecf8427e,acd@efg,2,
abcd,e2fc714c4727ee9395f324cd2e7f331f,abcd@com,2,
abcde,ab56b4d92b40713acc5af89985d4b786,abcd@tokyo.com,1,
cccc,41fcba09f2bdcdf315ba4119dc7978dd,cccc@ccc.com,2,

2番目のフィールドであるパスワードについては、ハッシュ値で保管しています。したがって、この値から本当のパスワードを復元することは基本的にはできません。

4番目のクラスについては、アクセス制限のための値を入れます。
値によって、権限を次のように分けるつもりです。
 0:除名
 1:停止
 2:一般ユーザー
 3:VIP
 4:アシスタント
 5:副管理者
 6:管理者
 7:オーナー
なお、仮登録の際、このフィールドには本登録へのデータの受け渡し用にユーザーIDのハッシュ値を記録し、本登録した場合に「2」に値を変更します。

ユーザー情報入力画面を表示し、仮登録を行うとともに確認メールを送信するのは、次のPHPファイルです。

[ソース]membercheck.php

<?php
#########################メッセージ初期値&受信データチェック
if(ereg("^[a-z][a-z0-9_-]{2,15}$",$_POST["usrid"] )) {
#################受信データusrid重複チェック
###########メンバーデータ読込み・比較
$lines = file("member.txt");
foreach ($lines as $l) {
$items = explode(",", $l);
if($items[0] == $_POST["usrid"]){
$msg_usrid = "登録済です。他の文字列に変更修正して下さい。";
}else{
$msg_usrid = "";
}
}
}else{
$msg_usrid = "半角小文字の英数字、アンダーバー「_」、ハイフン「-」で3文字以上16文字以内。";
}
if(ereg("^[a-z][a-z0-9_-]{2,15}$",$_POST["pwd"] )){
$msg_pwd = "";
}else{
$msg_pwd = "半角小文字の英数字、アンダーバー「_」、ハイフン「-」で3文字以上16文字以内。";
}
if(ereg("(^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+)@([a-zA-Z0-9_.-]+)$", $_POST["mail"])) {
$msg_mail = "";
}else{
$msg_mail = "間違いのないようメールアドレスを入力して下さい。";
}
$notice = $msg_usrid.$msg_pwd.$msg_mail;
#########################画面モード
if($notice == ""){
$mode="checked";
$title="データ確認・修正画面";
$msg="本当に間違いがないか確認して「登録」ボタンをクリックして下さい。
修正する場合は入力のうえ「チェック」ボタンを押して下さい。";
}else{
$mode="input";
$title ="データ入力画面";
$msg="入力ミスに気をつけて下さい。間違いがなければ「チェック」ボタンを押して下さい。";
}
if($_POST['regist']){
$mode="regist";
$title ="データ登録画面";
$msg="下記内容で仮登録します。";
}
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Pragma" content="no-cache">
<title>メンバー登録データ・チェック</title>
</head>
<body>
<h1><?= $title ?></h1>
<p><?= $msg ?></p>
<form method='post' action="<?= $_SERVER[PHP_SELF] ?>">
<table style="border:#000 solid 1px;empty-cells:show;">
<tr><th>項目</th><th>登録する値</th><th>備考</th></tr>
<tr>
<th>ユーザーid</th>
<td><input type='text' name='usrid' value="<?= $_POST["usrid"] ?>"></td>
<td><?= $msg_usrid ?></td>
</tr>
<tr>
<th>パスワード</th>
<td><input type='text' name='pwd' value="<?= $_POST["pwd"] ?>"></td>
<td><?= $msg_pwd ?></td>
</tr>
<tr>
<th>メールアドレス</th>
<td><input type='text' name='mail' value="<?= $_POST["mail"] ?>"></td>
<td><?= $msg_mail?></td>
</tr>
<tr><td colspan="3" style="text-align:right;">
<?php
if($mode=="input"||$mode=="checked"){
echo "<input type='submit' name='check' value='check'>";
}
if($mode=="checked"){
echo "<input type='submit' name='regist' value='regist'>";
}
?>
</td>
</table>
</form>

<?php
if($mode=="regist"){
#### 暗号化
$mailcode = md5($_POST["usrid"]);
$pwd = md5($_POST["pwd"]);
#### データ登録
$data = $_POST['usrid'].",".$pwd.",".$_POST['mail'].",".$mailcode.",\r\n";
$fp=fopen("member.txt","a");
fputs($fp,$data);
fclose($fp);
#### 確認メール送信
mb_language("Japanese");
mb_internal_encoding ("SJIS");
$to = $_POST['mail'];
$subject = "登録の確認について";
$message ="
ご登録ありがとうございます。\n
下記のURLにブラウザでアクセスすると会員登録が完了します。?\n
http://banayan.com/member/confirm_mail.php?mailcode=$mailcode\n
";//サンプルデータ
$header = "From: welcome@banayan.com";//サンプルデータ
$send_mail = mb_send_mail($to,$subject,$message,$header);
echo "データを仮登録し、「確認メール」を送信しました。
メールに記載されたURLにブラウザでアクセスして登録を完了させて下さい。";
}
?>
</body>
</html>



確認メールに記載されたURLへのアクセスにもとづき、本登録するのが次のPHPファイルです。

[ソース]confirm_mail.php

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Pragma" content="no-cache">
<title>メンバー登録データ・チェック</title>
</head>
<body>
<?php
###########メンバーデータ読込み・比較
$lines = file("member.txt");
for ($i = 0; $i < count($lines); $i++) {
$items = explode(",", $lines[$i]);
echo $items."<br>";
if ($items[3] == $_GET['mailcode'] ) {
$usrid=$items[0];
$data=$items[0].",".$items[1].",".$items[2].",2,\r\n";
echo "data".$data."<br>";
array_splice($lines, $i, 1,$data);
}
}
$fp = fopen('member.txt', 'w');
foreach($lines as $line){
fputs($fp, $line);
}
fclose($fp);
echo $usrid."様 登録が完了しました。";
?>
</body>
</html>



以上で一通りの流れは作れたと思います。ロック処理など手を加えなければならない部分は、たくさんあると思いますが、とりあえずPHPの勉強用としては完成ということにしておきましょう。
PR
QRコード
忍者ブログ [PR]
Copyright (C) 2006 banayan ALL RIGHTS RESERVED.