PHPでCSV検索+ページネーションを作る方法【サンプルコード付き】

php

PHPでCSV検索+ページネーションを作る方法

PHPでCSVファイルを検索し、検索結果をページごとに分割して表示する方法を紹介します。CSVデータが増えて一覧が長くなった場合でも、ページネーションを利用することで見やすく表示できます。データベースを使わずにCSVだけで検索機能とページ送り機能を実装したい場合に使えるサンプルコードです。

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

デモ

ID 名前 カテゴリー メールアドレス

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

<?php

$keyword = $_GET['keyword'] ?? '';
$page = max(1, (int)($_GET['page'] ?? 1));
$per_page = 5;
$all_rows = [];

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

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

        if (
            $keyword === '' ||
            stripos(implode(' ', $data), $keyword) !== false
        ) {
            $all_rows[] = $data;
        }

    }

    fclose($fp);

}

$total = count($all_rows);
$total_pages = max(1, ceil($total / $per_page));
$page = min($page, $total_pages);
$start = ($page - 1) * $per_page;
$rows = array_slice($all_rows, $start, $per_page);

?>

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

.search-form{
    display:flex;
    gap:12px;
    margin-bottom:24px;
}

.search-input{
    flex:1;
    padding:14px 16px;
    border:1px solid #d1d5db;
    border-radius:10px;
    font-size:16px;
}

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

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

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

th{
    background:#f7f2e5;
}

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

.pagination{
    display:flex;
    gap:8px;
    flex-wrap:wrap;
}

.page-link{
    display:inline-block;
    border:1px solid #d1d5db;
    background:#fff;
    padding:8px 14px;
    border-radius:8px;
    color:#0f172a;
    text-decoration:none;
}

.page-link.active{
    background:#0b6bff;
    border-color:#0b6bff;
    color:#fff;
}
</style>

<form method="get" class="search-form">

    <input
        type="text"
        name="keyword"
        class="search-input"
        value="<?= htmlspecialchars($keyword, ENT_QUOTES, 'UTF-8') ?>"
        placeholder="検索キーワードを入力">

    <button type="submit" class="search-btn">
        検索
    </button>

</form>

<div class="table-wrap">

<table>

    <tr>
        <th>ID</th>
        <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>
        <td><?= htmlspecialchars($row[3], ENT_QUOTES, 'UTF-8') ?></td>
    </tr>

    <?php endforeach; ?>

</table>

</div>

<?php if ($total_pages > 1): ?>

<div class="pagination">

    <?php for ($i = 1; $i <= $total_pages; $i++): ?>

        <a
            class="page-link <?= $i === $page ? 'active' : '' ?>"
            href="?keyword=<?= urlencode($keyword) ?>&page=<?= $i ?>">
            <?= $i ?>
        </a>

    <?php endfor; ?>

    <?php if ($page < $total_pages): ?>

        <a
            class="page-link"
            href="?keyword=<?= urlencode($keyword) ?>&page=<?= $page + 1 ?>">
            次へ
        </a>

    <?php endif; ?>

</div>

<?php endif; ?>

ファイル構成と設置方法

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

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

index.php にPHPコードを保存し、data.csv に検索対象データを保存してください。

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

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


コメント