CSV検索フォーム付きページネーションを作る方法【PHP/HTML/CSS・サンプルコード付き】

ページネーション

CSV検索フォーム付きページネーションを作る方法

CSV検索フォーム付きページネーションを作る方法を紹介します。CSVファイルに保存した社員データをPHPで読み込み、検索フォームからキーワード検索を行い、一致したデータだけをページネーション付きで一覧表示するサンプルです。検索結果が多い場合でも、1ページごとに見やすく整理しながら表示できます。

このサンプルでは、氏名・部署・役職・出身地などのCSVデータを対象に検索を行い、検索条件に一致したデータだけを抽出します。その後、検索結果を1ページ10件ずつ表示するため、検索件数が多くなっても見やすい一覧画面を維持できます。また、ページ移動後も検索条件を引き継ぐため、再検索することなく結果を確認できます。

社員管理、顧客管理、商品一覧など、CSVで管理しているデータを検索しながら閲覧したい場面におすすめです。CSVだけで検索機能とページネーションを実装できるため、データベースを使用しないシンプルな管理ツールや社内システムにも導入しやすく、検索対象や表示件数はコード内で自由にカスタマイズできます。

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

デモ

社員一覧

100件中 1〜10件を表示

社員番号 氏名 部署 役職 出身地

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

<?php

// CSVファイル名
$csv_file = 'data.csv';

// 1ページに表示する件数
$per_page = 10;

// 検索キーワードを取得
$keyword = isset($_GET['keyword']) ? trim($_GET['keyword']) : '';

// 現在のページ番号を取得
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;

// ページ番号が1未満の場合は1に戻す
if ($page < 1) {
    $page = 1;
}

// 社員データを入れる配列
$employees = [];

// CSVファイルを開く
if (($handle = fopen($csv_file, 'r')) !== false) {

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

    // CSVを1行ずつ読み込む
    while (($row = fgetcsv($handle)) !== false) {

        // 検索キーワードが空の場合は全件追加
        if ($keyword === '') {
            $employees[] = $row;
            continue;
        }

        // 1行分のデータを文字列にまとめる
        $search_text = implode(' ', $row);

        // キーワードを含む行だけ追加
        if (mb_stripos($search_text, $keyword, 0, 'UTF-8') !== false) {
            $employees[] = $row;
        }
    }

    // CSVファイルを閉じる
    fclose($handle);
}

// 総件数
$total_count = count($employees);

// 総ページ数
$total_pages = (int)ceil($total_count / $per_page);

// データがない場合でもページ番号を1にする
if ($total_pages < 1) {
    $total_pages = 1;
}

// 現在ページが総ページ数を超えた場合は最後のページへ戻す
if ($page > $total_pages) {
    $page = $total_pages;
}

// 表示開始位置
$offset = ($page - 1) * $per_page;

// 現在のページに表示するデータだけ取得
$page_employees = array_slice($employees, $offset, $per_page);

?>
<!DOCTYPE html>
<html lang="ja">
<head>

  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>CSV検索フォーム付きページネーション</title>
  <link rel="stylesheet" href="style.css">

</head>
<body>

  <div class="csv-pagination-search_wrap">

    <h1 class="csv-pagination-search_title">社員一覧</h1>

    <form class="csv-pagination-search_form" method="get">

      <input
        class="csv-pagination-search_input"
        type="search"
        name="keyword"
        value="<?= htmlspecialchars($keyword, ENT_QUOTES, 'UTF-8') ?>"
        placeholder="氏名・部署・役職・出身地で検索"
      >

      <button class="csv-pagination-search_button" type="submit">検索</button>

    </form>

    <p class="csv-pagination-search_count">
      <?= $total_count ?>件のデータが見つかりました
    </p>

    <div class="csv-pagination-search_table-wrap">

      <table class="csv-pagination-search_table">

        <thead>
          <tr>
            <th>社員番号</th>
            <th>氏名</th>
            <th>部署</th>
            <th>役職</th>
            <th>出身地</th>
          </tr>
        </thead>

        <tbody>

          <?php if (count($page_employees) > 0): ?>

            <?php foreach ($page_employees as $employee): ?>

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

            <?php endforeach; ?>

          <?php else: ?>

            <tr>
              <td class="csv-pagination-search_empty" colspan="5">該当するデータがありません</td>
            </tr>

          <?php endif; ?>

        </tbody>

      </table>

    </div>

    <nav class="csv-pagination-search_nav" aria-label="ページネーション">

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

        <?php if ($i === $page): ?>

          <span class="csv-pagination-search_current"><?= $i ?></span>

        <?php else: ?>

          <a href="?keyword=<?= urlencode($keyword) ?>&page=<?= $i ?>"><?= $i ?></a>

        <?php endif; ?>

      <?php endfor; ?>

    </nav>

  </div>

</body>
</html>

ファイル構成と設置方法

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

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

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

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

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


コメント