【PHP】ログイン機能を実装する方法

【PHP】ログイン機能を実装する方法 PHP

Webサイトで会員制のページや管理画面を構築する際に欠かせないのが「ログイン機能」です。本記事では、PHPとMySQLを用いた基本的なログイン機能の実装方法をステップごとに解説します。

データベーステーブルの作成

まずはユーザー情報を保存するためのテーブルを作成します。passwordカラムは、ハッシュ化されたパスワードを格納するために使用します。

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL UNIQUE,
  password VARCHAR(255) NOT NULL
);

ユーザー登録処理

ユーザー登録時には、パスワードをそのまま保存せず、password_hash()関数でハッシュ化して安全に保存します。

<?php
$username = $_POST['username'];
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);

$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'dbuser', 'dbpass');
$stmt = $pdo->prepare('INSERT INTO users (username, password) VALUES (?, ?)');
$stmt->execute([$username, $password]);
?>

ログインフォームの作成

ユーザーがログイン情報を入力するためのフォームをHTMLで用意します。

<form method="post" action="login.php">
  <input type="text" name="username" placeholder="ユーザー名" required>
  <input type="password" name="password" placeholder="パスワード" required>
  <button type="submit">ログイン</button>
</form>

ログイン処理の実装

ログイン処理では、データベースからユーザーを取得し、password_verify()で入力パスワードと照合します。

<?php
session_start();

$username = $_POST['username'];
$password = $_POST['password'];

$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'dbuser', 'dbpass');
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = ?');
$stmt->execute([$username]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user && password_verify($password, $user['password'])) {
    $_SESSION['user_id'] = $user['id'];
    header('Location: dashboard.php');
    exit;
} else {
    echo 'ユーザー名またはパスワードが間違っています。';
}
?>

ログイン後ページの保護

ログイン済みかどうかをセッションで判定し、未ログインの場合はログインページへリダイレクトします。

<?php
session_start();
if (!isset($_SESSION['user_id'])) {
    header('Location: login_form.html');
    exit;
}

echo 'ようこそ、ログインユーザーさん!';
?>

ログアウト処理

セッションを破棄することで、ログアウト処理を実装します。

<?php
session_start();
session_unset();
session_destroy();
header('Location: login_form.html');
exit;
?>

まとめ

本記事では、PHPとMySQLを用いて基本的なログイン機能を構築する方法を紹介しました。実運用する際は以下のような追加対策も検討してください。

  • 入力バリデーション
  • CSRF対策
  • SQLインジェクション対策(プリペアドステートメントの使用)
  • セッションハイジャック対策
  • ログイン保持(Remember me)機能の実装

安全性を意識した設計で、ユーザーの信頼を得られるログイン機能を構築していきましょう。