Written by Manabu Bannai

【PHP】シンプルなページネーションを作る方法【PDO】

PHP PROGRAMMING

PHPでシンプルなページネーションを作る方法です。
完成イメージは下記。
%e3%80%90php%e3%80%91%e3%82%b7%e3%83%b3%e3%83%95%e3%82%9a%e3%83%ab%e3%81%aa%e3%83%98%e3%82%9a%e3%83%bc%e3%82%b7%e3%82%99%e3%83%8d%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92%e4%bd%9c%e3%82%8b
ちょっと見づらいですが、ブログタイトルが並んでいるイメージです。
備忘録的にまとめました。

スポンサードサーチ


DBを作り、ダミーデータを挿入する

DB名:pagination(utf8_general_ci)

postsテーブルを作る

posts%e3%83%86%e3%83%bc%e3%83%95%e3%82%99%e3%83%ab

postsテーブルにダミーデータを挿入する


generatedata.com(ダミーデータ生成ツール)を使います。

上記写真の赤文字の箇所(3つ)を入力すればOKです

%e3%82%bf%e3%82%99%e3%83%9f%e3%83%bc%e3%83%86%e3%82%99%e3%83%bc%e3%82%bf

すると下記画面になりますので、9行目からコピペします

%e3%82%bf%e3%82%99%e3%83%9f%e3%83%bc%e3%83%86%e3%82%99%e3%83%bc%e3%82%bf02
その後、phpmyadminからデータ挿入すればOK。

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 ?>