0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLではなく、PHPでページネーションを実装する。

Last updated at Posted at 2024-09-14

ページネーションを実装する際は
通常はSQLで取得する際にOFFSETとLIMITで取得するデータに制限をかけるが
今回はSQLではなくPHPでページネーションを実装する。
 
 
この際にJOINを使って結合もせず、PHPでMERGEを行う。
(独自関数をいじりたくないので無理やり。)
※フロント側も載せる。
 

バック側実装

$table_array1 = "独自関数でDBのデータを取得。";
$table_array2 = "独自関数でDBのデータを取得。";
$table_array3 = "独自関数でDBのデータを取得。";

// ひとつにまとめる
$table_list = array_merge($table_array1, $table_array2, $table_array3);

// 並び替え(DAYカラムで降順)
$sort_value = array_column($table_list, 'DAY');
array_multisort($sort_value, SORT_DESC, $table_list);


// 【ページャー作成】 

// 取得したデータの数を取得
$total_count = count($table_list);

// 何件表示させるかを決める。
$search_limit = $_GET['limit'] ?: SEARCH_LIMIT;

// (取得したデータ÷表示件数)の結果を切り上げる。結果が0場合は1を格納
$max_page = ceil($total_count / $search_limit) ?: 1;

// 現在のページ getの値がない場合は1を格納
$page_num = $_GET['page_num'] ?: 1;

// 前ページ = 現在のページ-1
$prev_page_num = ($page_num - 1);

// 次ページ = 現在のページ+1
$next_page_num = ($page_num + 1);

// 表示を開始するデータ = 現在のページ-1* 表示件数
$offset = ($page_num - 1) * $search_limit;

// ページャーを作成
$table_list = array_slice($table_list, $offset, $search_limit);

 

解説 

難しいことは書いていないと思うが、

// 表示を開始するデータ = 現在のページ-1* 表示件数
$offset = ($page_num - 1) * $search_limit;

が理解しにくいと思うので解説。

現在のページが2ページ目
表示件数が5件
取得データが20件だった場合
 
表示されているデータは5~9番目のデータである。

これを実装するために現在のページ2からー1をして1に。
この数字に対して表示件数5をかけると5になる。
つまり、「現在のページから1を引いてその数字に表示件数を書けた値からでデータを表示すれば」、
ページネーションがうまく実装できるといえる。

フロント側実装

// getでリダイレクトさせる
<form method="get" class="" action="リダイレクトさせる" enctype="multipart/form-data">
	<div class="search_div">
		<span>表示件数:</span>
  
        <!-- 表示件数を表示、入力 -->
		<input type="number" name="limit" min="1" value="<?php echo $search_limit; ?>" />
  
        <!-- リセットボタン(今回実装していない)-->
		<input type="button" class="" value="リセット">
        
        <!-- 検索ボタン 押下で表示件数を変える-->
		<input type="submit" class="" value="検索">
	</div>
	<div class="page_nav">

         <!-- 取得したデータの数を表示-->
		<span class=""><?php echo $total_count; ?></span>

         <!-- 前ページボタン 遷移先設定用 パラメータを持たせる-->
		<?php if ($prev_page_num >= 1) { ?>
			<a class="" href=""><i class="fa-solid fa-circle-arrow-left fa-lg"></i></a>
		<?php } else { ?>
			<span class=""><i class="fa-solid fa-circle-arrow-left fa-lg"></i></span>
		<?php } ?>

        <!-- 現在のページを表示する、1~MAXページまで入力できる-->
		<input type="number" name="page_num" value="<?php echo $page_num; ?>" min="1" max="<?php echo $max_page; ?>">
		<span class="separator">/</span>

        <!-- MAXページを表示-->
		<span class="max_page"><?php echo $max_page; ?>ページ</span>

        <!-- 次ページボタン 遷移先今はパラメータしか書いてないので遷移先など自分の画面に合わせて編集要。-->
		<?php if ($next_page_num <= $max_page) { ?>
			<a class="" href="page_num' => $next_page_num"><i class="fa-solid fa-circle-arrow-left fa-flip-horizontal fa-lg"></i></a>
			<?php } else { ?>
				<span class="link_button"><i class="fa-solid fa-circle-arrow-left fa-lg fa-flip-horizontal"></i></span>
			<?php } ?>
		</div>
	</form>

解説

ページネーションは当たり前だが、別のページに遷移するわけではなく
同じ画面にパラメータを持たせてリダイレクトする。

なのでformとaタグの遷移先は同じ画面になるように設定して
必要なデータをパラメータで持たせるようにする。

aタグの遷移先のコードは今回参考のコードには諸事情で書けなかったですが
次ページボタンにパラメータのみ記載しているので参考に書いていただけたらと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?