ページングで「前の○件」の方法

このQ&Aのポイント
  • PHP4とMysqlで検索システムを作っている際、ページングで「前の○件」を実装する方法がわかりません。
  • 現在のページで表示するデータを取得する際に、開始レコード位置と終了レコード位置を設定しています。
  • 次のページで表示するレコードがあるかを判定し、リンクを提供することで「次の○件」を実現しています。
回答を見る
  • ベストアンサー

ページングで「前の○件」の方法

お世話になります。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); よろしくお願いします。

  • tak-
  • お礼率100% (2/2)
  • PHP
  • 回答数1
  • ありがとう数4

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

実は ・最初の○件 ・次の○件 ・前の○件 ・最後の○件 ・○ページ目を表示する は、全部同じ処理です。 ・最初の○件 「何件目から表示するか」を「1件目」にしてから処理する ・次の○件 「何件目から表示するか」を「今表示した件数 + 1件目」にしてから処理する ・前の○件 「何件目から表示するか」を「今表示した件数 - 1ページの表示件数」にしてから処理する ・最後の○件 「何件目から表示するか」を「全体の件数 - 1ページの表示件数」にしてから処理する ・○ページ目を表示する 「何件目から表示するか」を「1ページの表示件数 × ページ番号 + 1 - 1ページの表示件数」にしてから処理する つまり、どの処理も「最初に、何件スキップするか」だけが違うのみで、後は全部同じ処理なのです。どのページを表示するにしても、毎回、クエリを実行します。 例えば、現在の表示結果が「41件目から60件目までの20件」だった場合は、 ・最初の20件 「何件目から表示するか」を「1」にする。 ・次の20件 「何件目から表示するか」を「61」にする。 ・前の20件 「何件目から表示するか」を「21」にする。 ・最後の20件 「何件目から表示するか」を「総件数-20」にする。 ・5ページ目を表示する 「何件目から表示するか」を「81」にする。 のようになります。応用すれば、 1ページ目を表示→「何件目から表示するか」を「1」にする。 2ページ目を表示→「何件目から表示するか」を「21」にする。 3ページ目を表示→「何件目から表示するか」を「41」にする。 のように「直接、○ページ目に飛ぶ」と言うのも可能です。

tak-
質問者

お礼

ありがとうございました!!PHPは最近勉強し始めた所でまだスキルはかなり低いですが頑張って作ってみます。

tak-
質問者

補足

またまたすいません。教えてください。試行錯誤して作ってみたのですが、最終のページがうまくいきません。全部で96件あるのですが、test.php?page=9とtest.php?page=10が同じ表示(81~90)になってしまいます。そしてtest.php?page=11にすると最終ページになりますがtest.php?page=10のページで「次の10件」が表示されないので飛べません。また、$page -= 2を$page --;にしてみると前に戻らず現在の表示だけになってしまいます。最終ページの構文はどんな感じになるのでしょうか。よろしければお願いします。 define ( 'PAGE_MAX', 10 ); $page = $_GET['page']; if ( $page == "" ) { $page = 1; } // 最初のページで表示するレコードがあるか $link3 = "<a href=\"test.php?page=1\">最初の10件"; // 総レコード数を取得 $sql = "select count(*) from test2"; $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."件"; } // 前のページで表示するレコードがあるか if ( $page <> 0 ) { $page -= 2; $link2 = "<a href=\"test.php?page=$page\">前の".PAGE_MAX."件"; } //最初のページの場合 if ( $page == 0 ) { $link2 = " "; }

