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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

3回答

2507閲覧

ページング<1...5,6,7,8,9...20>のようにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

1クリップ

投稿2018/06/04 03:38

編集2018/06/04 04:26

現在、ページング機能を作っています。php初心者です。
タイトルのように、1...5,6,7,8,9...20 のようにしたいです。
ページング機能自体は完成しております。
しかし、もし20ページ分あるとしたら、
1,2,3,4,5,6,7,8,9,10................
と言う風に20ページぶん全て表示されてしまいます。
そこで、以下のようにしたいです。

*期待する動作
・現在のページを真ん中にしたいです。
・... は全ページを表示すると、見栄えが悪いのでこのようにしています。
・タイトルは"7"が現在表示しているページです。
もし"9"が現在のページだったら 1...7,8,9,10,11...20 のようになります。
下記は、ページ飛ばしするまでの遷移です。

"1"の場合
1,2,3,4,5...20

"2~4"の場合
1,2,3,4,5...20

"5~13"の場合
1...3,4,5,6,7...20

"14"の場合
1...12,13,14,15,16...20

"15の場合"
1...15,16,17,18,19,20

このようにしたいです。
見にくくて申し訳ございません。
サンプルを探してもなかなか見つけられません。
大変恐縮ですが、簡単で良いのでご教示いただけないでしょうか。
よろしくお願いいたします。

php

1<?php 2//DBの設置 3 4$per_page = 5; //1pageに何件表示するか 5 6if(isset($_GET['page'])){ 7$page = $_GET['page']; //htmlでリンクを押下時それぞれのページを取得 8}else{ 9 $page = 1; //もし、それ以外の値が入ってきたら1pageに飛ばす 10} 11 12try{ 13 $dbh = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME,DB_USER,DB_PASS); 14}catch(PDOException $e){ 15 echo $e->getMessage(); 16 exit; 17} 18 19$offset = $per_page * ($page -1); //offsetを計算 現在のページ -1 * 何件表示するか 20$sql = "select * from comments limit ".$offset.",".$per_page; // 21 22$comments = array(); 23foreach($dbh->query($sql) as $row){ 24 array_push($comments,$row); 25} 26 27$total = $dbh->query("select count(*) from comments")->fetchColumn(); //カラム数をカウント 28$totalPages = ceil($total/$per_page); //何ページ必要かを計算 29 30?>

html

1<!DOCTYPE html> 2<html lang="ja" dir="ltr"> 3 <head> 4 <meta charset="utf-8"> 5 <title>コメント一覧</title> 6 </head> 7 <body> 8 <h1>コメント一覧</h1> 9 <ul> 10 <?php foreach ($comments as $comment) :?> 11 <li><?=$comment['comment']?></li> 12 <?php endforeach;?> 13 </ul> 14 <?php for($i = 1; $i <=$totalPages; $i++):?> 15 <a href="?page=<?php echo $i;?>"><?php echo $i;?></a> 16 <?php endfor?> 17 </body> 18</html>

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

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

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

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

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

m.ts10806

2018/06/04 03:58

また、PHPとhtmlの関連性を提示してください。
退会済みユーザー

退会済みユーザー

2018/06/04 03:59

私の文脈がおかしかったです。すでに、ページングとしては機能します。しかし、1...56789...20 と言うようにできません。
m.ts10806

2018/06/04 04:00 編集

... というのは「1234567と続いているが長いから文章上省略した」のか「ページングとして全ページの数値を出すのはレイアウト上よくないから・・・と表示する」のかでは全く違います。正しく要件を伝えられるような表現に修正してください。
m.ts10806

2018/06/04 04:01

質問本文を編集してください。
m.ts10806

2018/06/04 04:04

2ページ目や10ページ目 要は隠れている部分のページが表示されたらどう表示するのでしょうか。5ページしかない場合などパターンが様々あると思います。そのパターンもあわせて要件として定義してください。(おそらくそこの定義がきちんとできれば組めそうではあります)
退会済みユーザー

退会済みユーザー

2018/06/04 04:06

すいません。少し変更したのですが、もう一度編集し直します。
退会済みユーザー

退会済みユーザー

2018/06/04 04:18

今、編集し直しましたが、不明な点などがございましたら再度お伝えいただければなと思います。
papinianus

2018/06/04 06:04 編集

