本日はPHPでログイン機能を実装する方法を説明します。

前提条件

  • パソコンでPHPが動く環境であること
  • プログラミングに興味があること

データベースの設計

ログイン情報を保存するためのデータベースを設計します。通常は、ユーザーの情報を保存するusersテーブルを作成します。このテーブルには、ユーザー名、パスワード(ハッシュ化されたもの)、およびその他の任意の情報が含まれる場合があります。

usersテーブル

このテーブルには、ユーザーの情報が保存されます。一般的なカラムは以下の通りですが、必要に応じて他の情報も保存することができます。

  • id: ユーザーを一意に識別するためのID。一般的には自動インクリメントされる主キーとして設定されます。
  • username: ユーザー名。ユーザーのログインに使用されます。一意である必要があります。
  • password: パスワード。セキュリティ上、ハッシュ化されて保存されるべきです。
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(100),
    full_name VARCHAR(100),
    registration_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

上記の例では、ユーザー名は最大50文字まで、パスワードは最大255文字まで、メールアドレスは最大100文字まで、フルネームは最大100文字までのデータを保存できるようになっています。

sessionsテーブル

セッションの管理に使用するためのテーブルです。セッションIDとユーザーID、有効期限などの情報を保存します。セッションの管理には、データベースの代わりにファイルシステムやメモリなどの別の方法もあります。

CREATE TABLE sessions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    session_id VARCHAR(100) NOT NULL,
    user_id INT NOT NULL,
    expire_time TIMESTAMP NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

上記の例では、セッションIDは最大100文字まで、有効期限はタイムスタンプ形式で保存されます。

これらのテーブルを使用することで、ユーザー情報を保存し、ログイン機能を実装する準備が整います。ただし、本来はセキュリティを重視するために、パスワードのハッシュ化やSQLインジェクション対策などのセキュリティ対策を施す必要がありますが今回は省きます。

HTMLフォームの作成

ユーザーがログインするためのHTMLフォームを作成します。このフォームには、ユーザー名とパスワードの入力フィールドが含まれます。

実際の運用では、IDやパスワードを忘れた場合のリンクなども用意する必要があります。
でないとIDやパスワードを忘れた場合、一生ログインできなくなります(笑)

また未だ会員でない方の新規登録機能も必要ですね!

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

ログイン処理の作成

PHPでログイン処理を実装します。まず、データベースに接続し、ユーザーが送信したユーザー名とパスワードを検証します。

<?php
// データベースに接続するための情報
$servername = "localhost";
$username = "ユーザー名";
$password = "パスワード";
$dbname = "データベース名";

// データベースに接続
$conn = new mysqli($servername, $username, $password, $dbname);

// 接続を確認
if ($conn->connect_error) {
    die("データベースに接続できません: " . $conn->connect_error);
}

// POSTリクエストからユーザー名とパスワードを取得
$username = $_POST['username'];
$password = $_POST['password'];

// パスワードをハッシュ化する(データベースにはハッシュ化されたパスワードが保存されるべき)
$hashed_password = hash('sha256', $password);

// データベースからユーザーを検索
$sql = "SELECT * FROM users WHERE username='$username' AND password='$hashed_password'";
$result = $conn->query($sql);

// 検索結果をチェックし、ログインを許可するかどうかを決定する
if ($result->num_rows == 1) {
    // ログイン成功
    session_start();
    $_SESSION['username'] = $username;
    echo "ログイン成功!";
} else {
    // ログイン失敗
    echo "ユーザー名またはパスワードが間違っています。";
}

// データベース接続を閉じる
$conn->close();
?>

セッションの管理

ログインが成功した場合、セッションを開始し、ユーザー名などの必要な情報を保存します。これにより、ユーザーが他のページに移動してもログイン状態が維持されます。

セッションの開始

ログイン処理のコードに実装されていますが、下記の箇所がセッション開始のコードです。

<?php
session_start(); // セッションを開始

// ユーザーがログインに成功した場合の処理
$_SESSION['username'] = $username; // ユーザー名などの情報をセッションに保存
?>

ページの各部分で、ユーザーがログインしているかどうかを確認する場合は下記になります。

<?php
session_start(); // セッションを開始

// ユーザーがログインしているかどうかを確認
if(isset($_SESSION['username'])) {
    // ログインしている場合の処理
} else {
    // ログインしていない場合の処理
}
?>

ログアウト機能の実装

ユーザーがログアウトするための機能も提供します。これはセッションを破棄することで実現できます。

<?php
session_start(); // セッションを開始

// セッションを破棄してログアウト
session_destroy();

// 他の必要なログアウト処理(任意)
?>

まとめ

これらの手順に従うことで、PHPでログイン機能を実装することができます。ただし、セキュリティ上の考慮事項にも留意する必要があります。例えば、パスワードの安全な保存(ハッシュ化とソルト化)、SQLインジェクションの防止、セッションハイジャックの対策などが挙げられます。

こういう機能を実装する場合、どう書けば良いのなど是非、コメントでください!

Follow me!