質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

3084閲覧

【PHP】「ページナビゲーション」の簡単なコードの書き方について【初心者】

shimane

総合スコア98

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2018/02/12 20:18

編集2018/02/12 23:29

現在、プログラムの勉強をしている初心者のものです。

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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

-- cakephp のないようを削除

朝でちょっとボートしてるので考えだけ

スタート=現在地-3(表示領域)
エンド=現在地+3(表示領域)

ループで スタートからエンドまで回し ループ番号が現在地と一致したときにアクティブに設定する

投稿2018/02/12 22:30

編集2018/02/12 22:40
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shimane

2018/02/12 22:32

申し訳ありません。 まだ初心者も初心者でしてcakephpを使った勉強にまで到達していない段階です><
退会済みユーザー

退会済みユーザー

2018/02/12 22:34

ボケーとしてるな・・
退会済みユーザー

退会済みユーザー

2018/02/12 22:40

とりま作成の考え方だけ書いておいた
shimane

2018/02/12 22:42

有難うございます。よく考えてみます!
shimane

2018/02/12 23:27

教えて頂いたことを参考にして  もう1度じっくりと考えてみたら前のコードよりも短く、簡単に作ることが出来ました! 大感謝です!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問