4と5、5から推論する6と15、のペアがそれぞれ特異すぎて、各数値を(ループではなく)固定で用意したほうがいいのではないかと思います。具体的に言うと、「両端は必ず表示」「選択ページを中央とした5件を表示」という抽象的なルールの場合、4なら1,[2,3,4,5,6],20が期待されますがそうではない(5はそういうルールに従っているように見える)。また5から6のパターンを推論すると1,[4,5,6,7,8],20となるはずですが、反対の端である20から6コ目の15は1,[13,14,15,16,17],20ではなく、1,[15,16,17,18,19],20。ルールがわかりません。具体例は参考になりますが、枠組みあるいは指針として文章で説明可能でしょうか?
guest

回答3

0

投稿2018/06/04 04:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

要件をどこまで満たしているかは確認してもらいたいですが、イメージとしてはこんな感じでしょうか。

php

1$totalPages = 20; //トータルページ数 2$page = 4; //現在のページ 3$page_width = 2; //現在のページから表示する幅 4 5if($page > 1){ //現在のページが1より大きい場合に<表示 6 echo " < "; 7} 8 9if(($page-$page_width)>1){ //ページ幅が1より大きい場合に1と...表示 10 echo 1; 11 echo "..."; 12} 13for($i = $page_width; $i>0; $i--){ //中心ページより小さいページ番号を表示 14 if(($page-$i) < 1) continue; //1未満は表示させない 15 echo ($page-$i)." "; 16} 17echo $page." "; //中心ページを表示 18 19for($i = 1; $i<=$page_width; $i++){ //中心ページより大きいページ番号を表示 20 if(($page+$i) > $totalPages) continue; //最終ページ以上は表示させない 21 echo ($page+$i)." "; 22} 23 24if(($page+$page_width)<$totalPages){ //ページ幅が最終ページより小さい場合に最終ページ番号と...表示 25 echo "..."; 26 echo $totalPages; 27} 28if($page < $totalPages){ // ページが最終ページより小さい場合に>表示 29 echo ">"; 30}

ただし、GETでpage番号を取得しているようですが、上記コードでは0や最終ページより大きい番号が指定された場合などの考慮はしていません。
ご自身でカスタマイズしてみてください。

追記:
いつの間にか要件がたくさん追記されてる^^;
私のコードを確認しましたら分かると思いますが、おおよそ1回のfor文の中でやるのは結構複雑になります。
なので、1個1個切り出して実装していくしかありません。
私のコードでは要件全ては満たせてないと思いますが、ベースとして不足分を追加していけばおそらく実現できると思います。
あとは、がんばってください。

投稿2018/06/04 04:30

編集2018/06/04 04:35
m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2018/06/04 04:33

ありがとうございます! >ただし、GETでpage番号を取得しているようですが、上記コードでは0や最終ページより大きい番号が定>された場合などの考慮はしていません。 >ご自身でカスタマイズしてみてください。 こちら、承知しました。理解しながら試して見ます!
m.ts10806

2018/06/04 04:35

追記しました。「追記:」部分もお読みください。
退会済みユーザー

退会済みユーザー

2018/06/04 04:38

すいません。。。 ベースを作ってくださりありがとうございます。 必要な条件分岐の仕方が特にわからなかったので、とてもありがたいです!
m.ts10806

2018/06/04 04:43

あ、continueよりbreakの方が早くループを抜けるので変更して試してください。
退会済みユーザー

退会済みユーザー

2018/06/05 07:42

遅くなり、申し訳ございません。 頂いたコードを参考に自分なりに関数を作成して 綺麗にページネーション できるようになりました! ありがとうございました!
m.ts10806

2018/06/05 08:06

解決したようで何よりです
guest

0

ざっくりとこんな感じで

PHP

1$id=filter_input(INPUT_GET,"id",FILTER_VALIDATE_INT,["options"=>["default"=>1]]); 2print "<a href='?id=1'>1</a>"; 3if($id<=3){ 4 foreach(range(2,5) as $val){ 5 print ",<a href='?id={$val}'>{$val}</a>"; 6 } 7 print "...<a href='?id=20'>20</a>,"; 8} 9if($id>=4 and $id<=17){ 10 print "..."; 11 foreach(range(-2,2) as $key=>$val){ 12 if($key>0) print ","; 13 print "<a href='?id=".($id+$val)."'>".($id+$val)."</a>"; 14 } 15 print "..."; 16} 17if($id>=18){ 18 print "..."; 19 foreach(range(16,19) as $val){ 20 print "<a href='?id={$val}'>{$val}</a>,"; 21 } 22} 23print "<a href='?id=20'>20</a>";

投稿2018/06/04 12:36

yambejp

総合スコア114843

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問