【PHP】次の5件の記事を表示させるには?

このQ&Aのポイント
  • 最初のページに表示される記事は「1,あああ君,おはよう」のログから5件表示される。
  • 「次のページ」「前のページ」のリンクで、次のページにリンクした場合、ログから5件表示させるにはどのようにすればいいのか詳しく教えてほしい。
  • 詳しい仕組みを教えていただけると助かります。
回答を見る
  • ベストアンサー

【PHP】 次の5件の記事を表示させるには?

例えば、ログファイル(log.txt)に保存されてる記事数が15件あったとします。 【log.txtファイルの中身】 1,あああ君,おはよう ・ ・ ・ 5,おおお君,良い天気ですね ・ ・ ・ 15,そそそ君,明日は晴れるでしょ ページに表示される仕組みについて、画面に表示される記事数を $log= 5; と変数で 5にしています。 ですので、最初のページ(abc.php)に表示される記事は、「1,あああ君,おはよう」のログから5件表示されるのですが 「次のページ」「前のページ」のリンクで、例えば「次のページ」で(abc.php)リンクした場合、「5,おおお君,良い天気ですね」 のログから5件表示させるにはどの様にするば良いのでしょうか? 仕組みなど詳しく教えて頂けると助かります。 宜しくお願い致します。

  • PHP
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • 99Micchi
  • ベストアンサー率100% (1/1)
回答No.2

私は総記事数と総ページ数を求めて、 表示の開始件数と終了件数を出して表示しています。 $log=5; $page=htmlspecialchars($_GET["page"]); $page_num=htmlspecialchars($_GET["page_num"]); $total=htmlspecialchars($_GET["total"]); //最初にアクセスしたときに求める if(!$page){ $total = count(記事); $page_num = ceil($total/$log); $page=1; } $start=$log*($page-1); $end=$start + $log; if($total < $end){$end=$total;} //page=2なら6件目から10件目を表示 for ($i=$start; $i< $end; $i++) { 表示処理 } if ($page > 1) { $navi .= "<a href = '$PHP_SELF?page=" . ($page - 1) . "&total=$total&page_num=$page_num'>" . "前のページ</a>"; } if ($total > 1 and $page < $page_num) { $navi .= "<a href = '$PHP_SELF?page=" . ($page + 1) . "&total=$total&page_num=$page_num'>" . "次のページ</a>"; } print"$navi"; 最初・最後のページなども同じようにできると思います。

orz_zin_l
質問者

補足

回答有り難う御座います。 何となく仕組みが分りかけてきましたが・・・後一歩^^; 「(!$page)」これがpage数が有ったらと解釈するのですよね? 「…count(記事);」の「記事」の代入は私の場合「log.txt」で良いのでしょうか? まず、これで、記事のログ総数が求められますね。この部分は分ります。 「ceil($total/$log);」のceil関数は大きい整数を返すと言う意味だと解釈すると「/」この意味はなんなんでしょうか? 「$start=$log*($page-1);」ここの計算で、ページ数による5単位で記事開始の記事番号を意味的には$startに入れてるのですよね? 例えば、2ページ目なら5×2=10と言う様な感じで。(表示の開始件数) 「$end=$start + $log;」の所で10+5=15(終了件数)の意味ですよね? $totalは、記事ログの総数、「if($total < $end){$end=$total;}」この意味は分かるのですが、何故、ここで$end=$totalとする必要性が今一わかりません^^; 一部まだ理解できない部分があるのですが…汗、とりあえず、もし宜しければ、これだけでも、再度、解説宜しくお願いします。

その他の回答 (3)

  • 99Micchi
  • ベストアンサー率100% (1/1)
回答No.4

