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

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

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

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

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

Q&A

解決済

1回答

1214閲覧

PHPでページネーションがうまく機能しない

spcl

総合スコア19

PHP

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

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

0グッド

0クリップ

投稿2018/08/12 02:44

編集2018/08/12 05:20

質問失礼します。

現在ローカル環境でphpの勉強をしており、ページネーションを造ろうとしているのですが、
ページネーションがうまく機能しません。
次のページを押下すると1ページ目と同じ内容が表示されます。

エラーはNotice: Undefined indexと表示されるので調べたところ
初回アクセス時と2回目以降のアクセスで処理を切り分けていないということっぽいのですが
解決方法が分かりません。

解決方法をご存知の方がいらっしゃいましたらご教授よろしくお願いいたします。

追記です。
少しコードを修正しました。
「前のページへ」と「次のページへ」のリンク設定のコードをechoからprintに変えました。
するとページ送りはうまく動きましたがエラーの表示は消えません。

新しいコードです。

<?php require('dbconnect.php'); $page = $_REQUEST['page']; if($page ==''){ $page = 1 ; } $page = max($page, 1); //最終ページを取得 $cnt = $mysqli->query('SELECT COUNT(*) AS cnt FROM menu'); $table = mysqli_fetch_assoc($cnt); $maxPage = ceil($table['cnt'] / 5); $page = min($page, $maxPage); $start = ($page - 1) * 5; ?> <div id="menu_list"> <table class="menu_list"> <tr> <th>商品管理ID</ht> <th>カテゴリー</ht> <th class="menu_name">商品名</ht> <th>価格</ht> <th class="menu_remarks">備考</ht> <th>編集</ht> <th>削除</ht> </tr> <?php $recodeSet = $mysqli->query('SELECT * FROM menu ORDER BY id LIMIT '.$start.',5'); while($table = mysqli_fetch_assoc($recodeSet)){ ?> <tr> <td class="menu_content"><?php echo(htmlspecialchars($table['id'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['kind'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['name'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['price'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['remarks'])); ?></td> <td class="menu_content"><a href="update.php?id=<?php echo(htmlspecialchars($table['id'])); ?>">編集</a></td> <td class="menu_content"><a href="delete.php?id=<?php echo(htmlspecialchars($table['id'])); ?>" onclick="return confirmation();">削除</a></td> </tr> <?php } ?> </table> <ul class="paging"> <?php if($page > 1){ ?> <li><a href="index.php?page=<?php print($page - 1); ?>">前のページ</a></li> <?php } else { ?> <?php } ?> <?php if($page < $maxPage){ ?> <li><a href="index.php?page=<?php print($page + 1); ?>">次のページ</a></li> <?php } else { ?> <?php } ?> </ul> <a href="http://localhost/menu/input.php">商品登録</a> <a href="http://localhost/menu/menu-retrieval.php">カテゴリー別一覧</a> </div>

↓↓↓はechoからprintに変える前のコードです。

<?php require('dbconnect.php'); $page = $_REQUEST['page']; if($page ==''){ $page = 1 ; } $page = max($page, 1); //最終ページを取得 $cnt = $mysqli->query('SELECT COUNT(*) AS cnt FROM menu'); $table = mysqli_fetch_assoc($cnt); $maxPage = ceil($table['cnt'] / 5); $page = min($page, $maxPage); $start = ($page - 1) * 5; ?> <div id="menu_list"> <table class="menu_list"> <tr> <th>商品管理ID</ht> <th>カテゴリー</ht> <th class="menu_name">商品名</ht> <th>価格</ht> <th class="menu_remarks">備考</ht> <th>編集</ht> <th>削除</ht> </tr> <?php $recodeSet = $mysqli->query('SELECT * FROM menu ORDER BY id LIMIT '.$start.',5'); while($table = mysqli_fetch_assoc($recodeSet)){ ?> <tr> <td class="menu_content"><?php echo(htmlspecialchars($table['id'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['kind'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['name'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['price'])); ?></td> <td class="menu_content"><?php echo(htmlspecialchars($table['remarks'])); ?></td> <td class="menu_content"><a href="update.php?id=<?php echo(htmlspecialchars($table['id'])); ?>">編集</a></td> <td class="menu_content"><a href="delete.php?id=<?php echo(htmlspecialchars($table['id'])); ?>" onclick="return confirmation();">削除</a></td> </tr> <?php } ?> </table> <ul class="paging"> <?php if($page > 1){ ?> <li><a href="index.php?page=<?php echo '$page - 1'; ?>">前のページ</a></li> <?php } else { ?> <?php } ?> <?php if($page < $maxPage){ ?> <li><a href="index.php?page=<?php echo '$page + 1'; ?>">次のページ</a></li> <?php } else { ?> <?php } ?> </ul> </div>

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

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

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

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

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

guest

回答1

0

ベストアンサー

次のページを押下すると1ページ目と同じ内容が表示されます。

