ページングのページ情報が更新されない

このQ&Aのポイント
  • PHPとMySQLを用いてページング処理をさせたいと思いましたが、うまくいきませんでした。
  • ページ情報が更新されません。はじめにページ情報の有無を判定して、ない場合、初期値として1を入れてその後の処理につなげると思うのですが、「次へ」をクリックしても同じページになります。
  • うまくページ情報が受け渡されていないのが原因だと思うのですが・・・
回答を見る
  • ベストアンサー

ページングのページ情報が更新されない

PHPとMySQLを用いてページング処理をさせたいと思いましたが、うまくいきませんでした。 1ページあたり10件表示させるというプログラムです。 具体的に問題点を挙げると、ページ情報が更新されません。 はじめにページ情報の有無を判定して、ない場合、初期値として1を入れてその後の処理につなげると思うのですが、「次へ」をクリックしても同じページになります。 ためしに、初期値を2にしてみると、2ページ目が表示されるので、表示の部分は間違っていないと思うのですが・・・ うまくページ情報が受け渡されていないのが原因だと思うのですが・・・ プログラムの一部です。 データベースからデータ件数を出し、ページの初期値を設定 $pagesize = 10; if(!isset($page)){ $sql = <<<EOS (省略) EOS; $result = $conn->query($sql); if (DB::isError($result)) { die ($result->getMessage()); } $count = $result->numRows(); $page = 1; } 次に、リンク部分です。 if($totalpage > 1 and $page < $totalpage){ ?> <?php print "<a href = '$PHP_SELF?page=" .($page+1). "&count=$count'>"."次の$pagesize 件&gt;</a>&nbsp;&nbsp;&nbsp;";?> <?php print "<a href = '$PHP_SELF?page=$totalpage&count=$count'>最後へ&gt;&gt;</a>";?> 原因が分かる方がいらっしゃいましたらよろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

問題箇所は違う場所にあるんじゃないでしょうか。 $pageがあったら・・・なので、if(!isset($page))に対するelseの部分で発生するのかな?と思います。 SQLに含まれるOFFSETの値は $page * $pagesize - $pagesize SQLに含まれるLIMITの値は $pagesize こんな感じで動作しているのであれば問題なく動作するんじゃないでしょうか? <?php $page = (isset($_GET['page']) && preg_match("/^[0-9]{1,3}$/", $_GET['page'])) ? $_GET['page'] : 1; $pagesize = 10; $offset = $page * $pagesize - $pagesize; $sql = "SELECT * FROM ???? OFFSET $offset LIMIT $pagesize"; $result = $conn->query($sql); if (DB::isError($result)) { die ($result->getMessage()); } $count = $result->numRows(); こんな風に最初に$pageを設定してあげると簡単な気がします。

anzyaa
質問者

お礼

回答ありがとうございます。 おっしゃるとおり、elseの部分で問題があったようです。 根本的にプログラムを考え直し、$paseの有無で判断するのではなく、$pageがあろうがなかろうが毎回、URLに含まれるページ番号を取得し、それをLIMITに設定することで解決しました。 サンプルプログラムも提示して頂き、参考になりました。 ありがとうございました。

関連するQ&A

  • ページングについて

    <?php /* データベース関連のデータをインクルード */ /* 1ページあたりの表示件数を設定 */ $PAGESIZE = 5; /* MySQLに接続 */ /* データベースを選択 */ if (isset($_GET["page"])) { $page = $_GET["page"]; $tcnt = $_GET["tcnt"]; } /* 初めて呼ばれた時、総件数を取得 */ if (!isset($page)) { $sql = "select count(*) as cnt from board"; $rst = mysql_query($sql, $con); $col = mysql_fetch_array($rst); mysql_free_result($rst); $tcnt = $col["cnt"]; /* 現在のページを初期設定 */ $page = 1; } /* 総ページ数 */ $totalpage = ceil($tcnt / $PAGESIZE); $pagehead = "<b>$tcnt</b>件が投稿されています。<br>"; $pagehead .= "<b>[" . ($PAGESIZE * ($page - 1) + 1) . "-"; /* 最終ページより前のページ */ if ($page < $totalpage) { $pagehead .= ($PAGESIZE * $page) . "]</b>を表示"; } /* 最終ページ */ else { $pagehead .= "$tcnt]</b>を表示"; } /* 1ページ分だけ抽出するSQL文の組み立て */ $sql = "select * from board order by no desc limit "; $sql .= $PAGESIZE * ($page - 1) . ", $PAGESIZE"; /* 結果セットを取得 */ /* 結果セットからデータの読み込み */ /* 結果セットを破棄して接続を閉じる */ /* ページのナビゲーションを追加 */ if ($page > 1) { $page2 = $page - 1; $body .= "<a href = 'board.php?page=$page2&tcnt=$tcnt'>" . "<img src = 'img/arrow_left.gif' border = '0'><font class = 'brown'>前の<b> $PAGESIZE 件</b></a>&nbsp;&nbsp;</font>"; } if ($totalpage > 1 and $page < $totalpage) { $page3 = $page + 1; $body .= "<a href = 'board.php?page=$page3&tcnt=$tcnt'><font class = 'brown'>次の<b> $PAGESIZE 件</b>"; $body .= "<img src = 'img/arrow_right.gif' border = '0'></a></font>"; } ?> <html> <head> <title></title> <link rel="stylesheet" type="text/css" href="../Top/design.css"> </head> <body> <?= $pagehead ?> <?= $body ?> </body> </html> 長くて申し訳ありません。 コメントであらわした内容で、掲示板の投稿一覧を作成しています。 投稿一覧をページングして、表示させようとしているのですが・・・。 何度も次ページのリンク(ページのナビゲーション)を押さなければ、遷移しないのです・・・・。 どうか、わかる方ご教示願えないでしょうか。宜しくお願い致します。

    • 締切済み
    • PHP
  • MYSQL→PHP→10件表示

    現在phpを勉強しているのですがどうしても分からないことがあり、 質問をさせて頂きました。 PHPとMYSQLを使い、プルダウンメニューから検索した結果を 10件表示をしていきたいのですが、どうしてもうまくいかず混乱しております。 どのなたかご存知の方、お伺いしても宜しいでしょうか? $PAGESIZE = 10; //ここにmysqlに接続するスクリプト extract($_REQUEST); if (!isset($page)) { $page = 1; } if(!empty($fld)) { //$fldに検索したい住所が入ってます。 $local = addslashes($fld); $where .= "add1 = '$fld' && "; } if(!empty($where)) { $where = substr($where, 0, -3); $where = "WHERE " . $where; } $sql = "select count(*) as cnt from ○○ ". $where; $rst = mysql_query($sql); $row = mysql_fetch_array($rst); $tcnt = $row["cnt"]; mysql_free_result($rst); $totalpage = ceil($tcnt / $PAGESIZE); $pagehead = "<B>$tcnt 件みつかりました。 " . "[" . ($PAGESIZE * ($page - 1) + 1) . "-"; if ($page < $totalpage) { $pagehead .= ($PAGESIZE * $page) . "] を表示</B>"; } else { $pagehead .= "$tcnt] を表示</B>"; } $sql = "select * from ○○ ". $where. " order by renban desc limit " . $PAGESIZE * ($page - 1) . ", $PAGESIZE"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>登録データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ echo "<p>"; echo $row["renban"]; echo " "; echo $row["tourokubi"]; echo "<br />"; echo $row["people"]; echo " "; echo $row["add1"]; echo $row["add2"]; echo "-"; echo $row["sta"]; echo " "; echo $row["tel"]; echo $row["url"]; echo $row["sejitu"]; echo $row["pr"]; echo "</p><hr />"; } } ?> <?= $pagehead ?> <?php mysql_free_result($result); mysql_close; $param_local = rawurlencode($local); if ($page > 1) { $body .= "<A href = '$PHP_SELF?page=" . ($page - 1) . "&tcnt=$tcnt&local=". $param_local. $param_category. "'>" . "前の $PAGESIZE 件</A>"; } if ($totalpage > 1 and $page < $totalpage) { $body .= "<A href = '$PHP_SELF?page=" . ($page + 1) . "&tcnt=$tcnt&local=". $param_local. $param_category. "'>" . "次の $PAGESIZE 件</A>"; } ?> <?= $body ?> </body> </html>

    • ベストアンサー
    • PHP
  • ページングについて

    $countRe=$num_rows; pager($_GET["id"],$countRe); function pager($id,$countRe){ if($id=="") $id=1; $maxPage=ceil($countRe/5); if($maxPage==1 or $maxPage<$id) return false; if($id>6){ $startPage=$id-5; $startMore="<a href=\"$PHP_SELF?id=".($startPage -1)."\">&lt; PREV</a>"; }else{ $startPage=1; } if($id+5<$maxPage){ $endPage=$id+5; $endMore=" <a href=\"$PHP_SELF?id=".($endPage+1)."\">NEXT &gt;</a>"; }else{ $endPage=$maxPage; } $page_footer=""; for($i=$startPage;$i<=$endPage;$i++){ $page_footer.=" ".(($id==$i)?"<span style='font-Size:120%'>$i</span>":"<a href=\"$PHP_SELF?id=$i\">$i</a>"); } $page_footer=$startMore.$page_footer.$endMore; print $page_footer."<br>"; } 現在このようなコードでページングしています。 該当内容が10件未満ならリンクは出ず、10件以上なら「12」とリンクが出てくれるのは良いのですが、 1ページに11件表示され2ページにも同じ内容が11件表示されてしまいます。どのようにしたら、1ページ目で10件、2ページ目で1件表示してくれるのでしょうか??

    • 締切済み
    • PHP
  • ページング。困っています。

    分かる方はいませんか?? <?PHP $countRe=$num_rows; function pager($id,$countRe){ if($id=="") $id=1; $maxPage=ceil($countRe/10); if($maxPage==1 or $maxPage<$id) return false; if($id>6){ $startPage=$id-5; $startMore="<a href=\"$PHP_SELF?id=".($startPage -1)."\">&lt; PREV</a>"; }else{ $startPage=1; } if($id+5<$maxPage){ $endPage=$id+5; $endMore=" <a href=\"$PHP_SELF?id=".($endPage+1)."\">NEXT &gt;</a>"; }else{ $endPage=$maxPage; } $page_footer=""; for($i=$startPage;$i<=$endPage;$i++){ $page_footer.=" ".(($id==$i)?"<span style='font-Size:120%'>$i</span>":"<a href=\"$PHP_SELF?id=$i\">$i</a>"); } $page_footer=$startMore.$page_footer.$endMore; print $page_footer."<br>"; } ?> 現在、このようなソースでページングをしています。1ページにつき10件ずつ表示させたいのです。該当データ11件になったら、ちゃんとリンクが[1,2]と出てくれますが、1ページ目に11件、2ページ目でも11件出てしまいます。理想は説明不要だと思いますが、1ページ目に10件、2ページ目で余りの1件表示させたいです。このソースの問題ではなくSELECT文の問題なんでしょうか??LIMIT 0,10としたら11件該当しなければならないのに10件しか該当しないとなり、これはこれでおかしくなります。

    • 締切済み
    • PHP
  • ワードプレス固定ページのページングについて

    初めまして。WordPress・PHPの初心者で大変恐縮ではございますが、 ご質問させていただきます。 この度、固定ページに検索結果を表示し、その検索結果を件数指定し、 ページングを行いたいと考えています。 既にWordPress外では、実装でき正常動作を確認しているのですが、 WordPressの固定ページに組み込むと、2ページ目のリンク設定が 上手く行えておらず、誤動作してしまう状態です。 コードは同一ファイルに 【PHP】 if ($_POST["page"] !== "all") {    //取り出す最大レコード数    $lim = $_POST["page"];    //最初と最後のページ番号を定義    $first = 1;    $last = ceil ($num / $lim);        //表示するページ位置を取得    $p = intval ($temp_p);    if ($p < $first) {      $p = $first;    } elseif ($p > $last) {      $p = $last;    }    //表示するレコード位置を取得    $st = ($p - 1) * $lim;    //前後のページ移動数と表示数    //$page = 10 現在のページの前後10ページへのリンク番号を表示    //$page = 10 現在のページの前後10ページ目に移動    $page = 3;    //前後$pageページ移動した際のページ番号を取得    $prev = $p - $page;    $next = $p + $page;    //前後1ページ移動した際のページ番号を取得    $prev01 = $p - 1;    $next01 = $p + 1;    //$stから$lim件のデータを取得し、並べ替える    $sql .= " ORDER BY hoge LIMIT " . $st . "," . $lim . ";";    //ページ移動リンクの組み立て    //1ページ前のページ    if ($p > 1) {     $pagePrev = "<a href=\"$_SERVER[PHP_SELF]?p=$prev01\"><</a> ";    }    //各ページ番号への移動リンクを表示    for ($cnt = $p - $page; $cnt <= $last; $cnt++) {     if ($cnt < 1) {       $cnt = 1;     }     $pageNo = "<a href=\"$_SERVER[PHP_SELF]?p=$cnt\">$cnt</a> ";     //表示番号を指定数に区切る     //ページ番号と現在のページが同一の場合は     //リンク無しにする     if ($cnt <= $p + $page) {       if ($cnt == $p) {          $pageNo = $p;       }      }    }    //1ページ後のページ    if (($next01 - 1) * $lim < $reccnt) {       $pageNext = "<a href=\"$_SERVER[PHP_SELF]?p=$next01\">></a> ";    }    //最初のページへ移動    if ($p > 1) {       $pageFirst = "<a href=\"$_SERVER[PHP_SELF]?p=$first\">最初</a> ";    }    //前の$pageページへ移動    if ($p > $page) {       echo "<a href=\"$_SERVER[PHP_SELF]?p=$prev\"><<</a> ";    }    //次の$pageページへ移動    if (($next - 1) * $lim < $reccnt) {       echo "<a href=\"$_SERVER[PHP_SELF]?p=$next\">>></a> ";    }    //最後のページへ移動    if ($p < $last) {       $pageLast = "<a href=\"$_SERVER[PHP_SELF]?p=$last\">最後</a> ";    } } 【html】 <?php echo $pageFirst; echo $pagePrev; echo $pageNo; echo $pageNext; echo $pageLast; ?> としており、a href=\"$_SERVER[PHP_SELF]?p=$hoge が上手く行えて いないからだと自分では考えているので、hrefにこのファイルの指定や 私が思い当たる方法では試してみたのですが、やはり解決することはできませんでした。 説明が不十分で大変失礼かと思いますが、どういった原因が考えられるでしょうか? リンク以外の観点からも、アドバイスをいただければと考えております。 お力を貸していただければ大変嬉しく思います。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • phpphp,mysqlページングについて

    1つのphpファイルで作成を考えています。検索後(if($subsub){}を消せば)でなければページング機能は、可能です。1ページ目は、正常に表示しますが、2ページ目以降表示できません。データ保持ができません。同じ類の質問は、たくさん出てると思いますが・・・初心者ということもあり、ロジックがまだわかっていないのでできれば記述で教えていただければ幸いです。よろしくお願いします。 検索項目は、1項目で省略していますが、本来4~5項目で考えています。 <?php // データベースに接続する 省略 $test = $_POST[test]; echo' <form method="POST" action="".$_SERVER["PHP_SELF"].""> <tr> <input type="text" name="test"> <td><input type="submit" value="検索" name="subsub"></td> </form> '; //検索ボタンを押したら表示 if((isset($_POST['subsub']))or(isset($_GET['p'] ))){ //ページング処理 //総レコード数を取得する //条件がある場合は、where 条件式を書く $sql = "SELECT COUNT(*) AS reccnt FROM faq;"; $res = mysql_query($sql, $conn) or die ("データ抽出エラー"); $row = mysql_fetch_array($res, MYSQL_ASSOC); $reccnt = $row["reccnt"]; //取り出す最大レコード数 $lim = 3; //最初と最後のページ番号を定義 $first = 1; $last = ceil($reccnt / $lim); //表示するページ位置を取得 $p = intval($_GET['p']); if ($p < $first) { $p = $first; } elseif ($p > $last) { $p = $last; } //表示するレコード位置を取得 $st = ($p - 1) * $lim; //前後のページ移動数と表示数 $page = 3; //前後$pageページ移動した際のページ番号を取得 $prev = $p - $page; $next = $p + $page; //前後1ページ移動した際のページ番号を取得 $prev1 = $p - 1; $next1 = $p + 1; //SELECTコマンドを実行して、$stレコード目から$lim件の各データを取得し、大きい順に並べる $sql = "SELECT test FROM testtest WHERE test like '$test' ORDER BY id DESC LIMIT $st, $lim;"; $res = mysql_query($sql, $conn) or die ("データ抽出エラー"); echo' <table border="1"> <tr> <td>ID</td> <td>テスト</td> </tr> '; //取得したデータを一件ずつ表示 while($row = mysql_fetch_array($res, MYSQL_ASSOC)) { echo' <tr> <td>'.$row["id"].'</td> <td>'.$row["test"].'</td> </tr> '; } echo '</table>'; //ページ移動リンクの組み立て //1ページ前のページ if ($p > 1) { echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$prev1\"><</a></font>&nbsp"; } //各ページ番号への移動リンクを表示 for ($cnt = $p - $page; $cnt <= $last; $cnt++) { if ($cnt < 1) { $cnt = 1; } $pageno = "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$cnt\">$cnt</a></font>&nbsp"; //表示番号を指定数に区切る //ページ番号と現在のページが同一の場合は //リンク無しにする if ($cnt <= $p + $page) { if ($cnt == $p) { $pageno = "<font size=\"1\">$p</font>&nbsp"; } echo $pageno; } } //1ページ後のページ if (($next1 - 1) * $lim < $reccnt) { echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$next1\">></a></font>&nbsp"; } echo "<br>\n"; //最初のページへ移動 if ($p > 1) { echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$first\">最初</a></font>&nbsp"; } //前の$pageページへ移動 if ($p > $page) { // << を $page"."ページ戻る にする事もできる echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$prev\"><<</a></font>&nbsp"; } //次の$pageページへ移動 if (($next - 1) * $lim < $reccnt) { // >> を $page"."ページ進む にする事もできる echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$next\">>></a></font>&nbsp"; } //最後のページへ移動 if ($p < $last) { echo "<font size=\"1\"><a href=\"$_SERVER[PHP_SELF]?p=$last\">最後</a></font>&nbsp"; } } ?>

    • ベストアンサー
    • PHP
  • phpでページング処理の書き方

    環境:php+mysql サイト内検索をphpで書いてます。 ■やりたいこと 検索結果が10件として1ページの検索結果数を3件とした場合 ページングは4ページまでとして、最終ページの4ページ目で 「次へ」のボタンを非表示にしたいです。 ■現状 検索結果は表示されますが、検索結果ページで 「次へ」 や 「戻る」 ボタンをつけて動作する際、いつまでの「次へ」やボタンが表示されページングできてしまいます。。 実際に書いている処理 <?php if ($num > 3){//検索結果が3件以上でページングが表示される if($page>0){ echo "<a href='./re.php?key={$a}&pages=".($page-1)."'>前の3件</a>"; } echo "&nbsp;&nbsp;|&nbsp;&nbsp;<a href='./re.php?key={$a}&pages=".($page+1)."'>次の3件</a>"; } ?> if ($num > 3)で何か処理を書かなければならないと思いますが、、 アドバイスいただければ幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • limit ページング

    ページングにて1週間ほど悩んでおります。 $page = $_REQUEST['page']; $range = 5; if($page > 0) { $from = (($page - 1) * $range); } else { $from = 0; } $total_result = sprintf("SELECT COUNT(id) from test_db"); $totals = mysql_query($total_result); $total_pages = ceil($totals / $range); if ($page > 1) { echo '<a href ="?page=' .($page - 1). '">< 前の' . $range. '件</a>'; } if ($total_pages > 1 && $page < $total_pages) { echo '<a href ="?page=' .($page + 1). '">次の' . $range. '件 ></a>'; } $paged_result = "SELECT * from test_db limit " .$from. " , " .$range; $paged_results = mysql_query($paged_result); foreach($paged_results as $paged) { ・ ・ ・ } と省略しておりますが、この状態でループさせると、1ページで5件表示のはずが4件しか表示されません。 また初期表示でpage=0(URLには表示はされない)は1~5件目、page=1は6~10件目を表示させたいです。 お分かりのかたがいらっしゃいましたらご教示お願いします。

    • 締切済み
    • PHP
  • ページングで「前の○件」の方法

    お世話になります。PHP4とMysqlで検索システムを作っているのですが、「次の○件」は過去ログを利用してできたのですが「前の○件」がわかりません。「次の○件」の構文は以下のように書きました。 define ( 'PAGE_MAX', 10 ); $page = $_GET['page']; if ( $page == "" ) { $page = -1;} // 総レコード数を取得 $sql = "select count(*) from test"; $result = mysql_query ( $sql ); $rec = mysql_fetch_array ( $result ); // 総レコード数 $recMax = $rec[0]; // 次のページで表示するレコードがあるか if ( $recMax > PAGE_MAX * ($page+1) ) { $page ++; $link = "<a href=\"test.php?page=$page\">次の".PAGE_MAX."件";} // 現在のページで表示するデータを取得 // 開始レコード位置 $start = $page * PAGE_MAX; // 終了レコード位置 $max = PAGE_MAX; $sql= "select * from test LIMIT $start,$max"; $result = mysql_query($sql); $rows = mysql_num_rows($result); よろしくお願いします。

    • ベストアンサー
    • PHP
  • ページングでの値の引き継ぎ方

    1.html <form method="POST" action="l.php"> <input type="text" name="usersearch"/> <input type="submit" name="button" id="button" value="検索" /> </form> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 2.php $usersearch= $_POST['usersearch']; こんな感じにPHPで受け取ったとして 2.php で <?php $pid = $_GET['pid']; $countRe=$num_rows; pager($_GET["pid"],$countRe); function pager($pid,$countRe){ if($pid=="") $pid=1; $maxPage=ceil($countRe/10); if($maxPage==1 or $maxPage<$pid) return false; if($pid>10){ $startPage=$pid-9; $startMore="<a href=\"$PHP_SELF?pid=".($startPage -1)."\">&lt; PREV</a>"; }else{ $startPage=1; } if($pid+10<$maxPage){ $endPage=$pid+10; $endMore=" <a href=\"$PHP_SELF?pid=".($endPage+1)."\">NEXT &gt;</a>"; }else{ $endPage=$maxPage; } $page_footer=""; for($i=$startPage;$i<=$endPage;$i++){ $page_footer.=" ".(($pid==$i)?"<span style='font-Size:120%'>$i</span>":"<a href=\"$PHP_SELF?pid=$i\">$i</a>"); } $page_footer=$startMore.$page_footer.$endMore; print $page_footer."<br>"; } ?> こうした場合、<a href=\"$PHP_SELF?pid=".($endPage+1)."\">NEXT &gt;</a>"; この部分でリンクをクリックした場合、POSTした値が消えてしまっています。どうしたら引き継げますか??

    • 締切済み
    • PHP

専門家に質問してみよう