アクセス向上大失敗 www.igros.net
Last updated 2004/8/16
コメントバック 対応

新しい順に表示する -簡単PHP掲示板講座 STEP10-

[PR]特集 Amazon.co.jp レコメンドコンテンツ



STEP10
・投稿データを時系列に新しい書込み順に表示する
  [STEP9の問題点] 古い書込み順に表示されていました。
  [要点] ファイル内の最終行から表示する方法を使わず邪道方法で簡単に対応します。
参考ソースプログラム
解説
<?php
# プログラム bbs.php STEP10
 $submit = $HTTP_POST_VARS["SUBMIT"];
 if ($submit=="送信") {
  $name = $HTTP_POST_VARS["NAME"];
  $mail = $HTTP_POST_VARS["MAIL"];
  $body = $HTTP_POST_VARS["BODY"];
  if ($name=="" or $body=="") {
   echo '<font color="#FF000">必須項目入力エラー</font><br>';
   echo 'お名前と本文は必ず入力してください<br>';
   echo '<a href="javascript:history.back()">戻る</a>';
   exit;
  }
  $body = str_replace("\r\n", "<br>", $body);
  $dt = date("y/m/d H:i:s");
  $data = file("data.txt");
  $fp = fopen("data.txt", "w");
   fwrite($fp, "$name\t$mail\t$body\t$dt\n");
   foreach ($data as $value) {
    fwrite($fp, "$value");
   }
  fclose($fp);
 }
 echo '
  <html>
  <head>
  <title>PHP-BBS</title>
  </head>
  <body>
  <h1>PHP-BBS</h1>
  STEP10<br>
  <form method="post" action="bbs.php" accept-charset="x-euc-jp">
  お名前 <input type="text" size="16" maxlength="30" name="NAME">
  メール <input type="text" size="30" maxlength="50" name="MAIL"><br>
  本文<br>
  <textarea rows="10" cols="70" wrap="soft" name="BODY"></textarea><br>
  <input type="submit" name="SUBMIT" value="送信">
  </form>
 ';
 $data = file("data.txt");
 foreach ($data as $value) {
  $view = explode("\t", $value);
#  $name = $view[0];
#  $mail = $view[1];
#  $body = $view[2];
   echo '<hr size="5" width="70%" align="left" noshade>';
   if ($view[1]=="") { echo "<font color=\"#000080\"><b>$view[0]</b></font> $view[3]<br>"; }
   else { echo "<a href=\"mailto:$mail\"><font color=\"#000080\"><b>$view[0]</b></font></a> $view[3]<br>"; }
   echo "$view[2]<br>";
 }
 echo '</body></html>';
?>
まず新規書込みデータを記録する前に、
$data = file("data.txt");で今までの書込みデータを丸ごと$data配列へ格納します。
$fp = fopen("data.txt", "w");は"w"モードで"data.txt"をオープンしているので、この命令が実行されると同時に"data.txt"は空になります。
つまり今まで蓄えたデータは全て消滅することを意味します。(この方法を自分では「邪道」と言っています。)
直後のfwrite命令で、今投稿されたデータを"data.txt"へ新規書込みします。
このデータがファイル中、1番最初のデータ(レコード)になります。
以降、foreach{ }繰り返しの中で、先に"data.txt"のデータを格納しておいた$data配列の先頭から順番に"data.txt"へ新規書込みを順次繰り返し行います。
これで毎回新規投稿データが常に1番最初、以降新しい書込み順にデータ(レコード)が格納されることになり、STEP9で作成した表示方法のままで新しい順に表示されることになります。

表示部分の先頭に"#"が付いた文はコメントになり、プログラムとして解釈されません。(足跡が分かるよう、あえてコメント化したまでです)
直接$view[ ]で表示するとともに少しデザイン性を加えてみました。

では質問です!
STEP9で使った、$fp = fopen("data.txt", "a");のまま、新しい順に表示するには表示部分をどう変更すれば良いでしょうか?
答えは↓(1例として)

 $data = file("data.txt");
 while($data) {
  $value=array_pop($data);
  $view = explode("\t", $value);
   if ($view[1]=="") { echo "お名前:$view[0] $view[3]<br>"; }
   else { echo "お名前:<a href=\"mailto:$mail\">$view[0]</a> $view[3]<br>"; }
   echo "本文:$view[2]<br>";
 }

※こっち↑の方が簡単???

ここまでのサンプル check!

さぁ、次からは掲示板の仕様に合わせた簡単なチューニングに入ります。
必要最低限と言う意味ではこれでもOK?かもしれません。


<<<< トップ <<< テーマトップ << サブテーマトップ < 前頁次頁 >

www.igros.net
[PR]特集 Amazon.co.jp レコメンドコンテンツ



Copyright(C) アクセス向上大失敗 All Rights Reservd.
version2.0