トップへ戻る
BLOGS

PHP ログインフォームを作成する (ファイル書き込み、ユーザー認証、ページリダイレクト)

PHP ログインフォームを作成する (ファイル書き込み、ユーザー認証、ページリダイレクト)

さて今回はログインフォームを作成する手順を記していく

二回目の記事ですね

前回は

  • HTMLの作成
  • ユーザー登録機能
  • リダイレクト
  • 入力チェック

まで作成していましたが、ユーザー登録機能でインプットしてもらったものをuserinfo.txtへ書き込むところまでは実装しましたが、同じユーザー、アドレスが二重に登録できてしまうため、これの処理を書いていきます

やりたいこととしては、

ユーザーのアドレスが一致するか判定する

これができればエラー表示が出せますね

そのためには現在登録されているアドレスだけを抜き取ってこないといけません

具体的な手順としては

  • 保存されているファイルを参照する
  • 保管テキストの改行部分で切り分ける
  • さらにアドレスとパスワードをコンマで切り分ける

この手順が必要でこれを実現する関数を紹介します

file_get_contents() 指定したファイルを取得する

file_get_contents(ファイルのディレクトリを指定);

と前回書き込む時に使用した関数の取得する版ですね

他にも引数でインクルードパスから読み込みができたり、オフセット値や最大バイト数なども取れます

読み込むときと同じで失敗するとfalseが返ります

explode() 配列を切り分ける

explode()こちらの関数は引数として

第一引数、区切り文字(例:コンマやスペース)

第二引数、入力文字

第三引数(任意)、返る配列の最大の要素の数

これでユーザー情報の「アドレス、コンマ、パスワード、改行」の中から「改行」で区切って配列にすることが出来ます

配列を切り分ける関数はいくつかあるため簡単に紹介しておきます

preg_split()正規表現で文字列を分割する

str_split()文字列をしてした文字数ずつ配列に変換する

str_getcsv()  CSV 文字列をパースして配列に格納する

さらにこちらの関数では指定した文字列を切り分け配列にすることが出来ます

explode()関数では改行部分で切り分けしようと考えていた上で

こちらの関数を使用することで配列の中から「コンマ」で区切って新たな配列にすることが出来ます

またCSV形式に保存した際にダブルクォーテーションでそれぞれ囲っていましたが、この関数はダブルクォーテーションも自動で削除してくれるため非常に便利です

これらの関数を組み合わせて分岐処理を行っていきます

//新規ユーザー登録処理
  $userfile = '../../userinfo.txt';
  $users    = array();
  if (file_exists($userfile)) {
    $users    = file_get_contents( $userfile );
    $users    = explode("\n",$users);
    foreach ( $users as $key => $arr) {
      $userId = str_getcsv($arr);
      if ($userId[0] === $_POST['e']) {
        $err_msg[] = 'そのメールアドレスはすでに登録されてます';
        break;
      }
    }
  }

はいこれで問題なく動作しました。

file_exists()関数は説明していませんでしたがファイルが存在するかの真偽を返す関数です

念の為$usersを一度空にしてファイルが存在していればif文の中に入ります

後は配列となった$usersをforeachで回していきます、そしてループのたびにアドレスだけを切り分けて代入するため毎回のループごとに$userId[0]にもそれぞれのアドレスが入ってきます

それを受け取った$_POST[‘e’]と比較するわけですね

これらの関数や記述方法はログイン画面の認証機能にも 使用できるためこのまま書いていきましょう

ログインユーザー認証機能を付ける

さてここでは入力された値に対して先に作成したメールアドレスとパスワードを比較する必要があります

前述の通りメールアドレスの方は上で使用した方法で認証することが可能ですが、パスワードに関してはハッシュ化されておりこれを認証しなければなりません

そこで便利な関数を紹介します

password_verify(パスワード , ハッシュ値)

上記の関数で簡単に認証できます

ハッシュ値というものはもとの値が同じであれば同じ値が返ってくるそうです

簡単な関数であるため説明のしようがありませんね

//認証チェック
	$userfile = '../../userinfo.txt';
  $users    = array();
  if (($userfile)) {
    $users    = file_get_contents( $userfile );
    $user    = explode("\n",$users);
    foreach ( $user as $key => $arr) {
      $userId = str_getcsv($arr);
      if ($userId[0] === $_POST['e']) {
	if (password_verify($_POST['p'] , $userId[1])) {
	if (!$err_msg) {
	$host = $_SERVER['HTTP_HOST'];
	$url  = rtrim(dirname($_SERVER['PHP_SELF']),'/\\');
	header("Location: //$host$url/memberonly.php");
	exit();
	}
     }
   }
}
$err_msg[] = 'メールアドレスまたはパスワードが間違っています';
} else {
$err_msg[] = 'ユーザーファイルリストが見つかりません';
}

はい

上とほとんど同じですが違う点は

file_exists()にてファイルが見つからない場合はエラーにするようにします

またif (password_verify($_POST[‘p’] , $userId[1])) の条件分岐でパスワード認証を行い問題なければ、ログインページに飛べるようにしています。

そしてforeachのループから認証のif文に入らなかった場合はエラーになるようにしています

それではログイン情報を持たせてログインしているかどうかの処理を書いていきましょう

ログイン情報でページを分岐する

ここからはURLをダイレクトに入力されるとそのままそのページに飛べてしまうので、

メールフォームの際に勉強した$_SESSION変数を利用してその情報を取得し分岐させます

セッション変数は一定時間するか再起動しなければ消えないのでページをまたがれていても、いちいちログインさせ直す事なくリダイレクトさせれるようにします

セッション変数を使用する際はページの最上部にお約束の、

session_start();を忘れずに記述します

そしてログインする際にすべての認証が終わりジャンプする前にセッション変数を仕込んでおきます

$_SESSION['e'] = $_POST['e'];

そしてログインページにGETで来た場合の処理に追記します

if (isset($_SESSION['e']) && $_SESSION['e']) {
 $host = $_SERVER['HTTP_HOST'];
 $url  = rtrim(dirname($_SERVER['PHP_SELF']),'/\\');
 header("Location: //$host$url/memberonly.php");
 exit();
	}

少し前にログインしていてまだセッション変数が残っていれば即座にリダイレクトするようにします

次にメンバー専用ページにPHPを書いていきます

session_start();
if( !isset($_SESSION['e']) && !$_SESSION['e']) {
	$host = $_SERVER['HTTP_HOST'];
	$url  = rtrim(dirname($_SERVER['PHP_SELF']),'/\\');
	header("Location: //$host$url/index.php");
	exit();
}

今度は条件分岐の部分に!マークをつけてセッション変数が無い時としています

今度はログインページに戻すわけですね

最後にログアウト後のページを作り

セッション変数をクリアする記述を書いておきます

session_start();
$_SESSION = array();

それぞれリンクを作り問題なく動作すれば大丈夫ですね

ここまででだいぶログインフォームっぽくなってきました

一応これでもう試用できる形ではあるのですが

パスワードを忘れてしまったユーザーのために再発行機能も実装したいと思います

続きは次回ですね

コメントをお待ちしております

お気軽にコメントをどうぞ。

CAPTCHA