>$page_num(4)の変数は、プログラムの中では、どの様に役に立っているのでしょうか?(この変数の使い道) 総件数が1より大きく、ページが総ページより小さい場合「次へ」を表示すると言う意味です。 この変数がなくなったら表示する記事がないのに「次へ」がでると思います。 if ($total > 1 and $page < $page_num) { $navi .= "<a href = '$PHP_SELF?page=" . ($page + 1) >log.txtの6番目~10番目となっていない様なんですが、何故なんでしょうか? これは前回説明した通りです。 >配列では「1,あああ君,おはよう」が0となるので2ページ目では配列の5~9を表示することになります。 これはご自身でいろいろ試してから質問してみてください。 ちなみにsizeofはcount() のエイリアスなので$total = count($data);と結果は同じです。 print_r($data);としてみて 2ページめなら for ($i=5; $i< 10; $i++) { } ではなく質問者さんのいうように for ($i=6; $i< 10; $i++) { } としたらどうなりますか? 同じく1ページめを for ($i=1; $i< 5; $i++) { } などしてみたらいいと思いますよ。 わからなかったらPHP ループなどで検索してください。

orz_zin_l
質問者

お礼

この度、明確で分りやすい回答の数々本当に有り難う御座いました。 実を言うと、この場で質問するまで、他でも数々質問していましたが、どれもこれも私の期待する回答では無く、困り悩んでました。 自分でも自分なりに様々な関数を使い「次」「前」の仕組みを試しましたが、一部の何かが出来ると、他の何か出来なくなったりして、あきらめかけてました! この場で質問し、99Micchiさんの最初の回答を見た時「っあ!この仕組みなら出来るかも!」と思いました! 後は、「何故そうなるのか」と言った理屈・仕組みさえ分ればと思い何度も重ねて質問させて頂きました。 やっと理解力の悪い私でも 99Micchiさんのプログラム全体を理解出来た今! 99Micchiさんのプログラムを自分の制作段階のプログラム(掲示板・ブログ)の中に入れ込み、ようやく「次のページ」「前のページ」の仕組みが出来ました!!! PHP覚えたての私にとっては、本当に出来た事が嬉しく、また仕組み、理屈と言ったが分ると、そこから自分流にアレンジ出来たので、今回、更に、99Micchiさんに教えて頂いて本当に本当に良かったと実感しています。 お礼を、文章では言い表せないぐらいに感謝しています。 また、この場でPHPに関して質問する事があると想いますので、もし、私の質問を見かけた時は、是非、またよろしくお願い致します。 簡単なお礼ではありましたが、私は凄く感謝しています。 本当に今回は有り難う御座いました。

  • 99Micchi
  • ベストアンサー率100% (1/1)
回答No.3

>「(!$page)」これがpage数が有ったらと解釈するのですよね? ページ数がなかったらです。1番はじめにアクセスしたときはセットされていないので 総記事数と総ページ数と$pageに1をセットします。 >「ceil($total/$log);」のceil関数は大きい整数を返すと言う意味だと解釈すると「/」この意味はなんなんでしょうか? 総ページ数を求めます。「/」は除算(割り算)なのでlog.txtに18件あるとしたら ceil(18/5)で4になります。 >例えば、2ページ目なら5×2=10と言う様な感じで。(表示の開始件数) >「$end=$start + $log;」の所で10+5=15(終了件数)の意味ですよね? 例えば2ページめなら $start=$log*($page-1);は5*(2-1)=5で5が開始位置になります。 終了は$end=$start + $log;なので5+5で10が終了位置になります。 for文で「$i< $end;」としているので9件めまでを表示しますが。 (2ページ目は6件目から10件目を表示しますよね。) 配列では「1,あああ君,おはよう」が0となるので2ページ目では配列の5~9を表示することになります。) >$end=$totalとする必要性が今一わかりません^^; 例えば件数が1ページあたりの表示件数で割り切れたら問題ないのですが。 log.txtに8件の場合、2ページ目は for ($i=5; $i< 10; $i++) { } となりますが5番目から9までだと5回ループしますよね。 でも実際は3件しか表示する記事がないですよね。 2回多く表示(処理)してしまうので if($total < $end){$end=$total;}とすると($8 < $10){8=10;}で for ($i=$5; $i< 8; $i++) { } になります。

orz_zin_l
質問者

補足

なるほど、大分理解できました! 大体の意味は理解できたのですが、後、理解できない事が… ◆ $page_num(4)の変数は、プログラムの中では、どの様に役に立っているのでしょうか?(この変数の使い道) ◆ (2ページ目は6件目から10件目を表示)について… for ($i=$start; $i< $end; $i++){ 表示処理 } …実際に99Micchiさんのプログラムを、私のプログラムに交えて上のスースだと 例えば、$start(5)$end(10)だとしても、5回ループすると言う意味で log.txtの6番目~10番目となっていない様なんですが、何故なんでしょうか? for文の所の表示処理のところで何か、総記事数と関連付けが必要なのでしょうか? ここが一番の難点、分りません^^; 何度もお尋ねしてすみません^^; ※ 総記事数の出力を次ぎの様にしています。 $data = file("log.txt"); $total = sizeof($data);

noname#77845
noname#77845
回答No.1

sessionで管理してページを表す変数を用意します。 例えば、$pageとし、初期値は"1"です。 このとき、表示されるデータは [1~5]件+($page-1)*5 で求めることが出来ます。 1ページ目なら (1~5)+(1-1)*5 (1~5) 2ページ目なら (1~5)+(2-1)*5 (1~5)+5 (6~10) 3ページ目なら (1~5)+(3-1)*5 (1~5)+10 (11~15) というふうになります。 ページ遷移したときに、$pageをインクリメント又はデクリメントさせれば表示させたいデータを表示できると思いますよ。 ただし、$pageをデクリメントして1より小さくなったときは1にする。 また、$pageが総件数より大きくならないようにインクリメントさせたときにも条件判断が必要でしょう。 例えば ++$page>(総ページ数) なら、$pageを変化させない等…。

