【PHP】シンプルなページネーションを作る方法【PDO】
PHPでシンプルなページネーションを作る方法です。
完成イメージは下記。
ちょっと見づらいですが、ブログタイトルが並んでいるイメージです。
備忘録的にまとめました。
DBを作り、ダミーデータを挿入する
DB名:pagination(utf8_general_ci)
postsテーブルを作る
postsテーブルにダミーデータを挿入する
generatedata.com
GenerateData.com: free, GNU-licensed, random custom data generator for testing software
generatedata.com(ダミーデータ生成ツール)を使います。
上記写真の赤文字の箇所(3つ)を入力すればOKです
すると下記画面になりますので、9行目からコピペします
DBに接続して投稿一覧を取得する
下記のとおり。
<?php
// PDOでDBに接続
$db = new PDO('mysql:dbname=pagination;host=localhost', 'root', 'root');
// postsテーブルから10件のデータを取得する
$posts = $db->prepare("
SELECT id, title
FROM posts
LIMIT 0, 10
");
$posts->execute();
$posts = $posts->fetchAll(PDO::FETCH_ASSOC);
foreach ($posts as $post) {
echo $post['id'], ':';
echo $post['title'], '<br>';
}
URLにパラメータを与えて、表示するデータを動的に変更する
<?php
// PDOでDBに接続
$db = new PDO('mysql:dbname=pagination;host=localhost', 'root', 'root');
// GETで現在のページ数を取得する(未入力の場合は1を挿入)
if (isset($_GET['page'])) {
$page = (int)$_GET['page'];
} else {
$page = 1;
}
// スタートのポジションを計算する
if ($page > 1) {
// 例:2ページ目の場合は、『(2 × 10) - 10 = 10』
$start = ($page * 10) - 10;
} else {
$start = 0;
}
// postsテーブルから10件のデータを取得する
$posts = $db->prepare("
SELECT id, title
FROM posts
LIMIT {$start}, 10
");
その後、下記のURLでアクセスします。
<!-- 最初から表示 --> http://localhost/pagination/index.php <!-- 10件目から表示 --> http://localhost/pagination/index.php?page=2 <!-- 20件目から表示 --> http://localhost/pagination/index.php?page=3
これでパラメータに応じてタイトルが出力されるようになりました。
ページネーションを作る
postsテーブルに18件のデータが入っている場合だと、ページネーションは2ページとなります。この『2』という数字を計算するには次のような計算式になります。
postsテーブルに入っているデータ件数を取得し、それを10で割って、小数点以下を切り上げる
※具体例:postsテーブルに18件のデータがある場合
18 ÷ 10 = 1.8
その後、小数点以下を切り上げる
答え:2
18件の投稿データを10件ずつ表示したら2ページになりますよね。この処理で、いくつのページネーションを表示すれば良いかわかるようになります。
つまり、実行すべき処理は下記3つ。
- ①:postsテーブルに入っているデータ件数を取得
- ②:取得したデータを10で割る
- ③:小数点以下を切り上げる
順番に見ていきましょう。
①:postsテーブルに入っているデータ件数を取得
// postsテーブルのデータ件数を取得する
$page_num = $db->prepare("
SELECT COUNT(*) id
FROM posts
");
$page_num->execute();
$page_num = $page_num->fetchColumn();
②:取得したデータを10で割る
$pagination = $page_num / 10;
③:小数点以下を切り上げる
// ページネーションの数を取得する
$pagination = ceil($page_num / 10);
ページネーションを表示する
あとはfor文を回すだけです。
<?php for ($x=1; $x <= $pagination ; $x++) { ?>
<a href="?page=<?php echo $x ?>"><?php echo $x; ?></a>
<?php } // End of for ?>
以上で完了です。最後に全体像のコードを貼っておきます。
<?php
// PDOでDBに接続
$db = new PDO('mysql:dbname=pagination;host=localhost', 'root', 'root');
// GETで現在のページ数を取得する(未入力の場合は1を挿入)
if (isset($_GET['page'])) {
$page = (int)$_GET['page'];
} else {
$page = 1;
}
// スタートのポジションを計算する
if ($page > 1) {
// 例:2ページ目の場合は、『(2 × 10) - 10 = 10』
$start = ($page * 10) - 10;
} else {
$start = 0;
}
// postsテーブルから10件のデータを取得する
$posts = $db->prepare("
SELECT id, title
FROM posts
LIMIT {$start}, 10
");
$posts->execute();
$posts = $posts->fetchAll(PDO::FETCH_ASSOC);
foreach ($posts as $post) {
echo $post['id'], ':';
echo $post['title'], '<br>';
}
// postsテーブルのデータ件数を取得する
$page_num = $db->prepare("
SELECT COUNT(*) id
FROM posts
");
$page_num->execute();
$page_num = $page_num->fetchColumn();
// ページネーションの数を取得する
$pagination = ceil($page_num / 10);
?>
<?php for ($x=1; $x <= $pagination ; $x++) { ?>
<a href="?page=<?php echo $x ?>"><?php echo $x; ?></a>
<?php } // End of for ?>