• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ページ切り替え機能について)

ページ切り替え機能の改善方法

このQ&Aのポイント
  • 現在のページ切り替え機能の問題点として、32ページ目が終わりなのに33ページ目以降も表示されてしまうことがあります。
  • PHP4のコードを使用しているため、改善の余地があります。
  • 改善方法として、ページの表示数を10項目ずつに制限し、ページ数を正しく計算することが挙げられます。

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

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

どういう動きにしたいのでしょうか? 仮の動作としてベースを変えず、以下のコードで実行してみました。 <? $count = 320; $start_num = $_GET["start_num"]; $j=floor($count/10);//ページ数(10項目づつ表示) ?> <a href="./a.php?start_num=0">最初|</a> <? for($i=$start_num ;$i<=$start_num+9; $i++){ if($start_num<$j){ ?> <a href="./a.php?start_num=<?= $i ?>"><?=$i+1 ?>|</a> <? } } ?> <a href="./a.php?start_num=<?=$j ?>">最後</a> この場合、32ページ目を選択した時、$start_numは31です。 という事はf($start_num<$j)の条件に入ってしまいます。 そして33ページ目を選択した時は$start_numは32ですから、f($start_num<$j)は通りません。 というのが、現状の動作になってますね。 詳しい動きは分かりませんので、とにかく33ページ目というリンクを表示させたくないなら、 以下のコードでOKです。 <? $count = 321; $start_num = $_GET["start_num"]; $j=ceil($count /10) - $start_num;//ページ数(10項目づつ表示) ?> <a href="./a.php?start_num=0">最初|</a> <? for($i=$start_num ;$i<=$start_num+($j>9?9:$j - 1); $i++){ ?> <a href="./a.php?start_num=<?= $i ?>"><?=$i+1 ?>|</a> <? } ?> <a href="./a.php?start_num=<?=$j ?>">最後</a> そして、floor()じゃ、$countが321など、33ページ目の表示が必要な場合に対応できませんからceil()を利用します。

eccschool
質問者

補足

