現在、プログラムの勉強をしている初心者のものです。
PHPとHTMLを使って勉強用のサイトを作成する事が出来ました。
そこで次にMYSQLを使ってデータベースに格納している記事を
HTMLにて表示する際に「20件ずつ」という風に表示したいと考え、
ページナビゲーションを設定するべく、試行錯誤をしている所です。
【理想の形】
上の画像を参考に自分なりに作成してみました。
php
1 2// ページング機能 3 if (!isset($_GET['page'])) { 4 $page = 1; 5 } 6 elseif (preg_match('/^[1-9][0-9]*$/', $_GET['page'])) { 7 $page = (int)$_GET['page']; 8 } else { 9 $page = 1; 10 } 11 //表示件数:20件設定 12 $pagelimit = 20; 13 $offset = $pagelimit * ($page - 1); 14 15 $stmt = $db->prepare("select * 16 from article 17 order by date desc limit :offset, :pagelimit"); 18 $stmt->bindParam(':offset', $offset, PDO::PARAM_INT); 19 $stmt->bindParam(':pagelimit', $pagelimit, PDO::PARAM_INT); 20 $stmt->execute(); 21 $mysqlall = $stmt->fetchAll(\PDO::FETCH_OBJ); 22 23 $stmt = $db->query("select count(id) as cnt from article"); 24 $mysqlallcount = $stmt->fetchColumn(); 25 26//合計ページ数を計算 27$totalPages = ceil($mysqlallcount / $pagelimit); 28 29
HTML
1<div class="page-box"> 2 3 <!-- 現在のpageが2以上の時にのみ表示します。 --> 4 <?php if ($page > 1) : ?> 5 <a class="page-navi page-navi-next" href="?page=<?php echo $page-1; ?>"> 6 前の<?php $pagelimit ; ?>件へ</a> 7 <?php endif; ?> 8 9 <!-- 現在のpageが2の時にのみ「page1」へのリンクを表示します。 --> 10 <?php if($page == 2) : ?> 11 <a class="page-navi" href="?page=<?php echo $page-1; ?>"><?= $page-1 ; ?></a> 12<?php endif; ?> 13 14 <!-- 現在のpageが3の時にのみ「page2」「page1」へのリンクを表示します。 --> 15 <?php if($page == 3) : ?> 16 <a class="page-navi" href="?page=<?php echo $page-2; ?>"><?= $page-2 ; ?></a> 17 <a class="page-navi" href="?page=<?php echo $page-1; ?>"><?= $page-1 ; ?></a> 18<?php endif; ?> 19 20 <!-- 現在のpageが4以上の時にのみ「page-3」「page-2」「page-1」へのリンクを表示します。 --> 21 <?php if($page > 3) : ?> 22 <a class="page-navi" href="?page=<?php echo $page-3; ?>"><?= $page-3 ; ?></a> 23 <a class="page-navi" href="?page=<?php echo $page-2; ?>"><?= $page-2 ; ?></a> 24 <a class="page-navi" href="?page=<?php echo $page-1; ?>"><?= $page-1 ; ?></a> 25<?php endif; ?> 26 27 <!-- 現在のpageより合計ページ数が多い場合にのみ 28 「page+1」「page+2」「page+3」「page+4」へのリンクを表示します。 --> 29 <?php $pagei2 = '0'; ?> 30 <?php for ($i = $page; $i < $totalPages; $i++) : ?> 31 32 <!-- 現在のpageと$iが一致している時にのみ「現在のページ」として背景色を変更しています。 --> 33 <?php if($i === $page) :?> 34 <a class="page-navi" style="background:white; color:black"><?= $i ; ?></a> 35 <?php endif;?> 36 <a class="page-navi"href="?page=<?php echo $i+1; ?>"><?= $i+1 ; ?></a> 37 <?php $pagei2++; ?> 38 <?php if ($pagei2 > 3) { 39 break; 40 }; ?> 41 <?php endfor; ?> 42 43 <!-- 現在のpageが合計ページより小さい時にのみ表示します。 --> 44 <?php if ($page < $totalPages) : ?> 45 <a class="page-navi page-navi-next" href="?page=<?php echo $page+1; ?>">次の<?php $pagelimit ; ?>件へ</a> 46 <?php endif; ?> 47</div>
【実行結果】
初心者なりに無理やり知っている方法を使って
なんとか作成したのですが
コードが長くなりすぎているように感じています。
「ページナビゲーション」に関係しているのだけで「30行ぐらい」にまで長くなってしまいました。
試行錯誤を何時間やってもこの長さが限界でした。
このコードをもっと簡単に短縮できたり
短くするような方法をご存知の方や
お気付きになられた方がいらっしゃいましたら
お力をお貸し頂けると嬉しいです。
【追記:教えて頂いたことを参考に作成】
PHP
1 <?php if ($page > 1) : ?> 2 <a class="page-navi page-navi-next" href="?page=<?php echo $page-1; ?>">前の<?= pagelimit ; ?>件へ</a> 3 <?php endif; ?> 4 5 <?php if($page > 4) : ?> 6 <a class="page-navi" href="?page=1">1</a>… 7 <?php endif; ?> 8 9 <?php for ($i = $page -3 ; $i <= $page+4; $i++) : ?> 10 <?php if($i >= 1): ?> 11 <?php if($i !== $page) :?> 12 <a class="page-navi" href="?page=<?php echo $i; ?>"><?= $i ; ?></a> 13 <?php endif;?> 14 <?php if($i === $page) :?> 15 <a class="page-navi" style="background:white; color:black"> 16 <?= $i ; ?></a> 17 <?php endif;?> 18 <?php endif;?> 19 <?php endfor; ?> 20 21 <?php if ($page < $totalPages) : ?> 22 <a class="page-navi page-navi-next" href="?page=<?php echo $page+1; ?>">次の<?= pagelimit ; ?>件へ</a> 23 <?php endif; ?> 24 </div>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/12 22:32
退会済みユーザー
2018/02/12 22:34
退会済みユーザー
2018/02/12 22:40
2018/02/12 22:42
2018/02/12 23:27