広告
PHPでログインページ②
前回はアカウント登録のページを作りました。
今回は作ったアカウントを使って、ログインするページを作ります。
このページは という動作を行います。

今回のポイントはセッションを使ってログイン状態を保持することです。
セッションは一度作られると、ページをまたいでも保存した値が保持されます。
この値はサーバーに一定期間保存されています。
ですので、これを使うと一度ログインしたあとはログインしたままになるページが作れます。

セッションを使うページでは先頭の<?phpの直後に
<?php
session_start();
を置きます。
この後からセッション変数 $_SESSIONが使えるようになります。
この変数に値を記録すれば、ページを遷移したり、ブラウザを閉じたりしても値が保存され続けます。

ログインページのコードです。
	<?php
	session_start();
	  if(!empty($_SESSION['username']))
	    header("Location: ./session.php");
	  else
	  {
	    $username = $_SESSION['username'];

	    $salt_password = "salting_sample";//本当はもっと難しいものにする
	    $salt_username = "salting_sample2";//本当はもっと難しいものにする
	    $user_path = "./users/";
	    $status = "none";
	    $error_message = "不明なエラーです。時間をおいて再度ご登録ください。";

	    $succeeded = false;
	    if(!empty($_POST["username"]) && !empty($_POST["password"]))
	    {
	      $username = hash("sha256", $_POST["username"] . $salt_username);
	      $password = hash("sha256", $_POST["password"] . $salt_password);
	      if(file_exists($user_path . $username . "/password.txt"))
	      {
	        $password_saved = file_get_contents($user_path . $username . "/password.txt");
	        if ($password_saved == $password)
	        {
	          $status = "ok";
	          $_SESSION["username"] = $_POST["username"];
	          header("Location: ./session.php");
	          $succeeded = true;
	        }
	      }
	      //if(0)
	      if(!$succeeded)
	      {
	        $status = "failed";
	        $error_message = "ユーザーが存在しないか、パスワードが違います。";
	        $_SESSION["username"] = null;
	      }
	    }
	    else
	    {
	      $status = "none";
	    }
	  }
	?>

	<!DOCTYPE html>
	<html>
	  <head>
	    <meta charset="UTF-8" />
	    <title>ログイン</title>
	  </head>
	  <body>
	    <h1>ログイン</h1>

	    <?php if($status == "failed"): ?>
	      <p>
	        エラー:
	        <?php echo "${error_message}\n"; ?>
	        <?php
	          //$usr = $_POST["username"];
	          //echo "ユーザー名: ${usr} \n";
	        ?>
	        <form method="POST" action="login.php">
	          ユーザ名:<input type="text" name="username" />
	          パスワード:<input type="password" name="password" />
	          <input type="submit" value="送信" />
	        </form>

	      </p>
	    <?php else: ?>
	      <form method="POST" action="login.php">
	        ユーザ名:<input type="text" name="username" />
	        パスワード:<input type="password" name="password" />
	        <input type="submit" value="送信" />
	      </form>
	    <?php endif; ?>
	  </body>
	</html>

実行例はこちらです。
前回つくったアカウントでログインしてみてください。

ログイン後のページでは、ログインページが保存したユーザー名を表示してみましょう。
もしセッションにユーザー名が設定されていない=ログインしていないならば、
ログイン画面にリダイレクトします。
つまり、このページはログインしていなければ見れないのです。
	<?php
	session_start();
	  $username = $_SESSION['username'];
	  if(!isset($_SESSION['username']) || empty($_SESSION['username']))
	  {
	    header("Location: ./login.php");
	  }
	?>

	<!DOCTYPE html>
	<html>
	  <head>
	    <meta charset="UTF-8" />
	    <title>ログイン後のページ</title>
	  </head>
	  <body>
	    <h1>ログイン後のページ</h1>
	    <?php echo "${username}さん\n"; ?>
	    <br><br>
	    <a href="./logout.php">ログアウト</a>
	    </body>
	</html>
ログイン後のページでは、ログインページが保存したユーザー名を表示してみましょう。
もしセッションにユーザー名が設定されている=ログインしているのならば、
ログイン後の画面にリダイレクトします。
つまり、このページはログインしていなければ見れないのです。
	<?php
	session_start();
	  $username = $_SESSION['username'];
	  if(!isset($_SESSION['username']) || empty($_SESSION['username']))
	  {
	    header("Location: ./login.php");
	  }
	?>

	<!DOCTYPE html>
	<html>
	  <head>
	    <meta charset="UTF-8" />
	    <title>ログイン後のページ</title>
	  </head>
	  <body>
	    <h1>ログイン後のページ</h1>
	    <?php echo "${username}さん\n"; ?>
	    <br><br>
	    <a href="./logout.php">ログアウト</a>
	    </body>
	</html>


このページでは逆にログインしていなければログイン画面(login.php)にリダイレクトします。

最後に、ログアウトするページのコードです。
	<?php
	session_start();
	  if(!isset($_SESSION['username']) || empty($_SESSION['username']))
	    header("Location: ./login.php");
	  session_destroy();
	?<
	<!DOCTYPE html>
	<html>
	  <head>
	    <meta charset="UTF-8" />
	    <title>ログアウトしました</title>
	  </head>
	 <body>
	    ログアウトしました。
	  </body>
	</html>


このページにアクセスすると、session_destroy
保存されたセッションを破棄します。

以上の をセットにして会員専用のページを作ることができます。
さらなる応用としては、登録時にメールアドレスで本人確認をするなどがあると思います。