標準掲示板

 やっと記事の削除機能を付ける事が出来ました。いやー、削除の際の条件設定に本当てこずりました。色々な場合を設定してやらないとね!(^^ゞでは、以下にソースを示します。尚、変更箇所は分かり易いように色を変えています。

<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="80%">
<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"><FONT SIZE="2" COLOR="#CC0000">(半角英数8文字以上推奨)</FONT></TD>
</TR>
自分が書き込んだ記事を削除する為の「削除キー」を設定するテキストボックスを作成しました。
<TR>
<TD WIDTH="20%">&nbsp;</TD>
<TD WIDTH="80%"><INPUT TYPE="SUBMIT" VALUE="書き込み/更新"> <INPUT TYPE="RESET" VALUE="リセット"></TD>
</TR>
</TABLE>
</FORM>
<HR ALIGN="CENTER">
従来と同じ。
<?php PHP開始の合図。
//===================初期設定=====================
//時間の取得
$now = date("Y/m/d H:i:s");
$data_file = "./g_book3.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,$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);
 }
}
ここが今回一番苦労した所です。Perlのように該当記事だけ削除できるような関数が見当たらないので、逆の方法、つまり削除対象以外の記事を再度ファイルに書き込んで表示し直すと言う方法を採りました。

ループ処理の中で、それぞれの条件を満たした記事を再度
$fpに書き込んで行っています。処理内容自体はそう難しくありません(^^ゞ
//===============データの書き込み=================
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);
  //記事番号をゲット
  $message = file($data_file);
  if(sizeof($message) < 1){
   $new_code = 1;
  } else {
   list($ncode,$nname,$nemail,$nsubject,$ncomment,$npass,$nnow) = split( ",", $message[0]);
   $new_code = $ncode + 1;
  }
  //配列要素を文字列により連結
  $input_msg = implode(",", array($new_code,$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);
 }
}
記事削除用の変数をそれぞれ追加しました。$passがフォームデータであるのに対し、$npassは一時的に得たデータである点に注意して下さい。
//==================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,$pass2,$now2) = split( ",", $message[$i]);
 //記事表示部を生成
 print "[" . $code2 . "]<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";
}
記事削除用の変数$pass2を追加し、記事を削除する為に、記事番号を追加表示するようにしました。
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>";
print " 削除用パスワード:<input type=password size=10 name=password>";
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>
従来と同じ。

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

HOME