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

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

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

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

Q&A

解決済

4回答

1861閲覧

ページング機能について

SayakaxxSakura

総合スコア19

PHP

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

0グッド

0クリップ

投稿2017/09/26 05:58

編集2017/09/26 06:34

PHP初心者です
ページング機能についてお聞きしたいのですが、
現在、そこそこ商品数の多い商品ページを作っております。
横4列にコンテンツを並べforeach文で回してあるだけ表示させているのですが、
商品数に対して1枚の画像を表示させるようにしてるのでどうしてもサイトが重くなってしました。

そこでページング機能を作りたいのですが、どこを調べてもDBを使って〜
Mysqlに接続して〜
との回答が多く、自分はまだMysql等のデータベースを使う知識が全くありません。

そこで現状のコードでページング機能を実装するにはどうしたら良いのかを教えて頂けないでしょうか?
下記のコードで現在180件近くあるのですが、これをどうやって20件ずつに表示をして、ページング機能をつけるのか皆目検討もつきません、、、

###該当のソースコード

<form action="confirm.php" method="post"> <div class="menu-items"> <?php foreach($menus as $menu): ?> <div class="menu-item"> <img src="<?php echo $menu -> getImage(); ?>" class="catalog-image" alt="<?php echo $menu -> getJan() ?>"> <h3 class="catalog-title"> <a href="show.php?name=<?php echo $menu -> getName() ?>"> <?php echo $menu -> getName(); ?></a> </h3> <p class="menu-item-type">Category<i class="fa fa-angle-double-right" aria-hidden="true"></i><?php echo $menu -> getType()?></p> <p class="jan">JANCode<i class="fa fa-angle-double-right" aria-hidden="true"></i><?php echo $menu -> getJan() ?></p> <p class="price">¥<?php echo $menu -> getTaxPrice() ?>(税込)</p> <select name="<?php echo $menu -> getName()?>" class="select"> <option value="0">0<i class="fa fa-caret-down" aria-hidden="true"></i></option> <?php for($i = 1; $i <= 99; $i++): ?> <option value="<?php echo $i?>"><?php echo $i?></option> <?php endfor ?> </select> <span>個</span> </div> <?php endforeach;?> </div>

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

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

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

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

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

yambejp

2017/09/26 06:00

RDBをつかわずにデータはどのように管理しているのでしょうか?検索条件をつかって絞込などはしていないでしょうか?
SayakaxxSakura

2017/09/26 06:05

上記ファイルとは別に、data.php というファイルでインスタンスに引数としてデータを入力しています。例:$data1 = new Category("NAME",値段,'画像URL','カテゴリ名',コード);
kei344

2017/09/26 06:28

質問文のコードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
guest

回答4

0

ページングで最低限必要なものは以下3つ

  • カレントページ番号
  • 1ページあたりの表示データ数
  • 全データ数

これを取り出せるのであればあとはなんとでもなります。
またページャー自体の表示について

  • サンプリングするページ数
  • 次へ、前へをどうするか
  • ビッグムーブをどうするか

などの仕様を決める必要があります

たとえば180データを20データずつ表示し、サンプリング数を5とするなら
初期状態から順次こんな感じでシフトしていきます

[1] 2 3 4 5 (>) (>>) (<) 1 [2] 3 4 5 (>) (>>) (<) 1 2 [3] 4 5 (>) (>>) (<<) (<) 2 3 [4] 5 6 (>) (>>) (<<) (<) 3 4 [5] 6 7 (>) (>>) (<<) (<) 4 5 [6] 7 8 (>) (>>) (<<) (<) 5 6 [7] 8 9 (>) (<<) (<) 5 6 7 [8] 9 (>) (<<) (<) 5 6 7 8 [9]

この辺の仕様が固まればあとは実装するだけです

投稿2017/09/26 06:24

編集2017/09/26 06:26
yambejp

総合スコア114814

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

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

0

ベストアンサー

$menusに180件のデータが入っていると読み取って、以下のようにすることを提言します。

PHP

1<?php foreach($menus as $menu): ?> 2// ↓以下のように変更 3<?php foreach(array_slice($menus, (isset($_REQUEST['p'])?$_REQUEST['p']:0) * 20, 20) as $menu): ?>

pというクエリパラメータを「ページ番号」とし、180件の配列のうち、「20*ページ番号」番目から20件をforeachするように変更します。pがない場合、0ページ目として扱います。

