返信機能付き掲示板
ようやく返信機能も付ける事が出来ました(^。^)ちょっと嬉しい!変数が増えて結構ややこしくなって来たけど、ソースをじっくり見てみてね(^o^)丿尚、親記事を別ファイルに分けるようにしましたので、注意してね(^^ゞデータ保存用ファイルの属性は、もちろん「666」又は「606」にしてね(^o^)丿
ついでに、コメント中でのインラインリンク機能(ただし、URLのみ)も追加しました。これは人様の関数をそのまま貰って来ちゃいました(^^ゞ
<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="20%" ALIGN="RIGHT">
<P ALIGN="RIGHT">お名前
</TD>
<TD WIDTH="80%"><INPUT TYPE="TEXT" NAME="name" SIZE="15"></TD>
</TR>
<TR>
<TD WIDTH="20%" ALIGN="RIGHT">
<P ALIGN="RIGHT">E-mail
</TD>
<TD WIDTH="80%"><INPUT TYPE="TEXT" NAME="email" SIZE="25"></TD>
</TR>
<TR>
<TD WIDTH="20%" ALIGN="RIGHT">
<P ALIGN="RIGHT">題目
</TD>
<TD WIDTH="80%"><INPUT TYPE="TEXT" NAME="subject" SIZE="40"></TD>
</TR>
<TR>
<TD WIDTH="20%" ALIGN="RIGHT">
<P ALIGN="RIGHT">コメント
</TD>
<TD WIDTH="80%"><TEXTAREA NAME="comment" ROWS="4" COLS="60"></TEXTAREA></TD>
</TR>
<TR>
<TD WIDTH="20%">
<P ALIGN="RIGHT">削除キー
</TD>
<TD WIDTH="80%"><INPUT TYPE="PASSWORD" NAME="pass" SIZE="10"></TD>
</TR>
<TR>
<TD WIDTH="20%"> </TD>
<TD WIDTH="80%"><FONT SIZE="2" COLOR="#CC0000">*半角英数8文字以上推奨。削除キーを設定すると、いつでもご自分の記事を削除できます。</FONT></TD>
</TR>
<TR>
<TD WIDTH="20%"> </TD>
<TD WIDTH="80%">従来と同じ。 <?php
if ($flags == 'return') {
print "<input type=submit value=[" . $code . "]に返信>\n";
print "<input type=hidden name=ress value=$code>\n";
} else {
print "<INPUT TYPE=SUBMIT VALUE=書き込み/更新> <INPUT TYPE=RESET VALUE=リセット>\n";
}
?>ここで、条件によって、返信用の送信ボタンを表示する。$flagsの値で条件を分岐します。 </TD>
</TR>
</TABLE>
</FORM>従来と同じ。 <?php
//===================初期設定=====================
//時間の取得
$now = date("Y/m/d H:i:s");
$data_file = "./g_book4.dat"; //データファイル名
$res_file = "./pare.dat"; //親記事保存用データファイル名
$data_max = 100; //データ最大記録数
$page_view = 10; //1ページの記事表示件数
$passwd = "****"; //管理者用パスワード親データだけを別に保存する為のファイルを設定します。 //===============データの削除==================
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,$dsubject,$dcomment,$dpass,$dnow) = split( ",", $delfile[$i]);
if (($password == $dpass) || ($password == $passwd)) {
if ($delcode != $dcode) {
fputs($fp,$delfile[$i]);
}
} else {
fputs($fp,$delfile[$i]);
}
}
fclose($fp);
}
}返信記事用の変数$dressを追加しました。 //===============インライン関数===================
function inline_link($link){
$link = ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>",$link);
return $link;
}人様から貰って来た関数です。文中のURLを自動リンクします。ただし、コードを見て頂ければ分かるように、E-mailには対応していません。悪しからず_(._.)_ //===============データの書き込み=================
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);従来と同じ。 //インラインリンクを実現(URLのみ)
$comment = inline_link($comment);ユーザー定義関数を呼び出しています。 //記事番号をゲット
$message = file($data_file);
if(sizeof($message) < 1){
$new_code = 1;
} else {
list($ncode,$nress,$nname,$nemail,$nsubject,$ncomment,$npass,$nnow) = split( ",", $message[0]);
$new_code = $ncode + 1;
}
//配列要素を文字列により連結
$input_msg = implode(",", array($new_code,$ress,$name,$email,$subject,$comment,$pass,$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);
}
}返信記事用の変数$nressと$ressとを追加しました。 //==================親記事だけを抜き出す=================
$message = file($data_file);
$fp = fopen($res_file, "w");
for($i=0; $i<sizeof($message); $i++){
list($rcode,$rress,$rname,$remail,$rsubject,$rcomment,$rpass,$rnow) = split( ",", $message[$i]);
if($rress == ""){
fputs($fp,$message[$i]);
}
}
fclose($fp);
unset($message);返信記事には変数$rressが付くので、これがない親記事だけを選んで、別ファイルに保存して行っています。 //==================HTML表示======================
//記事削除用エリア
print "<form method=POST action=$PHP_SELF>\n";
print "<input type=hidden name=action value=delete>\n";
print "記事番号:<input type=text size=10 name=delcode>\n";
print " 削除用パスワード:<input type=password size=10 name=password>\n";
print " <input type=submit value=削除>\n";
print "</form>\n";
print "<hr>\n";記事を削除し易いように、初めの部分にも記事削除用のスペースを作りました。 //1ページ当たりの表示件数の調整
$message = file($data_file);今回$messageは、返信記事を付ける為に使います。 $res_msg = file($res_file);
$msg_count = count($res_msg);
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,$ress2,$name2,$email2,$subject2,$comment2,$pass2,$now2) = split(",", $res_msg[$i]);ここは、親記事を表示する為の処理なので、別に作成した親記事だけの格納ファイルからデータを読み込んでいます。
返信記事用の変数$ress2を追加しています。//親記事の表示
print "<form method=POST action=$PHP_SELF>\n";
print "[" . $code2 . "]<font size=4 color='blue'>◆<b>$subject2</b></font>\n";
if($email2 != "")
print " <a href=mailto:$email2><b>$name2</b></a>\n";
else
print " <b>$name2</b>\n";
print " <font size=2 color='green'>$now2</font>\n";自分自身のスクリプトを指す変数$PHP_SELFを使っています。 print " <input type=submit value=返信>\n";
print "<input type=hidden name=flags value=return>\n";
print "<input type=hidden name=code value=" . $code2 . ">\n";返信用の送信ボタンを作ります。 print "<blockquote>$comment2<BR><BR>\n"; //返信記事の表示
for($j=0; $j<sizeof($message); $j++){
list($code3,$ress3,$name3,$email3,$subject3,$comment3,$pass3,$now3) = split(",", $message[$j]);
if ($code2 == $ress3) {
print "RE:[" . $code3 . "]<font color='blue'><b>$subject3</b></font>\n";
if ($email3 != "") {
print " <a href=mailto:$email3><strong>$name3</strong></a>\n";
} else { print " <strong>$name3</strong>\n";
}
print " <font size=2 color='green'>$now3</font>\n";
print "<blockquote>$comment3</blockquote>\n";
}
}
print "</blockquote></form><hr>\n";
}親記事に対応した返信記事をセレクトして表示しています。こちらは、大元の記事記録用ファイルからデータを読み込んでいる点に注意して下さい。 unset($res_msg);
unset($message);一応、指定した変数の割り当てを解除しています。 print "<form method=POST action=$PHP_SELF>\n";
print "<input type=hidden name=action value=delete>\n";
print "記事番号:<input type=text size=10 name=delcode>\n";
print " 削除用パスワード:<input type=password size=10 name=password>\n";
print " <input type=submit value=削除>\n";
print "</form>\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";
}
?>
</BLOCKQUOTE>
</BODY>
</HTML>自分自身のスクリプトを指す変数$PHP_SELFを使っています。 *上の内容をこのまま複写しても動きません。何故なら、表示を見やすくする為コード中に全角スペースが入っているからです。実際にお使いになる時は、この点を修正してからサーバにアップして下さい。