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

[PR]

×

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

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

PHPで会員登録システムを作りたい。そのために必要な知識をひとつひとつ確認してきました。セキュリティの面など、まだ足りない面はあるとは思いますが、ようやく形にできそうになったので、前回は「PHP 会員登録システム(テキストファイル版) 」を公表しました。

これを「テキストファイル版」と呼んだのは、ユーザーID、パスワード、メールアドレス、クラスなどのユーザー情報をテキストファイルに記録したものを扱ったからです。

テキストファイルは、一般の人がアクセスできないディレクトリに置かないとブラウザで内容を読まれてしまう危険性があります。レンタルサーバーによっては、そのようなディレクトリを設定できない場合もあります。そこで、PHPファイルにその情報を記録して、アクセスされてもブラウザに表示されないようにしようと思います。

ファイルの最初に「<?php」と記述し、最後を「?>」で締めて、ファイルの拡張子を「php」とすれば、立派なPHPファイルです。一般的なブラウザでは内容を確認できません。それでも、心配なら2行目に「header("Location:abc.html");」とでも記述して、別のページに移動させてもよいかもしれません。

前回のサンプル"member.txt"に上記の記述を追加して"member.php"にしたのが、次のものです。
[サンプル]member.php

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


ここまでは簡単ですが、問題はこのファイルに新しいデータを書き込む時です。前回の例の次の部分です。

#### データ登録
$data = $_POST['usrid'].",".$pwd.",".$_POST['mail'].",".$mailcode.",\r\n";
$fp=fopen("member.txt","a");
fputs($fp,$data);
fclose($fp);

「fopen("member.txt","a");」というのは追記モードでデータを書き込むということなので、「fputs($fp,$data);」で書き込まれるデータは、最後に追加されます。

上の"member.php"のような記述の場合、新しいデータは「?>」の後に追加されてしまいます。これでは、ダメです。そこで、この部分を書き換えます。


#### データ登録
$data = $_POST['usrid'].",".$pwd.",".$_POST['mail'].",".$mailcode.",\r\n";
$lines=file("member.php");
$lastline = array_pop($lines);
array_push($lines,$data);
array_push($lines,$lastline);
$fp = fopen('member.php', 'w');
foreach($lines as $line) {
fputs($fp, $line);
}
fclose($fp);

「$lines=file("member.php");」でファイルを配列に格納します。
「array_pop]は、配列の最後の要素を削除して、その値を返す関数です。これによって「?>」を配列$linesからいったん削除します。
「array_push」は、配列の最後に要素を追加する関数です。これによって新しいデータを追加します。「array_push($lines,$data);」でユーザー情報を配列に追加し、その後、いったん削除した「?>」を「array_push($lines,$lastline);」で配列の最後に加えます。
「$fp = fopen('member.php', 'w');」でファイルを書き込みモードで開きます。
そして、配列の要素を1つずつ取り出し、それをファイルの1行として、最初から最後まで書き換えていくのが「foreach($lines as $line) {fputs($fp, $line);}」の部分です。以上のようにすれば、テキストファイルと同じようにPHPファイルでユーザー情報のリストを取り扱うことができます。

一応、全体の記述も掲載しておきます。
[サンプル]membercheck.php-書き込みファイルphp版

<?php
#########################メッセージ初期値&受信データチェック
if(ereg("^[a-z][a-z0-9_-]{2,15}$",$_POST["usrid"] )) {
#################受信データusrid重複チェック
###########メンバーデータ読込み・比較
$lines = file("member.php");
foreach ($lines as $line) {
$items = explode(",", $line);
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";
$lines=file("member.php");
$lastline = array_pop($lines);
array_push($lines,$data);
array_push($lines,$lastline);
$fp = fopen('member.php', 'w');
foreach($lines as $line) {
fputs($fp, $line);
}
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>


PR
QRコード
忍者ブログ [PR]
Copyright (C) 2006 banayan ALL RIGHTS RESERVED.