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

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

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

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

PHP

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

Q&A

解決済

2回答

2854閲覧

ページネーションの数が多くなりすきて分割したい。

efu_akio

総合スコア37

MySQL

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

PHP

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

0グッド

0クリップ

投稿2016/12/21 14:14

ページネーションを自作して使っておりますデータが大きくなって総件数が1万件を超えてしまいました。
ページネーションの数も増えてしまうので以下のような10件を超えたら「次へ」のような表示にしたいです。
(画像はYahooさんのページネーション)
for文のところを変えると思っておりますが理解ができず困っております。
イメージ説明
よろしくお願いいたします。

php

1$result=mysql_query($sql); 2$row=mysql_fetch_assoc($result); 3$count = $row["count"]; 4$first = (($page-1)*$maxrow); 5$maxpage=intval((($count-1)/$maxrow)+1); 6$pagelink = "全".$count."件<br>\n"; 7 8for ($i=1;$i<=$maxpage;$i++) { 9$pagelink = $pagelink."<a href=\"#\" onclick=\"changepage('".$i."');return false;\">"; 10if ($i==$page) { 11$pagelink = $pagelink."<font size=\"+2\">".$i."</font></a> "; 12} else { 13$pagelink = $pagelink.$i."</a>\n"; 14} 15}

※PEAR pagerは使っていません。ページをチェンジする際にJavascriptを使っております。

javascript

1<script type="text/javascript"> 2function changepage (page) { 3document.forms["linkform"].page.value = page; 4document.forms["linkform"].submit(); 5} 6</script>

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

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

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

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

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

guest

回答2

0

ベストアンサー

まずは要件定義をしっかりすること

かりに全部で20ページあって6ページずつ表示するとする最初は
[1] 2 3 4 5 6 >次へ (カッコはカレント)となります。

まず次への考え方が2つあることを理解してください

  • カレント1に対して次へをおすと2に移動する

(数字がおしにくいまたは次へが常に同じ位置にあればページ遷移がしやすい)

  • カレント1に対して次へをおすと最終表示の6の次7を表示する

いずれかまたは両方設定することが可能です。

その上で、

  • カレントが移ったときに全体をシフトするか
  • カレントをセンタリングするか
  • 表示数が偶数の時、センターは右か左か

などきめる必要があります。

[1] 2 3 4 5 6 >次へ

前へ< [7] 8 9 10 11 12 >次へ なのか
前へ< 5 6 [7] 8 9 10 >次へ なのか

など検討ください

sample

ざっくり書いてみました
仕様は前述したとおり、6ページ表示の最大20ページです
(細かいチェックしてないのでバグってたらスミマセン)

PHP

1<style> 2.largelink{ 3 font-size:2em; 4} 5</style> 6<?PHP 7$currentPage=filter_input(INPUT_GET,"c")?:1; 8$lastPage=20; 9$perPage=6; 10$bigMove=true; 11$pager_first=false; 12$pager_last=false; 13if(ceil($perPage/2) >= $currentPage ){ 14$start=1; 15$pager_first=true; 16}elseif(floor(($perPage)/2) >= $lastPage - $currentPage ){ 17$start=$lastPage - $perPage +1; 18$pager_last=true; 19}else{ 20$start=$currentPage-ceil($perPage/2) +1; 21} 22 23$view_prev=($bigMove and !$pager_first)?"<a href='?c=".($start-1)."' class='largelink'>prev&lt;</a>":""; 24$view_next=($bigMove and !$pager_last)?"<a href='?c=".($start+$perPage)."' class='largelink'>&gt;next</a>":""; 25 26print $view_prev." "; 27for($i=$start;$i<$start+$perPage;$i++){ 28 if($i==$currentPage){ 29 print "<span class='largelink'>{$i}</span> "; 30 }else{ 31 print "<a href='?c={$i}'>{$i}</a> "; 32 } 33} 34print $view_next; 35

投稿2016/12/22 00:42

編集2016/12/22 04:34
yambejp

総合スコア114585

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

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

efu_akio

2016/12/22 03:12

ご意見ありがとうございます。 公開していない管理ページだったのであまり深く考えておりませんでした。 そうですね要件定義がしっかりしていないとだめですね。 「前へ< 5 6 [7] 8 9 10 >次へ 」で考えたいと思います。 引き続き宜しくお願いいたします。
yambejp

2016/12/22 04:33

sampleあげときました、参考になれば
efu_akio

2016/12/22 06:28

早々のコードありがとうございます、理解力が少ないため私の何かが抜けていると思うのですが7ページ目に遷移した際に保持されていたデータがなくなってい結果表示が消えてしまいました。 時間が掛かりますが検証しながら再度組み込んでいきます、ありがとうございました。
yambejp

2016/12/22 06:54

SQLからデータを抽出するんですよね? データの検索の際にLIMITを指定してください 1ページの表示数を$viewとすると 先頭データは($currentPage-1)*$view データ数は$viewなので ORDER BY hogehoge ASC LIMIT ($currentPage-1)*$view,$view のような書き方になるかと思います
efu_akio

2016/12/22 17:24

ご連絡ありがとうございます。 LIMITの設定は行っております1~6ページまでは正常に動いており問題はないのですが「NEXT」で表示されなくなります、おそらく次へをクリックした際の数字の引き渡しができていないようです。色々と試してみます。
yambejp

2016/12/23 05:19

ページ番号をパラメーターcをgetで渡してるのはわかりますね? 7ページに飛んだときちゃんとc=7になってますか?
efu_akio

2016/12/24 05:19

理解不足ですみません。 ご指導いただきました "<a href='?c={$i}'>{$i}</a> " にjavascriptでFomeの変数をPOSTするために "<a href='?c={$i}' onclick='changepage(".$i.");return false;'>{$i}</a>"; に変更しています。 1~6ページまではパラメータにcはついていません。 7ページ目でC=7となり変数を渡せなかったためエラーとなってしまします。 "<a href='?c={$i}'>{$i}</a> "だけですと「c」でGETできているのですが2ページ目から変数を渡せないためエラーが出てしまします。 javascriptを使わずに"<a href='?c={$i}'>{$i}</a> "で変数を渡す方法がないか色々と方法を探っていますが解決できておりません。
efu_akio

2016/12/29 04:59

変数を$_SESSION[]で引き渡すことで解決いたしました。 ページングの構造、詳しく説明いただきありがとうございました。
guest

0

for文のところ解説

//1から最大ページまでループ for ($i=1;$i<=$maxpage;$i++) { //ページリンク追加 $pagelink = $pagelink."<a href=\"#\" onclick=\"changepage('".$i."');return false;\">"; //現在ページであれば if ($i==$page) { //フォントサイズを変える $pagelink = $pagelink."<font size=\"+2\">".$i."</font></a> "; } else { $pagelink = $pagelink.$i."</a>\n"; }

以下のようなコードを加えたらよさそう

//10ページ超えたら } else if ($i>10) { //リンク文字を「次へ」 $pagelink = $pagelink."次へ</a>\n"; //ループを抜ける break;

投稿2016/12/21 15:02

lightwill

総合スコア962

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

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

efu_akio

2016/12/21 16:04

ご連絡ありがとうございます。 実装しました、10ページの後の「次に」をクリックしますと11ページ目に遷移できました。 11ページ目に遷移した後に出てくる「次に」をクリックしたら元の10ページと「次に」に戻ってしまいます。その次に+1づつするのでしょうが、理解不足でどのようにすればよいのか?ご教示いただけると助かります。(自分でも調べてみます。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問