PHPでCSV追記アップロード機能を作る方法【サンプルコード付き】

php

PHPでCSV追記アップロード機能を作る方法

PHPでCSV追記アップロード機能を作る方法を紹介します。CSVファイルをアップロードすると、既存のCSVデータを残したまま新しいデータを末尾へ追加できます。顧客リストや商品一覧などのデータを蓄積したい場合に便利なサンプルコードです。データベースを使わずにCSVファイルだけで管理したい場合にも利用できます。

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

デモ

CSVファイルを追記アップロードしました。
名前 カテゴリー メールアドレス
山田 太郎 営業 taro@example.com
佐藤 花子 企画 hanako@example.com

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

<?php

$message = '';

if (
    $_SERVER['REQUEST_METHOD'] === 'POST' &&
    isset($_FILES['csv_file'])
) {

    $file = $_FILES['csv_file'];

    if (
        $file['error'] === 0 &&
        strtolower(
            pathinfo(
                $file['name'],
                PATHINFO_EXTENSION
            )
        ) === 'csv'
    ) {

        $fp = fopen(
            $file['tmp_name'],
            'r'
        );

        $appendFp = fopen(
            'data.csv',
            'a'
        );

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

            fputcsv(
                $appendFp,
                $row
            );

        }

        fclose($fp);
        fclose($appendFp);

        $message =
            'CSVファイルを追記アップロードしました。';

    }

}

$rows = [];

if (file_exists('data.csv')) {

    if (($fp = fopen('data.csv', 'r')) !== false) {

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

        fclose($fp);

    }

}

?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>CSV追記アップロード</title>

<style>

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

.upload-wrap{
    border:1px solid #e5e7eb;
    border-radius:20px;
    padding:24px;
    margin-bottom:24px;
}

.note{
    margin:0 0 16px;
    line-height:1.8;
    color:#374151;
}

.file-input{
    width:100%;
    margin-bottom:16px;
}

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

</style>

</head>
<body>

<div class="upload-wrap">

    <p class="note">
        ※このサンプルは追記保存です。アップロードしたCSVデータを既存の data.csv の末尾へ追加します。
    </p>

    <form
        method="post"
        enctype="multipart/form-data">

        <input
            type="file"
            name="csv_file"
            accept=".csv"
            class="file-input"
            required>

        <button
            type="submit"
            class="upload-btn">
            CSVを追記アップロード
        </button>

    </form>

    <?php if ($message): ?>

    <div
        class="success"
        id="successMessage">

        <?=
        htmlspecialchars(
            $message,
            ENT_QUOTES,
            'UTF-8'
        )
        ?>

    </div>

    <script>
    setTimeout(function(){

        const msg =
            document.getElementById(
                'successMessage'
            );

        if(msg){
            msg.style.display='none';
        }

    },3000);
    </script>

    <?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 と data.csv を同じフォルダ(同じ階層)へアップロードしてください。

このサンプルは追記保存です。アップロードしたCSVファイルの内容を既存の data.csv の末尾へ追加します。既存データは削除されず、そのまま保持されます。

同じデータを複数回アップロードすると重複して追加されるため、必要に応じて事前にCSV内容を確認してください。

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


コメント