PHPでCSVを使った会員専用ページを作る方法【サンプルコード付き】

php

PHPでCSVを使った会員専用ページを作る方法

PHPでCSVを使った会員専用ページを作る方法を紹介します。CSVに登録されたユーザー情報を使ってログイン認証を行い、ログインしているユーザーだけが閲覧できるページを作成するサンプルです。データベースを使わずに、簡単な会員向けページや限定ページを作りたい場合に使えます。

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

デモ

会員専用ページ
このページは会員限定です。
ログインすると閲覧できます。
サンプルログイン情報
メールアドレス:test@example.com
パスワード:password123

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

<?php
session_start();

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

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] ?? ''
        ];

    }

    fclose($fp);

    return $users;

}

function login_user($user){

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

}

$users = read_users($csv_file);

$email = '';
$password = '';
$errors = [];

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

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

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

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

    if (empty($errors)) {

        foreach ($users as $user) {

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

                login_user($user);

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

            }

        }

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

    }

}

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

    $_SESSION = [];
    session_destroy();

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

}

?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>会員専用ページ</title>

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

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

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

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

.member-info{
  padding:14px;
  border:1px solid #e5e7eb;
  border-radius:12px;
  background:#fff;
  margin-bottom:14px;
}

.member-name{
  font-size:18px;
  font-weight:700;
  margin-bottom:6px;
}

.member-mail{
  color:#475569;
  font-size:14px;
}

.secret-box{
  padding:14px;
  border-radius:12px;
  background:#dbeafe;
  border:1px solid #93c5fd;
  color:#1e3a8a;
  font-weight:700;
  margin-bottom:14px;
}

.guest-box{
  padding:14px;
  border-radius:12px;
  background:#fef2f2;
  border:1px solid #fecaca;
  color:#991b1b;
  font-weight:700;
  margin-bottom:14px;
}

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

.logout-btn{
  background:#64748b;
}

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

</head>
<body>

<div class="member-wrap">

  <div class="member-card">

    <div class="member-title">
      会員専用ページ
    </div>

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

    <div class="guest-box">
      このページは会員限定です。<br>
      ログインすると閲覧できます。
    </div>

    <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>

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

    </form>

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

<?php else: ?>

    <div class="member-info">

      <div class="member-name">
        <?= htmlspecialchars($_SESSION['user_name'], ENT_QUOTES, 'UTF-8') ?>
      </div>

      <div class="member-mail">
        <?= htmlspecialchars($_SESSION['user_email'], ENT_QUOTES, 'UTF-8') ?>
      </div>

    </div>

    <div class="secret-box">
      会員専用コンテンツです。<br>
      ログインしているユーザーだけが閲覧できます。
    </div>

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

<?php endif; ?>

  </div>

</div>

</body>
</html>

ファイル構成と設置方法

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

member-page/
├─ index.php
└─ users.csv

index.php が会員専用ページ本体です。
users.csv に登録されている会員情報を利用してログイン認証を行います。

users.csv のパスワードは平文ではなく password_hash() で生成したハッシュ値を保存してください。

サーバーへ設置する場合は、上記ファイルを同じフォルダ(同じ階層)へアップロードしてください。別フォルダへ配置する場合は、コード内の設定変更が必要になる場合があります。

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


コメント