今現在DBへ試しに20件のデータが入っており、下記記述で20人分の表示がされている状態です。
1ページに5件づつ表示させたくて、色々とサイトを見て回っているのですが、
最初から全部を記述しているサイトがほとんどで理解できない状態です...
全部記述したあとに説明するより
まず、○○をする。
○○ができたから次は○○をする、というように順序だって組み立てていきながら解説して頂けると理解しやすいです。
ページング機能実装後の話になると思いますが、
下記の記述を1ページに5件ずつ表示するためにはどう組み合わせたらよろしいでしょうか?
$stmt = $pdo->query("SELECT user_data.id,birth_year,birth_month,birth_day,pref,city,major_category,major_skill,cont_date,introduction FROM user_data,user_pr WHERE user_data.id=user_pr.user_id ORDER BY id DESC;"); <main class="main"> <div class="main-in"> <article> <?php foreach ($stmt as $row) { echo 'EngineerNo.'.$row['id'].'<br />'; echo '<img src="" alt="">'; $birth = $row['birth_year'].sprintf('%02d', $row['birth_month']).sprintf('%02d', $row['birth_day']); echo '年齢:'.floor((date("Ymd")-$birth)/10000).'歳'; echo ' | '; echo '所在:'.$row['pref'].' '.$row['city']; echo ' | '; echo '専攻カテゴリー:'.$row['major_category']; echo ' | '; echo '専攻スキル:'.$row['major_skill']; echo ' | '; echo '契約可能時期:'.$row['cont_date'].'<br /><br />'; echo 'PR'.$row['introduction'].'<br /><br />'; echo '<hr>'; } ?> </article> </div> </main>
最終的には下記画像ようにしたいのですが、
現在のページが1ページなら「最初へ戻る」「前へ」リンクを表示させない
現在のページが1ページ以外なら「前へ」リンクだけを表示させる
現在のページが5ページ以上なら「最初へ戻る」リンクも表示させる
「next」リンクは6~10という風に5件刻みで表示させる
「last」リンクは、ページ数が22とか半端なら18~22という風に表示させる
表示されているページ数が18~22なら「last」リンクは表示させないが、17~21とかなら表示させる
という風にしたいのですが、何から手を付けて、このページング処理の考え方のポイントが分かりません。
ちなみに参考にしているサイトはこちらですが、どのサイトも一気に記述例を挙げていて組み立て方式ではないので理解できずです...
https://teratail.com/questions/8426
http://piyopi-yo.info/tori_wp/?p=91
http://www.webopixel.net/php/494.html
http://tenderfeel.xsrv.jp/php/639/
http://9jp.info/archives/11154
http://qiita.com/tabo_purify/items/fb902956c1e1a3c75041
http://ameblo.jp/yuu-sys-guard/entry-11893904475.html
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
まずページ分のデータを取得する方法から考えるとよいと思います。
DBからページごとのデータを取得するときはlimitとoffsetを使うのでページ毎に計算します。
(offsetとlimitは検索するとわかりやすいものが出てきます)
以下の $limit
には表示したいデータ数(ここだと5)、 $page
には表示したいページ数を渡します。
PHP
1$data = ~~; //←ページ繰りしたいデータを全て取得 2$total = count($data); //データが何件あるか 3$page_sum = $total / $limit; //何ページになるか 4$page_sum = ceil($page_sum) //小数点切り上げ 5$offset = $page*$limit;
現在のページが1ページなら「最初へ戻る」「前へ」リンクを表示させない
は if ($page > 1)
表示されているページ数が18~22なら「last」リンクは表示させない
は if ($page < $page_sum -1)
などで表示できると思います。
雑な説明ですが、考え方はこういう感じだと思います。
余談ですがフレームワークでは表示したい件数を渡すだけでページネーションを生成してくれるものも多いので、導入された方がよいかと思います。
投稿2016/06/24 02:59
総合スコア54
0
[PHP] ページング機能の仕組みとか作り方とか
質問中にも挙げられているサイトですが、
このサイトではかなり丁寧に順を追って説明されています。
このサイトでの説明だと、どこまでが分かってどこからはわからない感じでしょうか?
投稿2016/06/24 02:54
総合スコア18713
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/24 07:38
0
投稿2016/06/24 03:09
総合スコア114839
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/24 05:43
2016/06/24 05:59
2016/06/24 06:06
0
ページングとかページネーションは、PearのPager とか各フレームワークにもライブラリにもあるはずなので、それを使うのが楽だとは思います。
ですが、あえて自分で実装するというのであれば、
・パラメータで$pageなり用意してページ番号を取得する
・データを取得するときのselectとwhere句を同じにしてレコード数を取得
・全体のレコード数を1ページに表示したいレコード数で割ってページ数を算出
・ページ番号と表示するレコード数をを元に limit を使用してその範囲のデータを取得
みたいなことをゴリゴリとやる必要があります。
あとは、ページ番号がいくつかとか現在のページがどことかで、希望している処理が書けると思います。
投稿2016/06/24 02:55
総合スコア2208
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ページング処理・・
ロジックを口頭で説明って案外難しいですね。(普段感覚で作っているので)
全テーブルデータの件数
1ページに表示させるデータ件数
最大ページ数 = ( 全テーブルデータの件数 / 1ページに表示させるデータ件数 )
まずは上記の算出ですかね。(すぐできると思います。)
投稿2016/06/24 02:43
総合スコア236
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/24 02:45
0
*上記回答の続きです。
[サーバ側の流れ]
- データの準備
- 表示されるべきページ番号がユーザから渡される
$_GET["page"]等、ページャーのリンク内に含まれる。
$_GET["page"]が存在しない場合は1ページ目とする。
- 表示されるべきページに所属するデータを必要なだけ用意する
ページ番号が1で表示したいデータ数が10なら、1~10個目のデータを用意する。
MySQLなら、
SQL
1SELECT * FROM `テーブル名` LIMIT 0,10;
で1~10個目のデータを用意することが出来るので、LIMIT 0,10 を$_GET["page"]と表示したい1ページあたりのデータ数から取得できるような計算式を考える。
2ページ目だとLIMIT 10,20;
3ページ目だとLIMIT 20,30;
4ページ目だとLIMIT 30,40;
になるように一つの計算式で求められるようにする。
- データの表示
- データを表示用に整形する
データ部分は必要な形で表示すればOKです。これは既にできていると思うので割愛
- ページャーのリンクに必要な情報の準備
- 表示されるべきページ番号を「現在ページ」として変数に準備する
- 「現在ページ」から「ひとつ前のページ」「一つ後ろのページ」を計算してそれぞれ変数に準備する
- データの全体数を取得して、それを1ページ当たりの表示数で割り、全体で何ページあるか計算し、「総ページ数」を変数に格納する
- ページャーのリンク作成
- 総ページ数をforのループ回数条件にして、各ページのリンクを作成
- それとは別に「一つ前のページ」「一つあとのページ」のリンクを作って配置する
というのが全体の流れになります。
投稿2016/06/24 08:11
総合スコア18713
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/24 08:44
2016/06/24 09:06
0
ベストアンサー
最初へ、前へ、次へ、最後への表示切替はいきなりやるには複雑すぎるのでまずは「ページ数分だけリンクを並べて、各ページを正しく表示できる」ところを目指しましょう。
例えば例としてlist.phpでページング処理をするとして、5ページあったらリンク一覧はこんな感じになりますよね?
HTML
1<a href="/list?page=1">1</a> 2<a href="/list?page=2">2</a> 3<a href="/list?page=3">3</a> 4<a href="/list?page=4">4</a> 5<a href="/list?page=5">5</a>
するとlist.phpに$_GET["page"]の形で「何ページ目をクリックしたか」が渡されますよね?
そしたらSELECTのLIMITを使って「レコード全体の中から(ページ数*5)番目から5件引き出して表示」するだけです。例えば今は1ページに5件表示したいとのことですのでこんな感じになるでしょう。
PHP
1$page = $_GET["page"];//pageというパラメータに現在のページが入っているものとする 2$stmt = $pdo->prepare("SELECT user_data.id,birth_year,birth_month,birth_day,pref,city,major_category,major_skill,cont_date,introduction FROM user_data,user_pr WHERE user_data.id=user_pr.user_id ORDER BY id DESC LIMIT ?, 5;"); 3$stmt->execute([$page * 5]);
このように、prepareを使ってページ番号をSQLに渡してやることで、何ページ目であってもこのSQLで対応可能というわけです。試しにこう処理を変えた後に、URLに直接「?page=1」や「?page=2」と追加してジャンプしてみてください。動作が確認できると思います。
投稿2016/06/24 03:06
編集2016/06/24 06:41総合スコア9206
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/24 05:32
2016/06/24 05:38
2016/06/24 05:53
2016/06/24 06:03
2016/06/24 06:16
2016/06/24 06:39
2016/06/24 06:59 編集
2016/06/24 07:05 編集
2016/06/24 07:14
2016/06/24 08:39
2016/06/24 13:42
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/24 05:36
2016/06/24 06:04 編集