ご回答いただき有難うございます。 ご推察いただいたとおりの動きを目指しています。 ご回答いただいた内容の中の for($i=$start_num ;$i<=$start_num+($j>9?9:$j - 1); $i++){ の $i<=$start_num+($j>9?9:$j - 1); の部分が理解できませんでした。もう一度教えていただけるでしょうか? 宜しくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • php掲示板でページング機能を装備したいのですが

    下記のプログラムのみでは投稿が0にもかかわらず12345...10次へ » となってしまいます。理想は13件投稿の場合10件表示で、一ページ目は 13件中10件表示 1|2次へ>> としたいです。 PHP初心者です。どこに記述するかなど、できるだけ分かりやすくお願いいたします><申し訳ございません。 <?php function paging($limit, $page, $disp=5){ //$dispはページ番号の表示数 $next = $page+1; $prev = $page-1; $start = ($page-floor($disp/2)> 0) ? ($page-floor($disp/2)) : 1;//始点 $end = ($start> 1) ? ($page+floor($disp/2)) : $disp;//終点 $start = ($limit <$end)? $start-($end-$limit):$start;//始点再計算 if($page != 1 ) { print '<a href="?page='.$prev.'">&laquo; 前へ</a>'; } //最初のページへのリンク if($start>= floor($disp/2)){ print '<a href="?page=1">1</a>'; if($start> floor($disp/2)) print "..."; //ドットの表示 } for($i=$start; $i <= $end ; $i++){//ページリンク表示ループ $class = ($page == $i) ? ' class="current"':"";//現在地を表すCSSクラス if($i <= $limit && $i> 0 )//1以上最大ページ数以下の場合 print '<a href="?page='.$i.'"'.$class.'>'.$i.'</a>';//ページ番号リンク表示 } //最後のページへのリンク if($limit> $end){ if($limit-1> $end ) print "..."; //ドットの表示 print '<a href="?page='.$limit.'">'.$limit.'</a>'; } if($page <$limit){ print '<a href="?page='.$next.'">次へ &raquo;</a>'; } /*確認用 print "<p>current:".$page."<br>"; print "next:".$next."<br>"; print "prev:".$prev."<br>"; print "limit:".$limit."<br>"; print "start:".$start."<br>"; print "end:".$end."</p>";*/ } $limit = 10;//最大ページ数 $page = empty($_GET["page"])? 1:$_GET["page"];//ページ番号 paging($limit, $page); ?> またlogファイルなどの関連ファイル名はどこに記述されているかわからないので、このファイルをindex.phpにしたとして、ほかに必要なファイルがあれば教えていただきたいです。宜しくお願いいたします。 参考URL http://tenderfeel.xsrv.jp/php/639/

    • 締切済み
    • PHP
  • ページング機能はできたのですが、よりコード内容を理解しようと思っており

    ページング機能はできたのですが、よりコード内容を理解しようと思っており、疑問があります。 disp_log($page,$page,$max){・・・の第一$page、第二引数$pageが同じ値でデータを渡しておりますが、それぞれに代入される変数はユーザー定義関数内では同じ値として取り扱われるかと理解しており、disp_log($page,$max){でもいいような気がし、実際に実行すると前記と後期では実行結果が異なります。 よく理解できていないんですが、どなたかわかりやすいように教えてください。 <?php //http://tenderfeel.xsrv.jp/php/639/ $logdata = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"); $count = count($logdata);//ログの数 $max = 3;//1ページあたりの表示数 $limit = ceil($count/$max);//最大ページ数 $page = empty($_GET["page"])? 1:$_GET["page"];//ページ番号 //↓ここの部分です。  function disp_log($page,$page,$max){ global $logdata,$count; $start = ($page == 1)? 0 : ($page-1) * $max; $end = ($page * $max); /* 確認用 print "<p>"; print "count:".$count."<br>"; print "max:".$max."<br>"; print "start:".$start."<br>"; print "end:".$end."</p>";*/ print "<p>"; for($i=$start;$i<$end;$i++){ if($i>= $count){break;} print $logdata[$i]."<br>"; } print "</p>"; } function paging($limit,$page,$disp=5){ //$dispはページ番号の表示数 $page = empty($_GET["page"])? 1:$_GET["page"]; $next = $page+1;//前のページ番号 $prev = $page-1;//次のページ番号 if($page != 1 ) {//最初のページ以外で「前へ」を表示 print '<a href="?page='.$prev.'">≪ 前へ</a>'; } if($page <$limit){//最後のページ以外で「次へ」を表示 print '<a href="?page='.$next.'">次へ ≫</a>'; } /*確認用 print "current:".$page."<br>"; print "next:".$next."<br>"; print "prev:".$prev."<br>";*/ } /* $limit = 10;//最大ページ数 $page = empty($_GET["page"])? 1:$_GET["page"];//ページ番号 paging($limit, $page); */ paging($limit,$page); disp_log($page,$page,$max); ?>

    • ベストアンサー
    • 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
  • ページングのページ情報が更新されない

    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
  • 【PHP】 リンクに関した質問です。

    ブログを作成しいて、【最新コメント者】と言う所には、各日記の記事に対してコメントを 付けた方の名前が最新順に記される様にしています。 例えば… 【最新コメント者】 おはよう君 こんばんわ君 ・ ・ ・ おやすみ君 …と言う様に、それで今回の質問とは、その【最新コメント者】の所の名前をクリックしたら その名前の方が付けたコメントの記事にリンクする様にするにはどうしたらよいでしょうか? よろしくお願い致します。教えて下さいませ。 ◆ 【最新コメント者】の表示させるPHPソースの所では次ぎの様にしてあります。 <?php //log.txt は、コメントのログファイルです。 //$name には、コメントを付けた方の名前です。 //$bo には、コメントを付けた所の日記記事の番号(インデックス)です。 $log = file("log.txt"); for($i=0; $i<sizeof($log); $i++){ list($bo,$name) = explode( "," , $log[$i]); print "<a href=\"#$bo\">".$name."</a><br>\n"; } ?> ◆ 各日記の記事の最初のソースの所では次ぎの様にしてあります。 <?php //$no には、日記の記事の番号(インデックス)が代入されるようにしてあります。 print "<a name=\"$no\"></a>"; ?> この仕組みだと、最初に表示されているページ内に、コメントを付けた日記の記事番号があれば 付けたコメントの日記記事にリンクされるのですが、そのページに無い日記の記事番号の場合 コメントを付けたページの所のリンクされません。 ◆ ちなみに、ページリンクに関したソースは次のような感じにしてあります。 <?php if ($page > 1){$tugi .= "<a href = '$PHP_SELF?page=".($page - 1)."&total=$total&page_num=$page_num'>"."<b>次の記事</b></a>"; }print"$tugi"; if ($total > 1 and $page < $page_num){$mae .= "<a href = '$PHP_SELF?page=".($page + 1)."&total=$total&page_num=$page_num'>"."<b>前の記事</b></a>"; }print"$mae"; ?>

    • 締切済み
    • PHP
  • 【PHP】 リンクに関した質問です。

    ブログを作成しいて、【最新コメント者】と言う所には、各日記の記事に対してコメントを 付けた方の名前が最新順に記される様にしています。 例えば… 【最新コメント者】 おはよう君 こんばんわ君 ・ ・ ・ おやすみ君 …と言う様に、それで今回の質問とは、その【最新コメント者】の所の名前をクリックしたら その名前の方が付けたコメントの記事にリンクする様にするにはどうしたらよいでしょうか? よろしくお願い致します。教えて下さいませ。 ◆ 【最新コメント者】の表示させるPHPソースの所では次ぎの様にしてあります。 <?php //log.txt は、コメントのログファイルです。 //$name には、コメントを付けた方の名前です。 //$bo には、コメントを付けた所の日記記事の番号(インデックス)です。 $log = file("log.txt"); for($i=0; $i<sizeof($log); $i++){ list($bo,$name) = explode( "," , $log[$i]); print "<a href=\"#$bo\">".$name."</a><br>\n"; } ?> ◆ 各日記の記事の最初のソースの所では次ぎの様にしてあります。 <?php //$no には、日記の記事の番号(インデックス)が代入されるようにしてあります。 print "<a name=\"$no\"></a>"; ?> この仕組みだと、最初に表示されているページ内に、コメントを付けた日記の記事番号があれば 付けたコメントの日記記事にリンクされるのですが、そのページに無い日記の記事番号の場合 コメントを付けたページの所のリンクされません。 ◆ ちなみに、ページリンクに関したソースは次のような感じにしてあります。 <?php //ページは $page の変数を使ってページを出力していますので、個別ページはありません。 if ($page > 1){$tugi .= "<a href = '$PHP_SELF?page=".($page - 1)."&total=$total&page_num=$page_num'>"."<b>次の記事</b></a>"; }print"$tugi"; if ($total > 1 and $page < $page_num){$mae .= "<a href = '$PHP_SELF?page=".($page + 1)."&total=$total&page_num=$page_num'>"."<b>前の記事</b></a>"; }print"$mae"; ?>

    • 締切済み
    • PHP
  • 配列表示の方法

    ちょっと長いですが・・・このサイトを参考に、カンマ区切りのデータをテーブルデザインで表示したいのですが、うまくいきません。 参考サイト: http://www.sakura-pc.jp/php/page.html ■$arrayにカンマデータを代入して表示しようと思ったコード $data_file = "test.txt"; $array = file($data_file); for($i=0; $i<count($array); $i++){ list($data1,$data2,$data3,$data4,$data5) = split(",", $array[$i]); } 以下参考ソース <?php header("Content-type: text/html; charset=shift_jis"); $thisphp="page.php"; $page_line_num=5;#1つのページに表示させたい件数 if(!$page_num=$_GET["page"]){$page_num=1;}#最初は1ページ目とする ///////// この部分がわかりません。カンマデータを$arrayに代入してHTMLでテーブル表示する方法///////////////////////////////// $array=array('1行目','2行目','3行目','4行目','5行目','6行目','7行目','8行目','9行目','10行目', '11行目','12行目','13行目','14行目','15行目','16行目','17行目','18行目','19行目','20行目', '21行目','22行目','23行目','24行目' ); ////////////////////////////////////////////////////////////// $page_array=array_slice($array,($page_num-1)*$page_line_num,$page_line_num);#表示する分だけ別の配列に格納する 配列は0から数えるので処理上は1ページ目は0ページ目とする print_r($page_array);#現在のページで表示される中身を確認 $next_page=$page_num+1;#次のページ $back_page=$page_num-1;#前のページ if($back_page >= 1){$back_str='<a href="'.$thisphp.'?page='.$back_page.'">前へ</a>';}#現在より前のページが存在すれば戻るリンクを作る else{$back_str='<span style="color:gray">前へ</span>';}#存在しなければグレイ色で薄く表示 if(count($array) > ($next_page-1)*$page_line_num){$next_str='<a href="'.$thisphp.'?page='.$next_page.'">次へ</a>';}#現在より後のページが存在すれば進むリンクを作る else{$next_str='<span style="color:gray">次へ</span>';} $all_page_num=count($array) / ($page_line_num-1);#全部のページ数を計算 for($i=1;$i<$all_page_num;$i++){#存在するページ番号を生成 if($i != $page_num){$page_str.='[<a href="'.$thisphp.'?page='.$i.'">'.$i.'</a>]';} else{$page_str.='[<span style="color:gray">'.$i.'</span>]';} } print '<p>'.$back_str.' '.$page_str.' '.$next_str.'</p>';#ページを切り替えるリンクを表示する ?>

    • 締切済み
    • PHP
  • flush()関数でページを徐々に表示する方法

    質問致します。PHPスクリプトを処理する際、全て処理し終わった後、いっきにページに表示されるのが普通だと思うのですが、これを段階的に表示したいのですが、それには出力バッファをオフにする。つまりflush()関数を使えばOKと聞きました。以下の例でいえば、どの場所にこのflush()関数を入れれば良いのでしょうか? <?php $Name=array("Aさん","Bさん","Cさん","Dさん","Eさん","Fさん"・・・この後1000件続く); $Count=array(123,198,123,117,123,202・・・この後1000件続く); array_multisort($Count,SORT_DESC,SORT_NUMERIC,$Name,SORT_DESC,SORT_STRING); print("第1位:".$Count[0]." ".$Name[0]."<br>"); for($i=1;$i<count($Name);$i++){ if($Count[$i] != $Count[$i-1]){ print("第".($i+1)."位:".$Count[$i]." "); } print($Name[$i]."<br>"); } ?> 以上のように1000件もの順位を表す為、徐々に表示したいというのが私のやりたい事です。 参考ページ(http://oshiete1.goo.ne.jp/kotaeru.php3?q=1248483)等を見たのですが、初心者な者で太刀打ちできないでおります。 具体的にflush()関数をここに入れるという風にご指摘頂ければ幸いでございます。よろしくお願い致します。

    • ベストアンサー
    • PHP
  • C言語 ソートについて

    #include <stdio.h> #include <stdbool.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; // 交換回数 int count_comparison = 0; // 比較回数 void selection_sort(int a[], int n) { } int main(void) { int data[NUM_ARRAY][NUM_DATA] = {{9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表示 selection_sort(d, NUM_DATA); // 挿入ソートの実行 print_array(d, NUM_DATA); // ソート後の配列の表示 printf("比較回数: %d\n", count_comparison); // 比較回数の表示 printf("交換回数: %d\n", count_swap); // 交換回数の表示 } } 上の雛形を使って選択ソートを実行するという問題なのですが途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 下に自分が今書いているものを置いておきます。 #include <stdbool.h> #include <stdio.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; int count_comparison = 0; void swap(int d[], int i, int j) { count_swap += 1; printf("swap a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); int temp = d[i]; d[i] = d[j]; d[j] = temp; } void copy_array(int *a, int *b, int n) { for (int i = 0; i < n; i++) { b[i] = a[i]; } } void print_array(int d[], int n) { for (int i = 0; i < n; i++) { printf("%d ", d[i]); } printf("\n"); } bool compare(int d[], int i, int j) { count_comparison += 1; printf("compare a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); if (d[i] > d[j]) { return true; } else { return false; } } void selection_sort(int d[], int n) { int min; for (int i = 0; i < n - 1; i++) { min = i; for (int j = i + 1; j < i; j++) { if (compare(d, min, j)) { min = j; } } swap(d, i, min); print_array(d, n); } } int main(void) { int data[NUM_ARRAY][NUM_DATA] = { {9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表⽰ selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏ print_array(d, NUM_DATA); // ソート後の配列の表⽰ printf("⽐較回数: %d\n", count_comparison); // ⽐較回数の表⽰ printf("交換回数: %d\n", count_swap); // 交換回数の表⽰ } }

  • Javascriptで現在のページ番号をアクティブな状態にしたい

    今、PHPにて動的に変わるページリンクを作成しています。 ==================================== 前のページ 1 2 3 4 5 次のページ ==================================== これをリストの上部と下部に設置し連動して動くようにしたいと思っています。 リンクを生成する部分はpagelink_inc.phpという外部ファイルにして、それぞれの箇所でインクルードしています。 ■HTML本体 <div class="pageLink"> include(include/pagelink_inc.php); //リンク生成のPHPを読み込む </div> <div id="contents"> コンテンツ内容 </div> <div class="pageLink"> include(include/pagelink_inc.php); //リンク生成のPHPを読み込む </div> ■pagelink_inc.php <?php $linkStart = (($pageNo * 2) > constant("SHOW_LINK_NUM")) ? $pageNo-(floor(constant("SHOW_LINK_NUM")/2)) : 0; if($pageNo > 0 && $pageNo < $pages) echo "<a href='shopping.php?p_no=".($pageNo-1)."'>前のページ</a>\n"; for($i=$linkStart; $i<($linkStart+constant("SHOW_LINK_NUM")); $i++) { if($i < $pages) { echo "<a href='shopping.php?p_no=".$i."'>".($i+1)."</a>\n"; } } if($pageNo >= 0 && $pageNo < $pages-1) echo "<a href='shopping.php?p_no=".($pageNo+1)."'>次のページ</a>\n"; ?> 実際はこれだけで問題なく動くのですが、ユーザビリティを考慮し 1.現在どのページが開いているのかが分かるように、番号のスタイルを太字でボーダー無し、フォントカラーをグレーにする。 2.ページが開いた直後は1のリンクが対象になるようにする。 の2点を実現したいと思っています。 そこで、echo "<a href='shopping.php?p_no=".$i."'>".($i+1)."</a>\n";の部分にid='p_no".($i)."'を加え ============================================================================== echo "<a href='shopping.php?p_no=".$i."' id='p_no".($i)."'>".($i+1)."</a>\n"; ============================================================================== のようにしました。 更に、HTMLの</body>の前に ============================================================================== <script type="text/javascript">nowPage("<?php echo $pageNo; ?>")</script> ============================================================================== を加え ============================================================================== <script type="text/javascript"> function nowPage(no) { var elem = document.getElementById("p_no"+no); elem.style.textDecoration = 'none'; elem.style.fontWeight = 'bold'; elem.style.color = '#333333'; } </script> ============================================================================== というスクリプトを作成しました。 これだとid名が被ってしまうためか、上部に設置したリンクのスタイルだけが変化し 下部のリンクのスタイルは変化しません。 連動して上記のことを実現するにはどのようにしたらいいでしょうか? お分かりの方がいらっしゃいましたら是非ご教授下さい。 大変厚かましいのですが、少々急ぎなので、「1から~を勉強して下さい」といった ご回答はご遠慮したいと思います。 答えが分かってからじっくり勉強させて頂きます。 以上、宜しくお願い致します。