orz_zin_l
質問者

補足

ご回答有り難う御座います。 ですが・・・汗 私はPHP覚えた手なので、出来れば、もっと分りやすく説明していただけると助かります。 例えば、(1~5)+(1-1)*5 の(1~5)は、1~5の数字を入れると言う事なのでしょうか? その計算を交えて、どの様にsessionで管理したら良いのでしょうか? session自体、あまり詳しくないので・・・汗 後、インクリメント、デクリメントの意味がわかりません^^; わざわざご回答下さったのに、私の理解力が悪くてすみません。

関連するQ&A

  • 自作PHPブログでの記事を10件ずつ表示する方法に

    自作PHPブログでの記事を10件ずつ表示する方法について http://ponk.jp/php/basic/blog こちらのサイトさんを参考にPHPで自作のブログを制作しているのですが、 最新の記事10件ずつ表示させたい場合はどのような記述をすれば良いのでしょうか? 具体的に書いて頂けると嬉しいです。 「前ページ」と「次ページ」的なリンクを貼りたいと思っております。 一番最古の記事のページまで行くと「前ページ」リンクも消えるようにしたいのです。

    • ベストアンサー
    • PHP
  • 【PHP】 記事の削除について(ログの一部を削除)

    log.txt ファイル の中身が下の様になっていた場合、削除したい記事番号を選び削除キーを押したら 選んだ記事番号の記事を削除するにはどうしたらよいでしょうか? ◆ log.txtファイルの中身 1 あああ君 おはよう ・ 3 かかか君 良い天気ですね ・ ・ 6 そそそ君 明日は晴れるでしょ ※ 記事番号($no) 名前($name) 内容($body)と配列がなっています。(全角の空白で区切ってます) ◆ 削除したい記事番号を選ぶ所のファイル名は 「file01.php」 としています。   「file01.php」では次ぎの様に削除キーを設定しています。 <table><tr><td> <form name="form" action="file02.php" method="POST"> <input type="text" name="delkey" size="8"> <input name="Submits" type="submit" value="削除"></form> </td></tr></table> ◆ 「file01.php」からのデーターの受け取りファイル名は 「file02.php」としています。   「file02.php」では次ぎの様にしてデーターを受け取る様にしています。 <?php $delkey = $_REQUEST["delkey"]; $data = file("log.txt"); for($i=0; $i<sizeof($data); $i++){ list($no,$name,$body) = explode( " " , $data[$i]); if($no == $delkey){ //・・・記事削除処理 } } ・ ・ ・ ?> ◆ 書込みは次ぎの様にしています。 $fp = fopen("log.txt","w"); $ndata = implode( " " , array($no,$name,$body."\n") ); fputs($fp,$ndata); fclose($fp); ここまではやってみましたが、ここから、どのような仕組みで選んだ記事番号の記事を削除したらよいのか分らないので教えて下さい? また、記事削除の処理をした場合、ログファイルを元のと書きかえるいはどうしたらよいのでしょうか教えて下さい? 例えば、選んだ削除番号が「3」だった場合など・・・記事削除処理のところはどうしたらよいのでしょうか? if の所では、記事番号($no)が選んだ削除したい記事番号($delkey)と等しいなら、・・・記事削除処理 と言う様にしています。 記事削除処理のところは、記事削除の仕組み仕方が分らないので空白となっています。 以上、出来れば詳しく教えて頂けると助かります。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 自作PHPブログでの記事を5件ずつ表示する方法に

    自作PHPブログでの記事を5件ずつ表示する方法について PHPで自作のブログをサイト等を参考に制作しているのですが、 最新の記事5件ずつ表示させたい場合はどのような記述をすれば良いのでしょうか? 「前ページ」と「次ページ」的なリンクを貼りたいと思っております。 一番最古の記事のページまで行くと「前ページ」リンクも消えるようにしたいのです。 pager等を検索したのですが、いまいち自分の物に組み込むとなるといまいちよくわからなくなります。 LIMITで5件表示まではわかったのですが、「次へ」で6~10件表示の仕方がわかりませんでした。 どのような記述が良いでしょうか、よろしくお願いします。 <?php $pdo = new PDO("mysql:dbname=blog", "root"); $st = $pdo->query("SELECT * FROM post ORDER BY no DESC LIMIT 5"); $posts = $st->fetchAll(); for ($i = 0; $i < count($posts); $i++) { $st = $pdo->query("SELECT * FROM comment WHERE post_no={$posts[$i]['no']} ORDER BY no DESC"); $posts[$i]['comments'] = $st->fetchAll(); } require 't_index.php'; ?> t_index.phpで表示のプログラムを書いています。

    • 締切済み
    • PHP
  • カテゴリの記事を最新記事一件だけ表示したい

    MovableTypeのカスタマイズで困ってます。 カテゴリにおいて、記事数が数件ある時に、 最新の記事一件だけを表示させて、 残りの記事は、 「このカテゴリの記事一覧」のように、 エントリーページへのリンクを張るようにしたいと思います。 カテゴリの記事一覧はできたのですが、 カテゴリにおいて最新の記事を一件だけ表示する方法が分かりません。 ご存知の方がおりましたら、ぜひ教えてください。 よろしくお願いします。

  • 【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
  • 【PHP】 書込みされた事を知らせる為のアイコン表示

    私の理想のイメージは、abc.php ファイルの掲示板に書込み(新規・返信)されたら、zyx.php ファイルの方で その abc.php ファイルの掲示板で書込みされた事を知らせる為のマーク up.gif (アイコン)を、書き込まれた日から 24時間(1日)の間表示させたいのです。 ◆ log.txt ファイル(掲示板の書込みログ) 1,みかん君,2008/04/16 15:19:14 ・ 3,りんご君,2008/04/13 22:19:32 ・ ・ 6,ぶどう君,2008/04/11 08:19:48 ・ ・ 以下省略 【 log.txt ファイルの補助説明 】 ※ 「 , 」(カンマ)で区切りを付けてます。 ※ インデックス,名前,日付 と言う順に配列がなっています。 ※ log.txt ファイルは、上から最新順に書き込まれるようにしてあります。 ※ インデックス($no) 名前($name) 内容($date)と配列がなっています。 ◆ abc.php ファイル(掲示板ページ) $fp = fopen("log.txt","a"); flock($fp, LOCK_EX); $data = implode( "," , array($no,$name,$date."\n") ); fputs($fp,$data); flock($fp, LOCK_UN); fclose($fp); 【 log.txt ファイルの補助説明 】 ※ 掲示板での書き込み処理です。 ◆ zyx.php ファイル(up.gif (アイコン)を表示させたいページ) <? $files = file("log.txt"); $logdata = $files[0]; list($no,$name,$date) = explode( "," , $logdata); if($no != ){ } ?> ここまではやってみましたが、ここから、どのようにしたらよいのか分らないので教えて下さい? また、if で、どのように条件を定義してよいかも分りません。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 「次の10件を表示する」のような表示がしたい

    住所録を表示するページをPHPで作成しました。 問題なくできたのですが、データが増えたので一度に表示するのは例えば20件とかにして、「次の20件」のようなボタンをおすと、 21件~40件を表示させ、そのページには、 「前の20件」と「次の20件」のボタンを表示させたいと考えています。 最初のページには、「前の20件」ボタンはなく、 最後のページには、「次の20件」ボタンは表示させないように考えています。 どのようにすればよろしいでしょうか。 ご教授ください。 ************************************************ 作成したPHP ************************************************ <?php print("<table>"); $cont = mssql_connect("サーバ名","ユーザ名","パスワード"); mssql_select_db('DB名', $cont); $sql = "select * from テーブル名 $rc = mssql_query($sql,$cont); while ($array = mssql_fetch_array($rc)) { print("<tr>"); print("<td>"); print "".$array["氏名"].""; print("</td>"); print("<td>"); print "".$array["住所"].""; print("</td>"); print("</tr>"); } print("</table>"); mssql_close($cont); ?> ************************************************ 環境 PHP5.2 Apache2.2 SQLserverVersion5 PHPとSQLは別サーバになります。 両サーバOS:windows

    • ベストアンサー
    • PHP
  • csvからphpを使って商品ページを表示させたい?

    phpがまったくわからない初心者ですがよろしくお願いします。 CSVファイルにはコード番号、商品名、値段、説明文があるとします。 phpを使って商品ページの一覧を表示させたいと思います。 表示は逆順に表示して、できれば20件ごとに「次へのページ」へリンクと「戻る」のリンクを付けたいのですがどのようにプログラムを書けばいいのでしょうか? ほどんど丸投げ状態ですがよろしくお願いします。

    • 締切済み
    • PHP
  • PHPでログをページで区切って表示するようにするには?

    いろんなHPを見ながら掲示板を自作しているのですが 後は、PHPでログをページで区切って表示するようにする方法がどうしても わからないのです たとえば1Pの表示件数が10件超えたらそこまでの記事は前のページに飛べば見れる ような形にしたいのです どなたかご伝授お願いします・・・

    • 締切済み
    • PHP

専門家に質問してみよう