多機能掲示板(修正版)
前々から気になってたんですが、今までの掲示板スクリプトでは、親記事と返信記事をファイル自体を別にして操作していました。これはひとえに僕自身の配列に関する勉強不足が生んだ産物で、元々参考にしていたPerl版スクリプトでも、データファイルから親記事だけを抜き出す際は、ただ単に配列に抜き出して利用していたに過ぎませんでした。誠にお恥ずかしい話ですが、ここに来てようやくこの点を修正するに至りました。どうもごめんなさい_(._.)_
データ保存用ファイルは、これでようやく一つだけで済むようになります。
<HTML> <HEAD> <TITLE>多機能掲示板(修正版)</TITLE> </HEAD> <BODY TEXT="black" BGCOLOR="white" LINK="red" VLINK="red"> <FORM ACTION="<?php echo $PHP_SELF; ?>" METHOD="POST" NAME="line"> <P><INPUT TYPE="HIDDEN" NAME="action" SIZE="-1" VALUE="regist"></P> <P ALIGN="CENTER"><FONT SIZE="6" COLOR="#000099">多機能掲示板(修正版)</FONT></P> <P ALIGN="CENTER"><FONT SIZE="2" COLOR="red">お名前とコメントは必ず書き込んで下さい。エラーになります。(何も反応しないよ!)記事の最大記録数は100件です。</FONT></P> <BLOCKQUOTE> <P> <TABLE BORDER="0" WIDTH="88%"> <TR> <TD WIDTH="12%" ALIGN="RIGHT"> <P ALIGN="RIGHT">お名前 </TD> <TD WIDTH="88%"><INPUT TYPE="TEXT" NAME="name" SIZE="15"></TD> </TR> <TR> <TD WIDTH="12%" ALIGN="RIGHT"> <P ALIGN="RIGHT">E-mail </TD> <TD WIDTH="88%"><INPUT TYPE="TEXT" NAME="email" SIZE="25"></TD> </TR> <TR> <TD WIDTH="12%" ALIGN="RIGHT"> <P ALIGN="RIGHT">HomePage </TD> <TD WIDTH="88%"><INPUT TYPE="TEXT" NAME="hp" SIZE="40"></TD> </TR> <TR> <TD WIDTH="12%" ALIGN="RIGHT"> <P ALIGN="RIGHT">題目 </TD> <TD WIDTH="88%"><INPUT TYPE="TEXT" NAME="subject" SIZE="40"></TD> </TR> <TR> <TD WIDTH="12%" ALIGN="RIGHT"> <P ALIGN="RIGHT">題目色 </TD> <TD WIDTH="88%"> <INPUT TYPE="RADIO" NAME="scolor" VALUE="blue" checked><B><FONT COLOR="blue">青</FONT></B> <INPUT TYPE="RADIO" NAME="scolor" VALUE="red"><B><FONT COLOR="red">赤</FONT></B> <INPUT TYPE="RADIO" NAME="scolor" VALUE="green"><B><FONT COLOR="green">緑</FONT></B> <INPUT TYPE="RADIO" NAME="scolor" VALUE="#996600"><B><FONT COLOR="#996600">茶</FONT></B> <INPUT TYPE="RADIO" NAME="scolor" VALUE="#660099"><B><FONT COLOR="#660099">紫</FONT></B> </TD> </TR> <TR> <TD WIDTH="12%" ALIGN="RIGHT"> <P ALIGN="RIGHT">コメント </TD> <TD WIDTH="88%"><TEXTAREA NAME="comment" ROWS="4" COLS="60"></TEXTAREA></TD> </TR> <TR> <TD WIDTH="12%"> <P ALIGN="RIGHT">削除キー </TD> <TD WIDTH="88%"><INPUT TYPE="PASSWORD" NAME="pass" SIZE="7"><FONT SIZE="2" COLOR="#CC0000"> *半角英数4文字以上推奨。削除キーを設定すると、いつでもご自分の記事を削除できます。</FONT></TD> </TR> <TR> <TD WIDTH="12%"> </TD> <TD WIDTH="88%"> <?php if ($flags == 'return') { print "<input type=submit value=[" . $return . "]に返信>\n"; print "<input type=hidden name=ress value=$code>\n"; } else { print "<INPUT TYPE=SUBMIT VALUE=書き込み/更新> <INPUT TYPE=RESET VALUE=リセット>\n"; } ?> </TD> </TR> </TABLE> </FORM> <HR> |
題名を変更! 修正版スクリプトのファイル名は、「g_book6.php」となります。 |
//===================初期設定===================== //時間の取得 $now = date("Y/m/d H:i:s"); $data_file = "./g_book6.dat"; //データファイル名 $data_max = 100; //データ最大記録数 $page_view = 10; //1ページの記事表示件数 $homegif = "./home.gif"; //ホームページへのリンク用画像 $passwd = "777"; //管理者用パスワード |
データ保存用ファイルは一つだけになりました。 |
//===============データの削除================== if ($action == "delete") { if(($delcode != "") && ($password != "")){ $delfile = file($data_file); $fp = fopen($data_file, "w"); for($i=0; $i<sizeof($delfile); $i++){ list($dcode,$dress,$dname,$demail,$dhp,$dsubject,$dscolor,$dcomment,$dpass,$dnow,$dhost,$dagent) = split( ",", $delfile[$i]); if (($password == $dpass) || ($password == $passwd)) { if ($delcode != $dcode) { fputs($fp,$delfile[$i]); } } else { fputs($fp,$delfile[$i]); } } fclose($fp); } } //===============インライン関数=================== function inline_link($link){ $link = ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>",$link); return $link; } |
従来と同じ。 |
//===============データの書き込み================= if ($action == "regist") { if (($name != "") && ($comment != "")) { //ホスト名を取得 $host = getenv("REMOTE_HOST"); $addr = getenv("REMOTE_ADDR"); if($host == "" || $host ==$addr){ $host = gethostbyaddr($addr); } //訪問者のブラウザ名を取得 $agent = getenv("HTTP_USER_AGENT"); //ここから書き込みデータの調整 $name = htmlspecialchars($name); //特殊文字のHTMLエントリへの変換 $name = str_replace("\r", "", $name); //文字列の置換 $name = str_replace("\n", "", $name); $email = htmlspecialchars($email); $email = str_replace("\r", "", $email); $email = str_replace("\n", "", $email); $hp = htmlspecialchars($hp); $hp = str_replace("\r", "", $hp); $hp = str_replace("\n", "", $hp); $subject = htmlspecialchars($subject); $subject = str_replace("\r", "", $subject); $subject = str_replace("\n", "", $subject); $comment = htmlspecialchars($comment); $comment = nl2br($comment); //HTML改行文字の挿入 $comment = str_replace("\r", "", $comment); $comment = str_replace("\n", "", $comment); //ログファイルの区切文字(",")と区別するために文字コード(,)に書き換える。 $ress = str_replace(",", ",",$ress); $name = str_replace(",", ",",$name); $email = str_replace(",", "",$email); $hp = str_replace(",", "",$hp); $subject = str_replace(",", ",",$subject); $comment = str_replace(",", ",",$comment); //インラインリンクを実現(URLのみ) $comment = inline_link($comment); //記事番号をゲット $message = file($data_file); if(sizeof($message) < 1){ $new_code = 1; } else { list($ncode,$nress,$nname,$nemail,$nhp,$nsubject,$nscolor,$ncomment,$npass,$nnow,$nhost,$nagent) = split( ",", $message[0]); $new_code = $ncode + 1; } //配列要素を文字列により連結 $input_msg = implode(",", array($new_code,$ress,$name,$email,$hp,$subject,$scolor,$comment,$pass,$now,$host,$agent)); $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); } } |
不要なnl2br()関数処理を削除しました。だって、一行書き込みの部分には無駄ですもんね(^^ゞ |
//親記事だけを抜き出す $message = file($data_file); for($i=0; $i<sizeof($message); $i++){ list($rcode,$rress,$rname,$remail,$rhp,$rsubject,$rscolor,$rcomment,$rpass,$rnow,$rhost,$ragent) = split( ",", $message[$i]); if($rress == ""){ $PARENT[] = $message[$i]; } } |
親記事だけを配列$PARENT[ ]に抜き出します。 |
//==================HTML表示====================== //1ページ当たりの表示件数の調整 $msg_count = count($PARENT); 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; |
親記事だけを抜き出した配列$PARENTの行数を数えます。 |
for($i=$p_line; $i<=$page_end; $i++){ list($code2,$ress2,$name2,$email2,$hp2,$subject2,$scolor2,$comment2,$pass2,$now2,$host2,$agent2) = split(",", $PARENT[$i]); |
親記事だけを抜き出した配列$PARENTから各要素を読み込みます。 |
//親記事の表示 print "<form method=POST action=$PHP_SELF>\n"; print "<input type=radio name=delcode value=$code2>\n"; print "<font size=4 color=$scolor2><b>$subject2</b></font>\n"; if($email2 != "") print " <a href=mailto:$email2><b>$name2</b></a>\n"; else print " <b>$name2</b>\n"; if($hp2 != ""){ print " <a href=$hp2 target=_top><img src=$homegif border=0></a>\n"; } print " <font size=2 color='green'>$now2</font>\n"; print "<input type=hidden name=action value=delete>\n"; print "<font size=2>パスワード:</font><input type=password size=7 name=password>\n"; print "<input type=submit value=削除>\n"; print "</form>\n"; print "<blockquote>$comment2<br><br>\n"; print "<form method=POST action=$PHP_SELF>\n"; print "<input type=submit value=返信>\n"; print "<input type=hidden name=code value=" . $code2 . ">\n"; print "<input type=hidden name=return value=" . $subject2 . ">\n"; print "<input type=hidden name=flags value=return>\n"; print "<font size=2>[$host2] $agent2</font>\n"; print "</form></blockquote>\n"; |
従来と同じ。 |
//返信記事の表示 for($j=0; $j<sizeof($message); $j++){ list($code3,$ress3,$name3,$email3,$hp3,$subject3,$scolor3,$comment3,$pass3,$now3,$host3,$agent3) = split(",", $message[$j]); if ($code2 == $ress3) { print "<blockquote>\n"; print "<form method=POST action=$PHP_SELF>\n"; print "<input type=radio name=delcode value=$code3>\n"; print "RE:<font color=$scolor3><b>$subject3</b></font>\n"; if ($email3 != "") { print " <a href=mailto:$email3><strong>$name3</strong></a>\n"; } else { print " <strong>$name3</strong>\n"; } if($hp3 != ""){ print " <a href=$hp3 target=_top><img src=$homegif border=0></a>\n"; } print " <font size=2 color='green'>$now3</font>\n"; print "<input type=hidden name=action value=delete>\n"; print "<font size=2>パスワード:</font><input type=password size=7 name=password>\n"; print "<input type=submit value=削除>\n"; print "<blockquote>$comment3<br><br>\n"; print "<font size=2>[$host3] $agent3</font></blockquote>\n"; print "</form></blockquote>\n"; } } print "<hr>\n"; } |
従来と同じ。 |
unset($message); $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"; } ?> </BLOCKQUOTE> </BODY> </HTML> |
従来の親記事用ファイルのunset()処理を削除。 |
*上の内容をこのまま複写しても動きません。何故なら、表示を見やすくする為コード中に全角スペースが入っているからです。実際にお使いになる時は、この点を修正してからサーバにアップして下さい。