第3回ではログイン画面を作っていきます。
第1回を見ていない方は、わからないことが多いと思うので、以下のリンクから飛んで先に見ることをオススメします。
全体のコード(login.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
<?php /* データベース情報を取り込み */ require_once('common.php'); /* セッション開始 */ session_start(); /* POSTで送信されている */ if ($_SERVER['REQUEST_METHOD'] === 'POST') { /* usernameとpasswordが定義されて、かつ空白ではない */ if (isset($_POST['username'], $_POST['password']) && $_POST['username'] !== '' && $_POST['password'] !== '') { /* データベース接続 */ try { $dsn = 'mysql:dbname=' . DB_NAME . ';host=' . DB_HOST . ';charset=utf8mb4;port=8889'; $pdo = new PDO($dsn, DB_USER, DB_PASS); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); // エラーを出力できるように設定 } catch (PDOException $e) { //echo $e->getMessage(); $_SESSION['login_message'] = 'データベース接続に失敗しました'; header('Location:'.$_SERVER['PHP_SELF']); exit; } /* ユーザー認証 */ $stmt = $pdo->prepare('SELECT * FROM users WHERE username=? AND password=?'); $stmt->bindValue(1, $_POST['username']); $stmt->bindValue(2, $_POST['password']); $stmt->execute(); $result = $stmt->fetchAll(); if (count($result) === 1) { $_SESSION['login_message'] = $_POST['username'] . 'でログインしています'; $_SESSION['username'] = $_POST['username']; header('Location:'.$_SERVER['PHP_SELF']); exit; } } /* 正しくログインできなかった */ $_SESSION['login_message'] = '送信データが正しくありません'; header('Location:'.$_SERVER['PHP_SELF']); exit; } ?> <!DOCTYPE html> <html> <head> <title>ログイン</title> <meta charset="utf-8"> </head> <body> <h1>ログイン</h1> <form action"./" method="POST"> <?php if (isset($_SESSION['login_message'])) { echo($_SESSION['login_message']); } ?> <p> ユーザーネーム: <input type="text" name="username"> </p> <p> パスワード: <input type="password" name="password"> </p> <input type="submit" value="送信"> </form> <p><a href="/">トップに戻る</a></p> </body> </html> <?php /* セッションの初期化 */ $_SESSION['login_message'] = ''; ?> |
このコードを見ていただければわかると思うのですが、基本的にはregister.phpとかなり共通の部分があります。
regisrer.phpの詳しい解説については、
を見てください。
このコードを実行すると、以下のような画面になります。
ユーザーネームとパスワードを入力することで、そのアカウントでログインすることができます。
ログインに成功すると『○○でログインしています』と表示されます。
ログインに失敗すると『送信データが正しくありません』と表示されます。
コードの説明
HTMLのログインフォームから送信されたデータが空でないかをチェックし、データベースに接続するところまでは、第3回と同じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/* ユーザー認証 */ $stmt = $pdo->prepare('SELECT * FROM users WHERE username=? AND password=?'); $stmt->bindValue(1, $_POST['username']); $stmt->bindValue(2, $_POST['password']); $stmt->execute(); $result = $stmt->fetchAll(); if (count($result) === 1) { $_SESSION['login_message'] = $_POST['username'] . 'でログインしています'; $_SESSION['username'] = $_POST['username']; header('Location:'.$_SERVER['PHP_SELF']); exit; } |
この部分ではユーザー認証の処理をしています。
具体的には、ユーザーから入力されたユーザーネームとパスワードがあるレコードがusersテーブルに存在すればログインに成功する仕組みです。
usersテーブルのusernameはユニークなのであるユーザーネームのレコードは1つしか存在していません。(会員登録していなければ0つです)
そのレコードに対して、入力されたパスワードが正しければSELECT文でそのレコードを抽出することができるので、ログイン成功と見なしていいという理屈です。
本格的にログイン機能を実装しようとすると、パスワードをハッシュ化したりする必要があるのですが、ここでは簡単のためにその処理は行わないことにします。
ログインに成功すると、セッション変数にユーザーネームを格納して、ログイン済みだということを判断できるようにして、リダイレクトします。
全体のコード(logout.php)とその説明
続いてはログアウトの処理ですが、これはとっても簡単です。
1 2 3 4 5 6 7 8 |
<?php session_start(); session_destroy(); header('Location: ./'); exit; ?> |
このコードをlogout.phpとして保存するだけでログアウトを実現することができます。
ログインしているかどうかは、セッション変数にユーザーネームが格納されているかどうかで判別しているので、
1 2 3 |
session_destroy(); |
そのセッション変数を初期化すれば、未ログイン状態とすることができます。