PHPでCSVコメント機能を作る方法【サンプルコード付き】

php

PHPでCSVコメント機能を作る方法

PHPでCSVコメント機能を作る方法を紹介します。このサンプルでは、名前とコメントを入力してCSVファイルへ保存し、投稿済みのコメントを一覧表示できます。コメントは投稿日時とともにCSVファイルへ追記されるため、ページを再読み込みしても内容が保持されます。簡易掲示板やレビュー機能、お問い合わせ履歴などを作成したい場合に利用できます。

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

デモ

CSVコメント機能
山田
2026-06-11 22:15:30
とても参考になりました。
佐藤
2026-06-11 21:48:05
コピペで動作しました。

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

<?php

// コメントを保存するCSVファイル名です
$csv_file = 'data.csv';

$message = '';

// HTMLエスケープ用の関数です
function h($value) {
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}

// フォーム送信時の処理です
if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    // 入力内容を取得します
    $name = trim($_POST['name'] ?? '');
    $comment = trim($_POST['comment'] ?? '');

    // 入力チェックを行います
    if ($name === '' || $comment === '') {

        $message = '名前とコメントを入力してください。';

    } else {

        // CSVファイルへコメントを追記します
        $fp = fopen($csv_file, 'a');

        if ($fp) {

            fputcsv($fp, [
                date('Y-m-d H:i:s'),
                $name,
                $comment
            ]);

            fclose($fp);

            // 二重送信を防ぐためにリダイレクトします
            header('Location: index.php');
            exit;

        } else {

            $message = 'コメントの保存に失敗しました。';

        }

    }

}

// コメント一覧を読み込みます
$comments = [];

if (file_exists($csv_file)) {

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

    if ($fp) {

        // 1行目の見出しを読み飛ばします
        fgetcsv($fp);

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

            if (count($data) >= 3) {
                $comments[] = [
                    'datetime' => $data[0],
                    'name' => $data[1],
                    'comment' => $data[2]
                ];
            }

        }

        fclose($fp);

    }

}

// 新しいコメントを上に表示します
$comments = array_reverse($comments);

?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>CSVコメント機能</title>

<style>
body{
    font-family:sans-serif;
    background:#f8fafc;
    margin:40px;
}

.php-csv-comment_wrap{
    max-width:800px;
    margin:0 auto;
    padding:24px;
    border:1px solid #e5e7eb;
    border-radius:18px;
    background:#ffffff;
}

.php-csv-comment_title{
    font-size:22px;
    font-weight:bold;
    margin-bottom:20px;
}

.php-csv-comment_input,
.php-csv-comment_textarea{
    width:100%;
    box-sizing:border-box;
    padding:10px;
    margin-bottom:12px;
    border:1px solid #d1d5db;
    border-radius:8px;
    font-size:16px;
}

.php-csv-comment_textarea{
    height:120px;
    resize:none;
}

.php-csv-comment_button{
    padding:10px 24px;
    border:none;
    border-radius:8px;
    background:#0b6bff;
    color:#ffffff;
    font-weight:bold;
    cursor:pointer;
    margin-bottom:24px;
}

.php-csv-comment_message{
    padding:12px;
    margin-bottom:16px;
    border:1px solid #fecaca;
    border-radius:10px;
    background:#fef2f2;
    color:#b91c1c;
}

.php-csv-comment_item{
    padding:16px;
    margin-top:12px;
    background:#ffffff;
    border:1px solid #d1d5db;
    border-radius:10px;
}

.php-csv-comment_name{
    font-weight:bold;
    margin-bottom:4px;
}

.php-csv-comment_date{
    font-size:13px;
    color:#6b7280;
    margin-bottom:8px;
}

.php-csv-comment_empty{
    padding:16px;
    background:#f8fafc;
    border:1px solid #d1d5db;
    border-radius:10px;
}
</style>

</head>
<body>

<div class="php-csv-comment_wrap">

    <div class="php-csv-comment_title">
        CSVコメント機能
    </div>

    <?php if ($message !== ''): ?>
        <div class="php-csv-comment_message">
            <?= h($message) ?>
        </div>
    <?php endif; ?>

    <form method="post">

        <input
            class="php-csv-comment_input"
            type="text"
            name="name"
            placeholder="名前"
        >

        <textarea
            class="php-csv-comment_textarea"
            name="comment"
            placeholder="コメントを入力してください"
        ></textarea>

        <button class="php-csv-comment_button" type="submit">
            投稿
        </button>

    </form>

    <?php if (!empty($comments)): ?>

        <?php foreach ($comments as $comment): ?>

            <div class="php-csv-comment_item">

                <div class="php-csv-comment_name">
                    <?= h($comment['name']) ?>
                </div>

                <div class="php-csv-comment_date">
                    <?= h($comment['datetime']) ?>
                </div>

                <div>
                    <?= nl2br(h($comment['comment'])) ?>
                </div>

            </div>

        <?php endforeach; ?>

    <?php else: ?>

        <div class="php-csv-comment_empty">
            まだコメントはありません。
        </div>

    <?php endif; ?>

</div>

</body>
</html>

ファイル構成と設置方法

このサンプルでは、index.phpdata.csv を同じフォルダに配置して使用します。投稿された名前・コメント・投稿日時は data.csv に追記保存されます。

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

index.phpdata.csv をサーバーへアップロードし、ブラウザから index.php にアクセスしてください。名前とコメントを入力して投稿すると、内容が data.csv に保存され、コメント一覧に新しい順で表示されます。


コメント