1ページ目と2ページ目が同じクエリで実行されているのでは?
提示のコードを動かしたわけじゃないので(動かせないし)、目視でデバッグして見ます。

最初に疑うのは、ここ。

php

1$recodeSet = $mysqli->query('SELECT * FROM menu ORDER BY id LIMIT '.$start.',5');

$start が 1ページ目の時は 0 になっているか。まあ、ここは大丈夫なんでしょう。きっと。
2ページ目の時、$start5 になっていなければならない、ということは理解していますかね?

では、デバッグして見ましょう。

このコードではデバッグしにくいので、以下のように変更します。

php

1$statement = 'SELECT * FROM menu ORDER BY id LIMIT '.$start.',5'; 2var_dump($statement); // ここで値を確認(デバッグしない時はコメントアウトする) 3$recodeSet = $mysqli->query($statement);

こうやって、一つ一つ確認しよう。
どこを直せば良いかは、わかってはいるのですが、自分でデバッグもできないようではこの先まずいので、ここまでやって見てください。

では後ほど、続きを。

投稿2018/08/12 07:05

編集2018/08/12 07:05
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

spcl

2018/08/14 06:38

Kosuke_Shibuya様 ご回答ありがとうございます。 返信が遅くなり申し訳ないです。 >$start が 1ページ目の時は 0 になっているか。まあ、ここは大丈夫なんでしょう。きっと。 >2ページ目の時、$start が 5 になっていなければならない、ということは理解していますかね? はい。理解できています。 Notice: Undefinedが表示されますが今は正常に動きます。 お教えいただいたコードを記述しても Notice: Undefinedのエラーは解消されません。 エラーが出ているのは $page = $_REQUEST['page']; の部分です。
spcl

2018/08/14 06:43

var_dumpで見たところ、'.$start.'は正常な値になっていました。
退会済みユーザー

退会済みユーザー

2018/08/14 06:44

> Notice: Undefinedが表示されますが今は正常に動きます。 Notice はエラーではなく、「Notice」です。 error_reporting で出力される文字列は、深刻度が高い順から、Fatal, Error, Warning, Notice のようになります。この文脈で、Notice をエラーと表現するのは間違いです。 また、QAサイトにおいては、エラーは省略せず、全て記述してください。往往にして誤解が生じます。
退会済みユーザー

退会済みユーザー

2018/08/14 06:47

「var_dumpで見たところ、'.$start.'は正常な値になっていました。」これでは情報が伝わりません。 1ページ目の時に、$start は幾つなのか、2ページ目の時 $start は 幾つだったというように書かなければ、正しいチェックをしたのかどうかが私にはわかりません。
spcl

2018/08/14 08:08

たびたびのご回答ありがとうございます。 >Notice はエラーではなく、「Notice」です。 なるほどです! >エラーは省略せず、全て記述してください。 Notice: Undefined index: page in C:\xampp\htdocs\menu\index.php on line 22 になります。 on line 22は$page = $_REQUEST['page'];にあたります。 $startは1ページ目では0、2ページ目では5、3ページ目では10となっています。
退会済みユーザー

退会済みユーザー

2018/08/14 08:22

まず、Notice のメッセージ(それだけではありませんが)が出た時何をすれば解決方法にたどり着けるのかを説明します。 まず、書かれていることを読みます。 Notice: Undefined index 「注意:定義されていない index、page が〜の 22行目にあります。」 という意味ですね。 $page = $_REQUEST['page']; ここで、問題になっていることが読み取れているのですから、理解は早いと思います。 基本的に、エラーメッセージはそのままググれば、解決方法はHITします。 ただし、このばあい、page や C:\xampp\htdocs\menu\index.php on line 22 の部分はあなたのソースコードでしか現れない文字列なので、ワイルドカードに置き換えておきます。 「Notice: Undefined index: * in *」 これをそのままGoogle検索します。こんな感じで https://www.google.com/search?q=Notice%3A+Undefined+index%3A+*+in+*&ie=utf-8&oe=utf-8&client=firefox-b-ab これで大抵、見つかります。
退会済みユーザー

退会済みユーザー

2018/08/14 08:37

ここまでやって見て、どのページを参考にしたのか、その結果、どうしたのかを記述願います。
spcl

2018/08/15 11:25

解決できました! http://d.hatena.ne.jp/sagra-da/20120405/1333587852 ↑のページを見ていた際issetを目にしissetでいけるか試したところいけました! 書いたコードはこんなかんじです。 if (isset($_REQUEST['page'])) { $page = $_REQUEST['page']; } else { $page = 1; } これで初回アクセス時も1ページ目と分かるというになったと解釈しています。
退会済みユーザー

退会済みユーザー

2018/08/15 11:37

OKです。 では、次に何をすれば良いのかは、わかりますか?
spcl

2018/08/17 07:59

何度もありがとうございます! 次!? お恥ずかしながらできた!と完成した気分になっていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問