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

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

ただいまの
回答率

90.48%

  • PHP

    20817questions

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

ページング機能について

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 348

SayakaxxSakura

score 12

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>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yambejp

    2017/09/26 15:00

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

    キャンセル

  • SayakaxxSakura

    2017/09/26 15:05

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

    キャンセル

  • kei344

    2017/09/26 15:28

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

    キャンセル

回答 4

+3

ページングで最低限必要なものは以下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]


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

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

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


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

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


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/26 15:37

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

    キャンセル

  • 2017/09/26 16:14

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

    キャンセル

  • 2017/09/26 16:16

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

    キャンセル

  • 2017/09/26 16:19

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

    キャンセル

  • 2017/09/26 16:48

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

    キャンセル

  • 2017/09/26 16:49

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

    キャンセル

  • 2017/09/26 17:32

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

    キャンセル

  • 2017/09/26 17:35

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

    キャンセル

  • 2017/09/26 17:49

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

    キャンセル

  • 2017/09/26 23: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): ?>

    ```
    上記のコードに書き換えたところ思い通りの挙動になりました。
    改めて本当にありがとうございました。

    キャンセル

  • 2017/09/27 09:29

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/26 22:58

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

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/26 22:59

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

    キャンセル

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    PHPでページング機能の仕組みを知りたい。

    題名の通り、PHPでページング機能の仕組みを知りたいです。主にページ番号が表示されるページング機能が知りたいです。 wordpressで実装するためです。 どうすればGoogl

  • 解決済

    PHPで質問フォームを作ったところ、$_POSTがうまくいかない

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>narratica</t

  • 解決済

    [PHP]POSTに失敗してしまいます

    PHP勉強中の者です。現在自動販売機作成ツールの管理画面を作成しているのですが、POSTの処理につまずいてしまっています。 ご教授頂ければ幸いです。 現在作成しているコードは以下の

  • 解決済

    phpでXMLの内容を修正

    PHPを使い、入力フォームから商品情報を入力してXMLに入れ、そのXMLの内容を別ページで修正し、修正ボタンを押すと「修正しました」というページに行くというものを以下のように作った

  • 受付中

    レスポンシブルデザインについて

    ページ上部のメニューをクリックしたらスマホのサイトのようなメニューバーを表示させたいのですがどうすればよろしいでしょうか。 ちなみにこちらのサイトを参考にしました https://

  • 解決済

    レスポンシブデザインについて

    この画像の上部の油そば池袋とありますが幅を小さくしていくと 赤枠の箇所に油そば池袋と入れたいのですがどうすればよろしいでしょうか <!DOCTYPE html> <html

  • 解決済

    セレクトボックスで選択した際、そのときのパラメータも一緒に渡したい

    お世話になります。 GETで渡されたパラメータを基に検索結果を返しているページがあります。この時のデータをA群とします。 そのページ内にセレクトボックスを設け、セレクトボッ

  • 解決済

    2つのform から得られたPHPの変数を同時に保持したい

     前提・実現したいこと 2つのform から得られたPHPの変数を同時に保持したい  発生している問題・エラーメッセージ 片方を実行すると、もう片方の変数がリセットされてしまう

同じタグがついた質問を見る

  • PHP

    20817questions

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