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

php

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

PHPとCSVを使って自動ログイン機能を作る方法を紹介します。ログイン時に「ログイン状態を保持する」へチェックを入れると、Cookieへ保存したトークンを利用して次回アクセス時も自動でログインできるサンプルです。users.csv に保存された会員情報と照合し、セッションとCookieを組み合わせてログイン状態を管理します。毎回メールアドレスやパスワードを入力させたくない会員サイトや管理画面を作りたい場合に利用できます。

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

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

デモ

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

<?php
session_start();

$csv_file = __DIR__ . '/users.csv';

$email = $_COOKIE['saved_email'] ?? '';
$password = '';
$errors = [];

function read_users($csv_file){

    $users = [];

    if (!file_exists($csv_file)) {
        return $users;
    }

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

    if (!$fp) {
        return $users;
    }

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

        if (isset($row[0]) && $row[0] === 'id') {
            continue;
        }

        $users[] = [
            $row[0] ?? '',
            $row[1] ?? '',
            $row[2] ?? '',
            $row[3] ?? '',
            $row[4] ?? ''
        ];

    }

    fclose($fp);

    return $users;

}

function save_users($csv_file, $users){

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

    if (!$fp) {
        die('users.csvに書き込めません。');
    }

    fputcsv($fp, [
        'id',
        'name',
        'email',
        'password',
        'remember_token'
    ]);

    foreach ($users as $user) {
        fputcsv($fp, [
            $user[0],
            $user[1],
            $user[2],
            $user[3],
            $user[4]
        ]);
    }

    fclose($fp);

}

function login_session($user){

    $_SESSION['user_id'] = $user[0];
    $_SESSION['user_name'] = $user[1];

}

$users = read_users($csv_file);

if (!isset($_SESSION['user_id']) && !empty($_COOKIE['remember_token'])) {

    foreach ($users as $user) {

        if ($user[4] !== '' && hash_equals($user[4], $_COOKIE['remember_token'])) {
            login_session($user);
            break;
        }

    }

}

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

    foreach ($users as $index => $user) {

        if ($user[0] === ($_SESSION['user_id'] ?? '')) {
            $users[$index][4] = '';
            break;
        }

    }

    save_users($csv_file, $users);

    setcookie('remember_token', '', time() - 3600, '/');

    $_SESSION = [];
    session_destroy();

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

}

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

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

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

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

    if (empty($errors)) {

        foreach ($users as $index => $user) {

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

                login_session($user);

                if ($remember) {
                    $token = bin2hex(random_bytes(32));
                    $users[$index][4] = $token;

                    setcookie('remember_token', $token, time() + 60 * 60 * 24 * 30, '/');
                    setcookie('saved_email', $user[2], time() + 60 * 60 * 24 * 30, '/');
                } else {
                    $users[$index][4] = '';

                    setcookie('remember_token', '', time() - 3600, '/');
                    setcookie('saved_email', '', time() - 3600, '/');
                }

                save_users($csv_file, $users);

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

            }

        }

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

    }

}

?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>CSV自動ログイン機能</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;
}

.remember{
  display:flex;
  align-items:center;
  gap:8px;
  margin:14px 0;
}

.remember input{
  width:auto;
}

.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;
}

.sample{
  margin-top:16px;
  line-height:1.8;
  font-size:14px;
}
</style>

</head>
<body>

<div class="login-wrap">

  <div class="login-card">

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

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

    <form method="post">

      <div class="field">
        <label for="email">メールアドレス</label>
        <input
          type="email"
          id="email"
          name="email"
          value=<?= htmlspecialchars($email, ENT_QUOTES, 'UTF-8') ?>
          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 for="password">パスワード</label>
        <input
          type="password"
          id="password"
          name="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>

      <div class="remember">
        <input
          type="checkbox"
          id="remember"
          name="remember"
          value="1"
          <?= !empty($_COOKIE['saved_email']) ? 'checked' : '' ?>>
        <label for="remember">
          ログイン状態を保持する
        </label>
      </div>

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

      <div class="sample">
        サンプルログイン情報<br>
        メールアドレス:test@example.com<br>
        パスワード:password123
      </div>

    </form>

<?php else: ?>

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

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

<?php endif; ?>

  </div>

</div>

</body>
</html>

ファイル構成と設置方法

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

sample/
├─ index.php
└─ users.csv

サーバーへ設置する場合は、index.php と users.csv を同じフォルダ(同じ階層)へアップロードしてください。

このサンプルでは users.csv に会員情報と自動ログイン用トークンを保存します。ログイン時に「ログイン状態を保持する」へチェックを入れると Cookie と users.csv のトークンを照合して自動ログインを行います。

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


コメント