PHPでCSVを使った会員専用ページを作る方法
PHPでCSVを使った会員専用ページを作る方法を紹介します。CSVに登録されたユーザー情報を使ってログイン認証を行い、ログインしているユーザーだけが閲覧できるページを作成するサンプルです。データベースを使わずに、簡単な会員向けページや限定ページを作りたい場合に使えます。
コードについて
本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
会員専用ページ
このページは会員限定です。
ログインすると閲覧できます。
ログインすると閲覧できます。
サンプルログイン情報
メールアドレス:test@example.com
パスワード:password123
メールアドレス: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が利用できるローカル環境で行ってください。
コメント