PHP

1// 末尾に追加 2<?php for($i = 0; $i < Menu::getCount() / 20; $i++):?> 3<a href="今のページのURL?p=<?= $i ?>"><?= $i ?></a> 4<?php endfor;?>

これは「ページャ」と呼ばれるもので、書き方は適当ですがこれで0〜9のページへのリンクが生成されると思います。レイアウトは自分で組み直してみてください。

※あまり<?php ?><?= ?>の書き方で使ったことがないので、動かなかったらごめんなさい、適宜修正してください。

投稿2017/09/26 06:13

編集2017/09/27 00:31
masaya_ohashi

総合スコア9206

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

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

SayakaxxSakura

2017/09/26 06:37

お忙しい中ありがとうございます。 早速実装してみたところ無事20件表記に切り替えることができました! ですが、ページングするとhttp://localhost/?p=0の場合は1〜20件のデータが表示されるのですが、 それ以降は全てどの番号を教えても21件〜40件の結果しか表示がされません。 厚かましく申し訳ございませんが、追加回答をお願いできないでしょうか? よろしくお願いいたします。
masaya_ohashi

2017/09/26 07:14

2ページめ、3ページめを開いたとき、URLはどうなっていますか?ちゃんと?p=2や?p=3に変わっていますか?
SayakaxxSakura

2017/09/26 07:16

はい、上記の通りに?p=2 ?p=3となっております。
masaya_ohashi

2017/09/26 07:19

foreachの直前に<?= isset($_REQUEST['p'])?:0) ?>と書いて、ページを切り替えた際にどう表示されるか確認していただけますか?
SayakaxxSakura

2017/09/26 07:48

上記を記入したところエラー表記が出たためページが表示されなくなりました。
masaya_ohashi

2017/09/26 07:49

あ、すいません一個カッコが多かったです…<?= isset($_REQUEST['p'])?:0 ?> こうでした。
SayakaxxSakura

2017/09/26 08:32

ページが表示されるようにはなりましたが、特に変更なく index.phpのときは0〜20件 index.php?p=0 index.php?p=1 index.php?p=2 … は全て、21件から40件の表示で固定されています。
masaya_ohashi

2017/09/26 08:35

では <?= (isset($_REQUEST['p'])?:0) * 20 ?> の場合はどうなりますか?正しく 0, 20, 40, 60とページ移動ごとに20ずつ増加しますか?
SayakaxxSakura

2017/09/26 08:49

上記内容に変更してみましたが、変わらずです…。
SayakaxxSakura

2017/09/26 14:12

この度は、大変わかりやすくありがとうございました。 原因としてはエルビス演算子の ' p ' が取り出せてないという原因でした ``` <?php isset($_REQUEST['p'])? $_REQUEST['p'] *20 :0 * 20 ?> <?php foreach(array_slice($menus,isset($_REQUEST['p'])? ($_REQUEST['p'] -1 ) *20 :0 * 20, 20) as $menu): ?> ``` 上記のコードに書き換えたところ思い通りの挙動になりました。 改めて本当にありがとうございました。
masaya_ohashi

2017/09/27 00:29

確かに!すいませんでした、よく自分でもやらかす三項演算子の省略のミスです…最初issetを書かずに三項演算子を省略して書いて、後から「あ、配列だからissetで先に判定しないと無いときエラーになるやん」でissetだけ追記して失敗するやつです…回答も後々の閲覧者が同じ失敗をしないよう修正させていただきます。
guest

0

他の解答者さんたちが解答しているので

あえて別の視点で解答してみますね。

jQuery-DataTableというjQueryのプラグインを使うと自動でページングしてくれますよ。
静的なデータを読み込ませるだけです。

投稿2017/09/26 06:24

Tak1016

総合スコア1408

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

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

SayakaxxSakura

2017/09/26 13:59

ありがとうございます! Jqueryライブラリ非常に参考になりました!
guest

0

http://php.net/manual/ja/function.array-slice.php
phpでしたらarray_sliceが使えと思うので
$menusに対して
offsetに現在のページ数*20、lengthに20を入れてあげればページングが実現できると思います。

投稿2017/09/26 06:13

y_y3

総合スコア179

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

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

SayakaxxSakura

2017/09/26 13:58

ありがとうございます! 非常に参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問