見出し画像

【PHP7.3】ログインフォームを作成する

今回はPHP7.3にてログインフォームの作成方法を記載します。

前提

・下記記事同様会員登録フォームを作成できていること。

それでは始めます。


ログインフォーム実装

login.phpを作成し下記記載します。

<?php
session_start();

if (isset($_SESSION["id"])) {
   header('Location: user.php');
   exit;
}

//DB情報
$user = 'test';//データベースユーザ名
$password = 'test1234';//データベースパスワード
$dbName = "sample";//データベース名
$host = "sp_db_1";//ホスト
//DB接続
$dsn = "mysql:host={$host};dbname={$dbName};charser=utf8";
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//エラーメッセージの初期化
$errors = array();

// ログインボタンが押されたら
if (isset($_POST['login'])) {

   //エラー文
   if (empty($_POST['mail'])) {
       $errors['mail'] = 'メールアドレスが未入力です。';
   } 
   if (empty($_POST['password'])) {
       $errors['password'] = 'パスワードが未入力です。';
   }
   
   if (!empty($_POST['mail']) && !empty($_POST['password'])) {
       $mail = $_POST['mail'];
       try {
           $pdo->beginTransaction();
           $sql = "SELECT * FROM user WHERE mail = :mail"; 
           $stm = $pdo->prepare($sql);
           $stm->bindValue(':mail', $mail, PDO::PARAM_STR);
           $stm->execute();

           $password = $_POST['password'];
           $result = $stm->fetch(PDO::FETCH_ASSOC);

           if (password_verify($password, $result['password'])) {    
               $_SESSION['id'] = $result["id"];
               $_SESSION['mail'] = $mail;
               $_SESSION['message'] = "ログインしました。";
               header('Location: user');
               exit();
           } else {
               $errors['login'] = 'メールアドレスまたはパスワードに誤りがあります。';
           }
       } catch (PDOException $e) {
           echo $e->getMessage();
       }
   }
}

?>

<h1>ログイン画面</h1>

<div class="form">
<form id="loginForm" name="loginForm" action="" method="POST">
   <?php
       foreach($errors as $error){
           print "<p class='error'>";
           print $error."<br>";
           print "</p>";
       }
   ?>
   
   <div>
       <label for="mail">メールアドレス
       <input type="text" id="mail" name="mail" placeholder="メールアドレスを入力" value="<?php if (!empty($_POST["mail"])) {echo htmlspecialchars($_POST["mail"], ENT_QUOTES);} ?>">
       </label>
   </div>
   
   <div>
       <label for="password">パスワード
       <input type="password" id="password" name="password" value="" placeholder="パスワードを入力">
       </label>
   </div>
   
   <input type="submit" id="login" name="login" value="ログイン">
</form>
</div>

下記画面が表示されます。

スクリーンショット 2019-10-14 15.11.25

アドレス等で間違いがあるとエラーを表示します。

スクリーンショット 2019-10-14 15.12.08


ユーザ情報画面の実装

user.phpを作成し下記記載します。

<?php
session_start();

// ログイン状態チェック
if (!isset($_SESSION["id"])) {
   header("Location: login.php");
   exit;
}

//DB情報
$user = 'test';//データベースユーザ名
$password = 'test1234';//データベースパスワード
$dbName = "sample";//データベース名
$host = "sp_db_1";//ホスト
//DB接続
$dsn = "mysql:host={$host};dbname={$dbName};charser=utf8";
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//エラーメッセージの初期化
$errors = array();
$id = $_SESSION["id"];

try{
   //トランザクション開始
   $pdo->beginTransaction();
   $sql = "SELECT * FROM user WHERE id=(:id)";
   $stmt = $pdo->prepare($sql);
   $stmt->bindValue(':id', $id, PDO::PARAM_STR);
   $stmt->execute();
   $result = $stmt->fetch(PDO::FETCH_ASSOC);

}catch (PDOException $e){
	echo $e->getMessage();
}

?>

<h1>会員情報画面</h1>

<?php if(isset($_SESSION['message'])): ?>
   <p class="message"><?php print $_SESSION['message']; ?></p>
   <?php $_SESSION['message'] = NULL?>
<?php endif; ?>

<div>
   <div>
       <p>氏名:<?php print $result["name"]; ?></p>
       <p>メールアドレス:<?php print $result["mail"]; ?></p>
   </div>
</div>

<a href="member_edit.php">編集</a>
<a href="logout.php">ログアウト</a>

ログイン成功すると、下記画面が表示されます。

スクリーンショット 2019-10-14 15.15.06


ログアウト画面の実装

logout.phpを作成し下記記載します。

<?php
session_start();
// セッションクリア
session_destroy();

$_SESSION['message'] = "ログアウトしました。";
header('Location: login.php');
exit();
?>

<!doctype html>
<html>
<head>
<title>ログアウト画面</title>
</head>
<body>
<div><?php echo $error; ?></div>
<ul>
<li><a href="login.php">ログインページへ</a></li>
</ul>
</body>
</html>

会員情報画面より「ログアウト」をクリックするとログアウトされ、ログイン画面が表示されるようになります。


GitHubリポジトリ

今回作成したソースはGithubにて公開しています。下記リンクよりご確認ください。(L6ブランチです。)


読んでいただきありがとうございます。