簡単掲示板
記事削除機能はちょっと難しそうなので、先に簡単な所で、1ページ辺りの記事表示件数を設定する機能を付けて見ました。ほとんどPerlの場合とコードは一緒ですが、細かい所では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%"> </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%"> </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_book2.dat"; //データファイル名
$data_max = 100; //データ最大記録数
$page_view = 10; //1ページの記事表示件数初期設定に必要な項目。PHPは、時間の取得がとっても簡単(^。^)
新たに、変数$page_view(1ページ当たりの記事表示件数)を追加。//===============データの書き込み=================
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);
//ログファイルの区切文字(",")と区別するために文字コード(,)に書き換える。
$name = str_replace(",", ",",$name);
$email = str_replace(",", "",$email);
$subject = str_replace(",", ",",$subject);
$comment = str_replace(",", ",",$comment);フォームデータを色々と処理します。 //記事番号をゲット
$message = file($data_file);
if(sizeof($message) < 1){
$new_code = 1;
} else {
list($ncode,$nname,$nemail,$nsubject,$ncomment,$nnow) = split( ",", $message[0]);
$new_code = $ncode + 1;
}新たに、記事番号を設定する。これによって、1ページ当たりの記事表示数の設定を可能にしている。
ファイルが空なら、最初の記事番号は「1」、次からはそれに1を加算して行く。message[0]は、ファイルの先頭にある最新の記事を指す。
PHPでは「$変数名」で即フォームデータの取得が可能なので、要注意!//配列要素を文字列により連結
$input_msg = implode(",", array($new_code,$name,$email,$subject,$comment,$now));
$fp = fopen($data_file, "w");
rewind($fp);
fputs($fp, "$input_msg\n");
//最大記録数の調整
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);
unset($message);
}
}一旦新しいデータを$fpに書き込んでから、記事の最大記録数の調整を行っている。 //==================HTML表示======================
$message = file($data_file);
$msg_count = count($message);ファイルデータを配列として読み込んで、記事数をゲットしている。 if($pline == "")
$p_line = 0;
else
$p_line = $pline;
$end_data = $msg_count - 1;
$page_end = $p_line + ($page_view - 1);
if($page_end >= $end_data)
$page_end = $end_data;
for($i = $p_line; $i <= $page_end; $i++){
list($code2,$name2,$email2,$subject2,$comment2,$now2) = split( ",", $message[$i]);ここは、Perlとほとんど同じ処理をしている。ただ、ループ処理の中での変数名の設定がちょっと特殊(^^ゞ何故なら、何度も言うようだが、PHPではフォームデータを即「$変数名」で取得できるからだ。 //記事表示部を生成
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";
}ループ処理を使って引き出した各要素を、それぞれ加工してブラウザに出力します。 $next_line = $page_end + 1;
if($page_end != $end_data){
print "<form method=Post action=$PHP_SELF>\n";
print "<input type=hidden name=pline value=$next_line>\n";
print "<input type=submit value=次のページ>\n";
print "</form>\n";
}ここは、次のページに跳ぶ為のフォーム処理。 ?> PHP終了の合図。 </BLOCKQUOTE>
</BODY>
</HTML>*上の内容をこのまま複写しても動きません。何故なら、表示を見やすくする為コード中に全角スペースが入っているからです。実際にお使いになる時は、この点を修正してからサーバにアップして下さい。