PHPでCSVを使ったログイン・ログアウト機能を作る方法【サンプルコード付き】

php

PHPでCSVを使ったログイン・ログアウト機能を作る方法

PHPとCSVを使ってログイン・ログアウト機能を作る方法を紹介します。users.csv に保存された会員情報を利用してログイン認証を行い、セッションでログイン状態を管理するサンプルです。パスワードは password_hash() で作成されたハッシュ値を保存している想定で、ログイン時は password_verify() を使って照合します。会員登録機能からログイン機能へつなげたい場合は、関連記事も参考にしてください。

関連記事:PHPでCSVを使った会員登録機能を作る方法【サンプルコード付き】

コードについて 本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。

デモ

コードをコピーして使おう!

<?php

session_start();

$csv_file = 'users.csv';

$email = '';
$password = '';

$errors = [];

if (isset($_POST['logout'])) {

    session_destroy();

    header('Location: '.$_SERVER['PHP_SELF']);
    exit;

}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['login'])) {

    $email = trim($_POST['email'] ?? '');
    $password = trim($_POST['password'] ?? '');

    if ($email === '') {
        $errors['email'] = 'メールアドレスを入力してください。';
    }

    if ($password === '') {
        $errors['password'] = 'パスワードを入力してください。';
    }

    if (empty($errors)) {

        if (file_exists($csv_file)) {

            $fp = fopen($csv_file, 'r');

            while (($row = fgetcsv($fp)) !== false) {

                if (
                    isset($row[2], $row[3]) &&
                    strtolower($row[2]) === strtolower($email) &&
                    password_verify($password, $row[3])
                ) {

                    $_SESSION['user_name'] = $row[1];

                    fclose($fp);

                    header('Location: '.$_SERVER['PHP_SELF']);
                    exit;

                }

            }

            fclose($fp);

        }

        $errors['password'] = 'メールアドレスまたはパスワードが正しくありません。';

    }

}

?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ログイン機能</title>

<style>

body{
  margin:0;
  padding:30px;
  font-family:sans-serif;
  background:#fff;
}

.login-wrap{
  border:1px solid #e5e7eb;
  border-radius:20px;
  padding:24px;
  background:#fff;
}

.login-card{
  max-width:520px;
  margin:0 auto;
  padding:24px;
  border:1px solid #e5e7eb;
  border-radius:18px;
  background:#f8fafc;
}

.login-title{
  font-size:22px;
  font-weight:700;
  margin-bottom:20px;
}

.field{
  display:flex;
  flex-direction:column;
  gap:6px;
  margin-bottom:14px;
}

label{
  font-weight:700;
}

input{
  width:100%;
  box-sizing:border-box;
  padding:12px;
  border:1px solid #d1d5db;
  border-radius:10px;
}

.input-error{
  border-color:#dc2626;
  background:#fef2f2;
}

.field-error{
  color:#dc2626;
  font-size:13px;
  font-weight:700;
}

.btn{
  width:100%;
  height:46px;
  border:none;
  border-radius:10px;
  background:#0b6bff;
  color:#fff;
  font-weight:700;
  cursor:pointer;
}

.logout-btn{
  background:#64748b;
  margin-top:12px;
}

.success{
  margin-top:16px;
  padding:14px;
  border-radius:12px;
  border:1px solid #e5e7eb;
  background:#fff;
  color:#15803d;
  font-weight:700;
}

</style>

</head>
<body>

<div class="login-wrap">

  <div class="login-card">

    <div class="login-title">
      ログインフォーム
    </div>

<?php if (!isset($_SESSION['user_name'])): ?>

    <form method="post">

      <div class="field">

        <label>メールアドレス</label>

        <input
          type="email"
          name="email"
          value="<?= htmlspecialchars($email, ENT_QUOTES, 'UTF-8') ?>"
          autocomplete="email"
          class="<?= isset($errors['email']) ? 'input-error' : '' ?>">

        <?php if(isset($errors['email'])): ?>
        <div class="field-error">
          <?= htmlspecialchars($errors['email'], ENT_QUOTES, 'UTF-8') ?>
        </div>
        <?php endif; ?>

      </div>

      <div class="field">

        <label>パスワード</label>

        <input
          type="password"
          name="password"
          autocomplete="current-password"
          class="<?= isset($errors['password']) ? 'input-error' : '' ?>">

        <?php if(isset($errors['password'])): ?>
        <div class="field-error">
          <?= htmlspecialchars($errors['password'], ENT_QUOTES, 'UTF-8') ?>
        </div>
        <?php endif; ?>

      </div>

      <button
        type="submit"
        name="login"
        class="btn">
        ログイン
      </button>

    </form>

    <div style="margin-top:16px;line-height:1.8;">
      サンプルログイン情報<br>
      メールアドレス:test@example.com<br>
      パスワード:password123
    </div>

<?php else: ?>

    <div class="success">
      <?= htmlspecialchars($_SESSION['user_name'], ENT_QUOTES, 'UTF-8') ?>
      さんでログイン中です。
    </div>

    <form method="post">

      <button
        type="submit"
        name="logout"
        class="btn logout-btn">
        ログアウト
      </button>

    </form>

<?php endif; ?>

  </div>

</div>

</body>
</html>

ファイル構成と設置方法

このサンプルで使用するファイル構成です。
下記のファイルを同じフォルダ(同じ階層)へ配置してください。

*****/
├─ *****.php
└─ *****.csv

サーバーへ設置する場合は、上記ファイルを同じフォルダ(同じ階層)へアップロードしてください。

別フォルダへ配置する場合は、コード内で指定しているファイルパスを環境に合わせて変更してください。

PHPはサーバー上で実行されるため、PHPファイルをダブルクリックしても動作しません。動作確認はレンタルサーバーへアップロードするか、PHPが利用できるローカル環境で行ってください。


コメント