超簡単掲示板

 ようやく、記事の最大記録数が設定できるようになりました。やはり、ファイルデータは配列に格納しなくてはいけなかったみたいです。Perl張りに、ループ操作で記録記事の一覧表示も出来るようになりました。ちょっと嬉しい(^。^)

設置方法

 ファイル構成は、スクリプト本体のg_book.phpと、データ記録用のg_book.datのみです。PHPはPerlと違って、ファイルの置き場所に制約は受けません。サーバーでPHPがモジュールとして動いてさえいれば、ユーザーディレクトリ内の何処に置いてやっても動作します。ファイルの属性に関しては、データ記録用のg_book.datのみ「666」に変更してやって下さい。スクリプト本体のg_book.phpの属性を変更する必要はありません。

スクリプト・ソース

 では、以下にソースを掲載しますので、どうぞご参考になさって下さい。ファイル本体は、飽くまでもHTML文です。その中に<?php〜?>のスクリプト部分を埋め込んでいます。

<HTML>
<HEAD>
<TITLE>超簡単掲示板</TITLE>
</HEAD>
<BODY bgcolor='white' text='black' link='red'>
<FORM ACTION="<?php echo $PHP_SELF; ?>" METHOD="POST" NAME="line">
<P ALIGN="CENTER"><FONT SIZE="6" COLOR="#000099">超簡単掲示板</FONT></P>
<P ALIGN="CENTER"><font size=2 color='red'>お名前とコメントは必ず書き込んで下さい。エラーになります。(何も反応しないよ!)記事の最大記録数は30件です。</font></P>
<BLOCKQUOTE>
<P>
<TABLE BORDER="0" WIDTH="80%">
<TR>
<TD ALIGN="right" WIDTH="20%">お名前</TD>
<TD WIDTH="80%"><INPUT TYPE="TEXT" NAME="name" SIZE="15"></TD>
</TR>
<TR>
<TD ALIGN="right" WIDTH="20%">E-mail</TD>
<TD WIDTH="80%"><INPUT TYPE="TEXT" NAME="email" SIZE="25"></TD>
</TR>
<TR>
<TD ALIGN="right" WIDTH="20%">題目</TD>
<TD WIDTH="80%"><INPUT TYPE="TEXT" NAME="subject" SIZE="40"></TD>
</TR>
<TR>
<TD ALIGN="right" WIDTH="20%">コメント</TD>
<TD WIDTH="80%"><TEXTAREA NAME="comment" rows="4" cols="60"></TEXTAREA></TD>
</TR>
<TR>
<TD WIDTH="20%">&nbsp;</TD>
<TD WIDTH="80%"><INPUT TYPE="SUBMIT" VALUE="書き込み/更新"><INPUT TYPE="HIDDEN" NAME="action" VALUE="regist"> <INPUT TYPE="reset" VALUE="リセット"></TD>
</TR>
<TR>
<TD WIDTH="20%">&nbsp;</TD>
<TD WIDTH="80%">
</TD>
</TR>
</TABLE>
</FORM>
<hr>
通常のHTML文です。PHPは、このようなHTML埋め込み型のスクリプト言語です。
<?php PHP開始の合図。
//===================初期設定=====================
//時間の取得
$now = date("Y/m/d H:i:s");
//データファイル名
$data_file = "./g_book.dat";
//データ最大記録数
$data_max = 30;
初期設定に必要な項目。PHPは、時間の取得がとっても簡単(^。^)
//===============データの書き込み=================
if($action == "regist"){
 if(($name != "") && ($comment != "")){
条件を満たした時に書き込み処理を許可します。
  //ここから書き込みデータの調整
  $name = htmlspecialchars($name); //特殊文字のHTMLエントリへの変換
  $email = htmlspecialchars($email);
  $subject = htmlspecialchars($subject);
  $comment = htmlspecialchars($comment);
  $comment = nl2br($comment); //HTML改行文字の挿入
  $comment = str_replace("\r", "", $comment); //文字列の置換
  $comment = str_replace("\n", "", $comment);
  //ログファイルの区切文字(",")と区別するために文字コード(&#44)に書き換える。
  $name = str_replace(",", "&#44;",$name);
  $email = str_replace(",", "",$email);
  $subject = str_replace(",", "&#44;",$subject);
  $comment = str_replace(",", "&#44;",$comment);
フォームデータを色々と処理します。

★string htmlspecialchars ( string string [ , int quote_style] )関数・・・特殊文字をHTMLエントリに変換します。オプションの2番目の引数quote_type は、シングル及びダブルクオートされたされた文字で関数が何を行うかを指定します。

アンパサンド"&" →"&amp;"
ダブルクォート""" →"&quot;"
小なり"<" →"&lt;"
大なり">" →"&gt;"


★string nl2br ( string string )関数・・・改行文字をHTMLの改行指定文字に変換します。引数string に含まれる全ての改行文字の前に"<br />"を挿入して返します。

★string str_replace ( string needle, string str, string haystack )関数・・・引数haystack の中の引数needle を、全て引数str に置換します。
  //配列要素を文字列により連結
  $input_msg = implode(",", array($name,$email,$subject,$comment,$now));
★string implode ( string glue, array pieces )関数・・・全ての配列要素の順序を変えずに、各要素間の引数glue 文字列を挟んで、1つの文字列として返します。
  $message = file($data_file); ★array file ( string filename [ , int use_include_path ] )関数・・・ファイルを一括読み込みし、配列で返します。配列の各要素は、ファイルの改行記号付きの行が代入されます。第2引数use_include_path に"1"を設定する事により、php.iniで指定できるinclude_pathで指定したディレクトリから読み込むファイルを探します。
  $fp = fopen($data_file, "w"); 「書き込みモード」でファイルをオープンしています。
  rewind($fp); ★int rewind ( int fp )関数・・・引数fp で指定されたファイルポインタのファイル位置指示子を、ファイル・ストリームの先頭にセットします。エラーが起こった場合0を返します。
  fputs($fp, "$input_msg\n"); ★int fputs ( int fp, string str [ , int length ] )関数・・・引数string の内容を、引数fp が指しているファイル・ストリームに書き込みます。length パラメータが指定されている場合、length バイト数分の書き込みが完了、又はstring が終わりに達した場合のいずれかにより書き込みは中止されます。
  //最大記録数の調整
  if($data_max <= sizeof($message))
   $msg_num = $data_max - 1;
  else
   $msg_num = sizeof($message);
  for($i = 0; $i < $msg_num; $i++){
   fputs($fp, $message[$i]);
  }
  fclose($fp);
★int sizeof ( array array )関数・・・配列の要素の数を返します。

ここで、ループ処理を使って、記録データ数の調整を行っている。
  unset($message);
 }
}
★int unset ( mixed var [ , mixed var [ , ... ] ] )関数・・・指定した変数の割り当てを解除します。指定した変数を破棄し、trueを返します。
//==================HTML表示======================
$message = file($data_file);
$msg_count = count($message);
★int count ( mixed var )関数・・・引数var に含まれる要素の数を返します。変数が配列でない場合は1を返します。変数がセットされていない場合は0を返します。
for($i = 0; $i < $msg_count; $i++){
 list($name2,$email2,$subject2,$comment2,$now2) = split( ",", $message[$i]);
★void list ( ... )関数・・・同時に一連の変数に値を割り当てる為に使われます。

★array split ( string pattern, string string, [ , int limit ] )関数・・・正規表現により文字列を分割し、配列に格納します。配列の各要素は引数pattern で指定された正規表現により区切られた引数string 中の部分文字列が入ります。引数limit が指定された場合、返される配列には最大limit の要素が含まれます。この場合、最後の要素にはstring の残りの部分が全て入っています。エラーを生じた場合、split( )はfalseを返します。
 //記事表示部を生成
 print "<font size=4 color='blue'>◆<b>$subject2</b></font>\n";
 if($email2 != "")
  print "<a href=mailto:$email2><b> $name2</b></a>";
 else
  print "<b> $name2</b>";
 print "<font size=2 color='green'> $now2</font>\n";
 print "<blockquote>$comment2</blockquote>\n";
 print "<hr>\n";
}
ループ処理を使って引き出した各要素を、それぞれ加工してブラウザに出力します。
?> PHP終了の合図。
</BLOCKQUOTE>
</BODY>
</HTML>
 

 *上の内容をこのまま複写しても動きません。何故なら、表示を見やすくする為コード中に全角スペースが入っているからです。実際にお使いになる時は、この点を修正してからサーバにアップして下さい。

HOME