【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>
下記画面が表示されます。
アドレス等で間違いがあるとエラーを表示します。
ユーザ情報画面の実装
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>
ログイン成功すると、下記画面が表示されます。
ログアウト画面の実装
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ブランチです。)
読んでいただきありがとうございます。