CodeIgniterでページネーション機能を実装!DBからデータを取得する方法
生徒
「ブログの記事がたくさん増えてきたのですが、1ページに全部表示すると長すぎて見づらいです。本のようにページを分ける方法はありますか?」
先生
「それは『ページネーション』という機能ですね。CodeIgniterを使えば、データベースから少しずつデータを取り出して、自動でページを切り替えるリンクを作ることができますよ。」
生徒
「初心者でもプログラムでデータベースを操作して、ページを分けることはできますか?」
先生
「もちろんです!まずは基本の仕組みから、実際のコードの書き方まで一緒に学んでいきましょう。」
1. ページネーションとデータベースの基本概念
プログラミングの世界でよく聞く「ページネーション(Pagination)」とは、大量にあるデータを一定の数ごとに分割して表示する仕組みのことです。例えば、Googleの検索結果やネットショップの商品一覧で、一番下に「1 2 3 次へ」というボタンがありますよね。あれがページネーションです。
なぜこれが必要かというと、1,000件や10,000件といった大量のデータを一度に表示しようとすると、パソコンの動きが重くなったり、読み込みに時間がかかって利用者が困ってしまうからです。また、情報を探している人にとっても、少しずつ整理されている方が見やすくなります。
データベース(Database)とは、情報を整理して保管しておく「デジタルな倉庫」のようなものです。CodeIgniter(コードイグナイター)という道具を使うと、この倉庫から「11件目から10件分だけ持ってきて!」という命令を簡単に出すことができます。これをマスターすれば、本格的なWebサイト制作に一歩近づきます。
2. モデル(Model)を作成してデータを準備しよう
CodeIgniterでは、データベースとのやり取りを「モデル(Model)」という場所に書く決まりがあります。モデルは、いわば倉庫の番人のような役割です。まずは、データベースからデータを取得するための準備をしましょう。
ここでは、BlogModel.phpというファイルを作って、ブログのデータを扱う設定を行います。パソコンに詳しくない方でも、「このファイルがデータを取ってくる担当なんだな」と思ってもらえれば大丈夫です。
namespace App\Models;
use CodeIgniter\Model;
class BlogModel extends Model
{
// 操作するテーブルの名前を指定します
protected $table = 'posts';
// データの主役となるID(背番号のようなもの)を指定します
protected $primaryKey = 'id';
// 画面に表示しても良い項目の名前を登録します
protected $allowedFields = ['title', 'content', 'created_at'];
}
このコードでは、postsという名前のテーブル(表)を使うことを宣言しています。allowedFieldsは、セキュリティのために「どの情報を書き換えても良いか」をあらかじめ決めておくための設定です。これを設定しないと、悪意のある人に勝手にデータを操作されるリスクがあるため、非常に重要な項目です。
3. コントローラーでページネーションの設定を行う
次に、「コントローラー(Controller)」というファイルを作ります。コントローラーは、全体の司令塔です。「何番目のページを表示するか」を判断し、モデルにデータを取ってくるように命令し、最終的に画面(ビュー)に表示する橋渡しを行います。
CodeIgniterには、標準で非常に便利なページネーション機能が備わっています。複雑な計算(「今のページは2枚目だから、21件目から表示する」など)を自分でする必要はありません。
namespace App\Controllers;
use App\Models\BlogModel;
class Blog extends BaseController
{
public function index()
{
$model = new BlogModel();
// 1ページに表示したい件数を決めます(ここでは5件)
// paginate(件数) と書くだけで、自動的に分割してくれます
$data = [
'posts' => $model->paginate(5),
'pager' => $model->pager, // ページ移動ボタンを作るための情報を取得
];
// 準備したデータを画面に送ります
return view('blog_list', $data);
}
}
ここで登場するpaginate(5)という命令が魔法の言葉です。これだけで、データベースから「最初の5件」や「次の5件」を賢く選んで持ってきてくれます。また、$model->pagerという部分には、ページ移動のためのリンクを作るための「種」が入っています。
4. ビュー(View)でページ移動リンクを表示する
最後に、ユーザーが見る画面である「ビュー(View)」を作成します。ここでは、取得した記事の一覧を表示し、その下にページを切り替えるためのボタンを表示させます。
初心者の方が一番感動するのが、たった一行のコードで「1 2 3 次へ」というリンクが完成する瞬間です。CodeIgniterの機能をフル活用しましょう。blog_list.phpという名前でファイルを作成します。
<div class="container">
<h1>ブログ記事一覧</h1>
<ul>
<?php foreach ($posts as $post): ?>
<li><?= $post['title'] ?></li>
<?php endforeach; ?>
</ul>
<!-- ページ移動のためのボタンを表示します -->
<div class="pagination-links">
<?= $pager->links() ?>
</div>
</div>
$pager->links()と書くだけで、現在のページ状況に合わせたナビゲーションが自動生成されます。プログラミング未経験の方にとって、こうした「自動でやってくれる機能」は非常に強力な味方になります。デザインを整えたい場合は、CSSを使ってボタンの見た目を装飾することも可能です。
5. 検索条件を付けたページネーションの方法
「特定のカテゴリの記事だけをページ分けしたい」という場合もよくあります。例えば、料理ブログで「和食」のカテゴリだけを表示する時などです。CodeIgniterでは、データの絞り込み(検索)とページネーションを組み合わせて使うことができます。
データベースから特定の条件に合うものだけを抽出するには、whereという命令を使います。これは「~が〇〇であるデータだけを探して」という意味です。
public function category($categoryName)
{
$model = new BlogModel();
// カテゴリが一致するものだけを探して、5件ずつ表示する
$data = [
'posts' => $model->where('category', $categoryName)->paginate(5),
'pager' => $model->pager,
];
return view('blog_list', $data);
}
このように、whereで条件を指定した直後にpaginateをつなげるだけで、絞り込んだ結果に対してページネーションを適用できます。まるでパズルのように組み合わせて使うことができるのが、フレームワークの面白いところです。
6. データベースの設定と接続の確認
プログラムを書く前に、実は一番大切な「土台」があります。それは、CodeIgniterとデータベースを繋ぐ設定です。どんなに素晴らしいコードを書いても、倉庫への鍵(設定)が合っていなければデータは取り出せません。
CodeIgniterでは、.envというファイルや、app/Config/Database.phpというファイルに設定を書きます。ここでは、ホスト名(倉庫の住所)、ユーザー名(倉庫の鍵)、パスワード(暗証番号)、データベース名(倉庫の名前)を指定します。
初心者の陥りやすいミスとして、「パスワードの打ち間違い」や「データベースをそもそも作っていない」ということがあります。もしエラーが出た場合は、まずこの接続設定を疑ってみましょう。エラーメッセージに「Access denied」や「Connection refused」と出ていたら、設定を見直すサインです。
7. ページネーションの外見をカスタマイズする
デフォルトの表示でも動きますが、自分のサイトに合わせて「もっとかっこいいボタンにしたい!」と思うこともあるでしょう。CodeIgniterでは、ページネーションのデザインを自由に変更するための「テンプレート機能」があります。
例えば、世界的に有名なデザインの枠組みである「Bootstrap(ブートストラップ)」を使っている場合、専用のテンプレートを指定するだけで、一瞬でプロっぽいボタンに変わります。設定ファイル(app/Config/Pager.php)を編集することで、サイト全体のデザインを統一することが可能です。
難しく感じるかもしれませんが、基本は「どこのテンプレートを使うか」を選ぶだけです。最初はデフォルトのまま進め、慣れてきたら見た目にこだわってみるのが上達の近道です。一歩ずつ、楽しみながらWeb開発の世界に触れていきましょう。