1. 現在位置:
  2. トップページ
  3. HP作成tips
  4. PHP-掲示板A
掲示板A
■ サンプル

「掲示板A」こちら
タグは使えないようになっています
いっぱい書くと改行して表示されます

掲示板表示 bbs1.php
本体 bbs1a.php
最大ログ表示用 bbs1log.php
ログファイル res.dat(666)
一時書き込み用 res1.dat(666)
最大ログファイル res3.dat(666)
一時書き込み用 res4.dat(666)

■ ソース

bbs1.php  レイアウトはご自由に(デザインサンプル 掲示板B 掲示板C
<HTML>
<HEAD>
<TITLE>掲示板1</TITLE>
<META Http-Equiv="Content-Type" Content="text/html;charset=x-sjis">
<style type="text/css">
TD { font-size: 10pt }
</style>
</HEAD>
<BODY BGCOLOR="#ffffff" LINK="#3333ff" VLINK="#000033" ALINK="#ffff00">
<CENTER>
<BR>
<TABLE CELLSPACING="0" CELLPADDING="3" BORDER="1" width="600" BORDERCOLOR="#0077aa">
<TR><TD COLSPAN="3" ALIGN="center" BGCOLOR="#0099cd">
      <FORM ACTION="bbs1a.php" METHOD="post">
      <FONT COLOR="#ffffff">名前:</FONT><input type="text" name="name" size=15>
      <FONT COLOR="#ffffff">コメント:</FONT><input type="text" name="comment" value="" size=30>
      <INPUT TYPE="submit" name="submit" VALUE="送信する"> 20件まで表示
      </FORM>
</TD></TR>
<TR><TD WIDTH=65 BGCOLOR="#0099cd" ALIGN="center"><FONT COLOR="#ffffff">名前</FONT></TD>
      <TD WIDTH=435 BGCOLOR="#ffffff" ALIGN="center"><FONT COLOR="#0077aa">コメント</FONT></TD>
      <TD WIDTH=100 BGCOLOR="#0099cd" ALIGN="center"><FONT COLOR="#ffffff">時間</FONT></TD>
</TR>
<? include("res.dat"); ?>
<TR><TD COLSPAN="3" ALIGN="center" BGCOLOR="#0099cd"> </TD></TR>
</TABLE>
<TABLE CELLSPACING="0" CELLPADDING="3" BORDER="0" width="600" BORDERCOLOR="#ffffff">
<TR><TD COLSPAN="3" ALIGN="right" BGCOLOR="#ffffff"><a href="bbs1log.php">
      100件までの書き込みはこちら</a></TD></TR>
</TABLE>
</CENTER>
</BODY>
</HTML>

■ ソース

bbs1a.php
<?php
$count_max = 20;
$countlog_max = 100;

$name = $HTTP_POST_VARS["name"];
$comment = $HTTP_POST_VARS["comment"];
$submit = $HTTP_POST_VARS["submit"];
$daytime = date('Y/m/d/H:i');

//ファイルの存在チェック
$filepath = "res.dat";
if (!file_exists($filepath)) {
      print("ファイルがありません。<BR>\n");
      exit;
}

if ($submit == "送信する") {

if ((! empty($name)) and (! empty($comment))) {

header("Location: bbs1.php\n\n");

}

else{
      print("記入もれです。<BR>\n");
      exit;
      }
}

      $comment = stripslashes($comment); // addslashesでクォートされた文字列のクォート部分を取り除く
      $name = stripslashes($name);

      $name = htmlspecialchars($name); // 「&,",<,>」を変換
      $comment = htmlspecialchars($comment);

      $message = "<TR><TD WIDTH=65 BGCOLOR=#0099cd VALIGN=top><FONT COLOR=#ffffff>$name</FONT></TD>";
      $message .= "<TD WIDTH=435 BGCOLOR=#ffffff><FONT COLOR=#0077aa>$comment</FONT></TD>";
      $message .= "<TD WIDTH=100 BGCOLOR=#0099cd ALIGN=right VALIGN=top><FONT COLOR=#ffffff>$daytime</FONT></TD></TR>\n";

//余計な警告を出さないようにする
// 一人が書込み中に res.dat.loc(この名前はなんでもいい)を自動で作成し、このファイルがある間は別の書込みが出来ない
// unlink("shiritori.dat.loc"); で自動に削除される
      ob_start();
      $loop = 0;
      while(!symlink("res.dat", "res.dat.loc")){
            if(++$loop >= 10){
                  ob_end_clean();
                  echo 'サーバービジー<BR>しばらくしてから再度試してください。<BR><BR>';
                  return; // return=即座に その関数の実行を停止
            }
            sleep(1); // sleep=与えられた秒数分プログラムの実行を遅延させます
      }
      ob_end_clean(); // 余計な警告を出さないようにするのを終了

//ファイルオープン1書き込み用排他ロック

      $fp = fopen("res.dat","r+");
      if ($fp == FALSE){
            print("ファイルポインタのオープンに失敗しました。<BR>\n");
            unlink("res.dat.loc"); // unlink=ファイルを削除する
            exit;
      }
      flock($fp, LOCK_EX); //LOCK_EX=書き込み用排他ロック  flock=汎用のファイルロックを行う

//ファイルオープン2
      $fp2 = fopen("res1.dat","w+"); 
      if($fp2 == FALSE){
            print("ファイルポインタのオープンに失敗しました。<BR>\n");
            unlink("res.dat.loc"); // unlink=ファイルを削除する
            exit;
      }

//ファイルポインタのファイルバッファを設定する
      set_file_buffer($fp, 0);
      set_file_buffer($fp2, 0);

//フアイル2に追加書込みを書き込む
      fputs($fp2,$message);

//ファイル1からファイル2へ読込み
      $count = 1; // 最大表示チェック
      while(!feof($fp) && ($count < $count_max)){ // feof=ファイルポインタがファイル終端に達しているかどうか調べる 
            $buffer = fgets($fp,4096); // fgets=ファイルポインタから1行取得する
            fputs($fp2,$buffer); // fputs=ファイルポインタに書き込む
            $count++;
      }
      rewind($fp); // rewind=ファイルポインタの位置を先頭に戻す
      rewind($fp2);

//ファイル2からファイル1へ読込み
      while(!feof($fp2)){
            $buffer = fgets($fp2,4096);
            fputs($fp,$buffer);
      }
      $len = ftell($fp); // ftell=ファイルポインタから読み書きの位置を取得する=最終的に書き込んだ終端を取得する
      ftruncate($fp,$len); // ftruncate=ファイルを指定した長さに丸める=余計な分を切り落とす 

//ファイル1をロック解除
      flock($fp, LOCK_UN);

      fclose($fp); // fclose=オープンされたファイルポインタをクローズする
      if (!$fp) {
            print("ファイルポインタのクローズに失敗しました。<BR>\n");
            unlink("res.dat.loc"); // unlink=ファイルを削除する
            exit;
      }
      fclose($fp2);
      if (!$fp2) {
            print("ファイルポインタのクローズに失敗しました。<BR>\n");
            unlink("res.dat.loc");
            exit;
      }

//ログファイル用
//ファイルオープン3書き込み用排他ロック

      $fp3 = fopen("res3.dat","r+");
      if ($fp3 == FALSE){
            print("ファイルポインタのオープンに失敗しました。<BR>\n");
            unlink("res.dat.loc");
            exit;
      }
      flock($fp3, LOCK_EX);

//ファイルオープン4
      $fp4 = fopen("res4.dat","w+");
      if($fp4 == FALSE){
            print("ファイルポインタのオープンに失敗しました。<BR>\n");
            unlink("res.dat.loc");
            exit;
      }

//ファイルポインタのファイルバッファを設定する
      set_file_buffer($fp3, 0);
      set_file_buffer($fp4, 0);

//フアイル4に追加書込みを書き込む
      fputs($fp4,$message);

//ファイル3からファイル4へ読込み
      $count1 = 1;
      while(!feof($fp3) && ($count < $countlog_max)){
            $buffer = fgets($fp3,4096);
            fputs($fp4,$buffer);
            $count++;
      }
      rewind($fp3);
      rewind($fp4);

//ファイル4からファイル3へ読込み
      while(!feof($fp4)){
            $buffer = fgets($fp4,4096);
            fputs($fp3,$buffer);
      }
      $len = ftell($fp3);
      ftruncate($fp3,$len);

//ファイル3をロック解除
      flock($fp3, LOCK_UN);

      fclose($fp3);
      if (!$fp3) {
            print("ファイルポインタのクローズに失敗しました。<BR>\n");
            unlink("res.dat.loc");
      exit;
      }
      fclose($fp4);
      if (!$fp4) {
            print("ファイルポインタのクローズに失敗しました。<BR>\n");
            unlink("res.dat.loc");
            exit;
      }

      unlink("res.dat.loc"); // unlink=ファイルを削除する

?>

■ ソース

bbs1log.php
<HTML>
<HEAD>
<TITLE>掲示板1</TITLE>
<META Http-Equiv="Content-Type" Content="text/html;charset=x-sjis">
<style type="text/css">
TD { font-size: 10pt }
</style>
</HEAD>
<BODY BGCOLOR="#ffffff" LINK="#3333ff" VLINK="#000033" ALINK="#ffff00">
<CENTER>
<BR>
<TABLE CELLSPACING="0" CELLPADDING="3" BORDER="0" width="600" BORDERCOLOR="#ffffff">
<TR><TD COLSPAN="3" ALIGN="right" BGCOLOR="#ffffff"><a href="bbs1.php">戻る</a></TD></TR>
</TABLE>
<TABLE CELLSPACING="0" CELLPADDING="3" BORDER="1" width="600" BORDERCOLOR="#0077aa">
<TR><TD WIDTH=65 BGCOLOR="#0099cd" ALIGN="center"><FONT COLOR="#ffffff">名前</FONT></TD>
<TD WIDTH=435 BGCOLOR="#ffffff" ALIGN="center"><FONT COLOR="#0077aa">コメント</FONT></TD>
<TD WIDTH=100 BGCOLOR="#0099cd" ALIGN="center"><FONT COLOR="#ffffff">時間</FONT></TD>
</TR>
<? include("res3.dat"); ?>
</TABLE>
<TABLE CELLSPACING="0" CELLPADDING="3" BORDER="0" width="600" BORDERCOLOR="#ffffff">
<TR><TD COLSPAN="3" ALIGN="right" BGCOLOR="#ffffff"><a href="bbs1.php">戻る</a></TD></TR>
</TABLE>
</CENTER>
</BODY>
</HTML>