関連するQ&A

  • 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
  • PHP 10件表示 "前へ" "次へ"

    現在PHPとMYSQLを使用しております。  SQLでデータベースから$fldが一致したデータだけ抽出したデータを 10件ずつ表示させて”次へ”を押すと11~20件目が表示。 また”次へ”を押すと...といった感じに"次へ"と"前に"を表示させたいのですがどうしてもやり方がおもいつきません。  どなたかご存知の方ご教授お願いできませんでしょうか。 ここに今出来ていますスクリプトを記載させて頂きます。 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
  • 検索結果($_POST)が2ページ目以降は消える

    PHP+MySQLで分割ページを作っています。 検索結果のページを分割しているのですが、2ページ目以降に検索されたレコードが表示されません。 1).2ページ目以降に続きのレコード(下記では21件目以降)を表示させるには、どうすれば良いのでしょうか。 2).上記には関係ないのですが、「<?= $msg ?>」で検索結果の総数を表示したいのですが、「1」としか表示されません…ついでで良いので、ご指摘いただけたらと思います。 <?php $keyword = $_POST['keyword']//検索ワードになります、下記の例では使用していません ?> <?php //データベース接続 $page = $_REQUEST['page']; if ($page == '') { $page = 1; } $page = max($page, 1); // 最終ページを取得する $sql = 'SELECT COUNT(*) AS cnt FROM table1'; $result = mysql_query($sql); $rows = mysql_fetch_assoc($result); $maxPage = ceil($rows['cnt'] / 20); $page = min($page, $maxPage); $start = ($page - 1) * 20; $result = mysql_query('SELECT * FROM table1 LIMIT ' . $start . ',20'); $rowss = mysql_num_rows($sql); //表示するデータを作成 if($rows){ while($row = mysql_fetch_array($result)) { $tempHtml .= "<tr>"; $tempHtml .= "<td>".$row["id"]."</td><td>".$row["name"]."</td><td>".$row["mail"]."</td>"; $tempHtml .= "</tr>\n"; } $msg = "".count($rowss).""; }else{ $msg = "sorry"; } //結果保持用メモリを開放する mysql_free_result($result); ?> //下記から、HTML部に表示しています <?php $start_a = ($start + 1); print "".$start_a."件~"; $start_b = ($start + 20); print "".$start_b."件を表示しています(".$page."ページ目/全".$maxPage."ページ)<br>"; if ($page > 1) { print "<a href=\"page.php?page=".($page - 1)."\">前のページへ</a>  "; } else { print "前のページへ"; } if ($page < $maxPage) { print "<a href=\"page.php?page=".($page + 1)."\">次のページへ</a>  "; } else { print "次のページへ"; } ?> <?= $msg ?> 何卒、よろしくお願い致します。

    • ベストアンサー
    • PHP
  • mysql_query等でレコード数を変数に格納

    mysql> SELECT COUNT(id) AS rows FROM someTABLE WHERE name IN ( 'A','B','C' ) ; で +------+ | rows | +------+ | 9 | +------+ と出すことができます。 この rows の数「9」を php の変数に入れたいのです。 <?php // DB接続省略 $sql = "SELECT COUNT(id) AS rows FROM someTABLE WHERE name IN ( 'A','B','C' )" ; $result = mysql_query($sql, $conn); var_dump($sql."<br />"); echo ($result."--result"."<br/>"); $rows= mysql_num_rows($result); echo ($rows."--rows"."<br/>"); ?> として、ブラウザで確認すると string(80) "SELECT COUNT(id) AS rows FROM someTABLE WHERE name IN ( 'A','B','C' ) " Resource id #3--result 1--rows となって、 $rows に値’9’が入りません。$rows にレコード数を取得させるには、どうすれば良いでしょうか?

    • ベストアンサー
    • PHP
  • 構文の省略について

    下記をもっと省略(短い構文で)して書きたいのですが、どのようなやり方があるでしょうか。 testというテーブルから指定したidのnameを取り出して並べたいだけなのですが、このような長々としたものしか思い浮かびませんでした。 <?php $n1 = 1; $n2 = 2; $n3 = 3; $rs1 = mysql_query("select * from test where id = '$n1';",$conn); $rec1 = mysql_fetch_array($rs1, MYSQL_ASSOC); echo $rec1['name']; echo <br>; $rs2 = mysql_query("select * from test where id = '$n2';"); $rec2 = mysql_fetch_array($rs2, MYSQL_ASSOC); echo $rec2['name']; echo <br>; $rs3 = mysql_query("select * from test where id = '$n3';"); $rec3 = mysql_fetch_array($rs3, MYSQL_ASSOC); echo $rec3['name']; mysql_free_result($rs1); mysql_free_result($rs2); mysql_free_result($rs3); mysql_close($conn); ?>

    • ベストアンサー
    • 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
  • 大阪府(25件)みたいなカウントをするには?

    データベースサイトによくある 大阪府(25件) 奈良県(11件) 三重県(18件) のような、それぞれのカウントをしたいのですが 重くて、表示に大変時間がかかります。 PHPで $query = " SELECT `field` FROM `table` WHERE `field` = $seach "; //実行 $num_sql = mysql_query($query); //件数取得 $num_rows = mysql_num_rows($num_sql); のような、クエリを、項目数分まわしてるのですが、 このやり方だと重くなるみたいです。 なにかもっと軽く動作させるやり方があれば アドバイスお願いします。 データは約二万件、カウントさせたい項目数は57あります。

    • ベストアンサー
    • MySQL
  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • for文で表示する画像を10件づつ読み込みたい

    データベースに格納した数100件の画像をphpで一覧表示する際に、 一気に読み込まないで10件づつ表示するという形を取ろうとしています。 最初に10件の画像を表示しておいて、 下部にある「もっと見る」のリンクをクリックしたら次の10件を表示する、という機能を 実装したいのですが、良い方法はないでしょうか? 全画像を表示した際のソース $sql .= "SELECT ~"; $result = mysql_query("{$sql}"); $num = mysql_num_rows($result); for($i = 0; $i < $num; $i++){ $arr = mysql_fetch_array($result); <img src="<?php echo $arr[img_path]; ?>" /> }

    • ベストアンサー
    • PHP
  • 複数のテーブルのレコードをカウントする方法

    2つのテーブルのレコード数をカウントする方法を教えてください。 $sql = "SELECT * FROM テーブル1 and テーブル2"; $res = mysql_query($sql,$myLink); $num_k = mysql_num_rows($res); こんな感じでカウントできるかと思ったのですが出来ませんでした。 宜しくお願い致します。

    • ベストアンサー
    • MySQL

専門家に質問してみよう