PHPでCSV登録フォームを作る方法【サンプルコード付き】

php

PHPでCSV登録フォームを作る方法

PHPでCSVファイルへデータを登録するフォームを作る方法を紹介します。フォームへ入力した名前やカテゴリー、メールアドレスをCSVファイルへ保存できます。データベースを使わずに簡単な登録機能を作りたい場合や、顧客情報・問い合わせ情報・商品情報などをCSVで管理したい場合に使えるサンプルコードです。

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

デモ

登録が完了しました。
名前 カテゴリー メールアドレス
山田 太郎 営業 taro@example.com
佐藤 花子 企画 hanako@example.com

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

<?php

$message = '';
$csv_file = __DIR__ . '/data.csv';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

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

    if (
        $name !== '' &&
        $category !== '' &&
        $email !== ''
    ) {

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

        if ($fp !== false) {

            flock($fp, LOCK_EX);

            fputcsv($fp, [
                $name,
                $category,
                $email
            ]);

            flock($fp, LOCK_UN);
            fclose($fp);

            header('Location: ' . $_SERVER['PHP_SELF'] . '?saved=1');
            exit;

        }

    }

}

if (isset($_GET['saved'])) {
    $message = '登録が完了しました。';
}

$rows = [];

if (file_exists($csv_file)) {

    if (($fp = fopen($csv_file, 'r')) !== false) {

        while (($data = fgetcsv($fp)) !== false) {
            $rows[] = $data;
        }

        fclose($fp);

    }

}

?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>CSV登録フォーム</title>

<style>

body{
    font-family:sans-serif;
    margin:20px;
}

.form-wrap{
    max-width:700px;
    border:1px solid #e5e7eb;
    border-radius:20px;
    padding:24px;
    margin-bottom:24px;
}

.form-group{
    margin-bottom:16px;
}

label{
    display:block;
    margin-bottom:6px;
    font-weight:700;
}

input,
select{
    width:100%;
    padding:14px 16px;
    border:1px solid #d1d5db;
    border-radius:10px;
    font-size:16px;
    box-sizing:border-box;
}

.submit-btn{
    border:none;
    background:#ff6a00;
    color:#fff;
    padding:14px 24px;
    border-radius:10px;
    font-size:16px;
    font-weight:700;
    cursor:pointer;
}

.success{
    margin-top:16px;
    padding:12px 16px;
    background:#ecfdf5;
    border:1px solid #86efac;
    border-radius:10px;
}

.table-wrap{
    border:1px solid #e5e7eb;
    border-radius:20px;
    overflow:hidden;
}

table{
    width:100%;
    border-collapse:collapse;
}

th{
    background:#f7f2e5;
}

th,
td{
    padding:16px;
    text-align:left;
    border-bottom:1px solid #e5e7eb;
}

.success{
    margin-top:16px;
    padding:12px 16px;
    background:#ecfdf5;
    border:1px solid #86efac;
    border-radius:10px;
    animation:hideMessage 3s forwards;
}

@keyframes hideMessage{
    0%{
        opacity:1;
    }
    80%{
        opacity:1;
    }
    100%{
        opacity:0;
        visibility:hidden;
        height:0;
        margin:0;
        padding:0;
        border:0;
        overflow:hidden;
    }
}

</style>

</head>
<body>

<div class="form-wrap">

    <form method="post">

        <div class="form-group">
            <label>名前</label>
            <input type="text" name="name" required>
        </div>

        <div class="form-group">
            <label>カテゴリー</label>

            <select name="category" required>
                <option value="">選択してください</option>
                <option value="営業">営業</option>
                <option value="企画">企画</option>
                <option value="開発">開発</option>
                <option value="デザイン">デザイン</option>
            </select>
        </div>

        <div class="form-group">
            <label>メールアドレス</label>
            <input type="email" name="email" required>
        </div>

        <button type="submit" class="submit-btn">
            登録
        </button>

    </form>

    <?php if ($message): ?>

    <div class="success">
        <?= htmlspecialchars($message, ENT_QUOTES, 'UTF-8') ?>
    </div>

    <?php endif; ?>

</div>

<div class="table-wrap">

<table>

    <tr>
        <th>名前</th>
        <th>カテゴリー</th>
        <th>メールアドレス</th>
    </tr>

    <?php foreach ($rows as $row): ?>

    <tr>
        <td><?= htmlspecialchars($row[0] ?? '', ENT_QUOTES, 'UTF-8') ?></td>
        <td><?= htmlspecialchars($row[1] ?? '', ENT_QUOTES, 'UTF-8') ?></td>
        <td><?= htmlspecialchars($row[2] ?? '', ENT_QUOTES, 'UTF-8') ?></td>
    </tr>

    <?php endforeach; ?>

</table>

</div>

</body>
</html>

ファイル構成と設置方法

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

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

index.php がCSV登録フォーム本体です。
data.csv は登録データを保存するCSVファイルです。あらかじめ空のCSVファイルを作成しておいてください。

サーバーへ設置する場合は、上記ファイルを同じフォルダ(同じ階層)へアップロードしてください。別フォルダへ配置する場合は、コード内のCSVパスを変更してください。

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


コメント