修正機能付き日記帳

 既存の記事を修正できる機能について研究して見ました。まずは簡単な所で日記帳などを作って見ました。これを使えば、掲示板等に編集機能を付けたりも出来ますよ(^o^)丿

 今回から、printechoに変更しました。少しでも字数が少ない方が…。

<HTML>
<HEAD>
<TITLE>KOMOダイアリー</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFBF0" BACKGROUND="" LINK='red' VLINK='red'>
<CENTER>
<P>
<TABLE BORDER="3" WIDTH="37%" BGCOLOR="#CC0099">
<TR>
<TD WIDTH="100%">
<P ALIGN="CENTER"><FONT SIZE="6" COLOR="white">KOMOダイアリー</FONT>
</TD>
</TR>
</TABLE>
</P>
<P><B><FONT COLOR="#990066">編集機能付きの日記帳スクリプトだよ!結構便利なので、使って見てね(^o^)丿</FONT></B><BR><BR>
基本はHTML文です。
<?php PHP開始の合図。
//========================初期設定=========================
$data_file = './diary.dat'; //データログ用ファイル
$passwd = '****'; //管理者用パスワード
$data_max = 100; //データ最大記録数
$page_view = 10; //1ページの記事表示件数
$now = date("Y/m/d(D)"); //時間の取得
初期設定です。
//==================コメント書き込みフォーム生成関数==================
function Comment(){
 global $data_file,$PHP_SELF,$now,$e_code;
 if ($e_code < 1) {
  echo "<form action=$PHP_SELF method=POST>\n";
  echo "<input type=hidden name=action value=regist>\n";
  echo "<table border=0>\n";
  echo "<tr><td align=right>日付:</td><td><input type=text size=20 name=date value=$now></td></tr>\n";
  echo "<tr><td align=right>題名:</td><td><input type=text size=35 name=subject></td></tr>\n";
  echo "<tr><td align=right>コメント:</td><td><textarea name=msg rows=6 cols=50></textarea></td></tr>\n";
  echo "</table>\n";
  echo "<input type=submit value=送信/更新> <input type=reset value=リセット>\n";
 } else {
  $comdata = file($data_file);
  for($i=0; $i<count($comdata); $i++){
   list($ccode,$csubject,$cmsg,$cdate) = split(",", $comdata[$i]);
   if ($e_code == $ccode) {
    $e_subject = $csubject; $e_msg = $cmsg; $e_date = $cdate;
    $e_msg = str_replace("<br>", "\n", $e_msg);
    break;
   }
  }
  unset($comdata);
  echo "<form action=$PHP_SELF method=POST>\n";
  echo "<input type=hidden name=action value=regist>\n";
  echo "<input type=hidden name=code value=$e_code>\n";
  echo "<table border=0>\n";
  echo "<tr><td align=right>日付:</td><td><input type=text size=20 name=date value=$e_date></td></tr>\n";
  echo "<tr><td align=right>題名:</td><td><input type=text size=35 name=subject value=$e_subject></td></tr>\n";
  echo "<tr><td align=right>コメント:</td><td><textarea name=msg rows=6 cols=50>$e_msg</textarea></td></tr>\n";
  echo "</table>\n";
  echo "<input type=submit name=button value=修正/更新> <input type=submit name=button value=削除>\n";
 }
 echo "</form>\n";
}
コメントを書き込む為の関数Comment( )を作ります。

最初に
グローバル変数を設定している点に注意して下さい。

変数
$e_code(記事番号)の値によって条件分岐しています。1より小さいと言うのは、記事指定がない事です。つまり、新規書き込みになります。この場合、日付の欄には自動的に今日の日付が入るようにしました。

記事指定がある場合は、データファイルからコードが一致する記事のそれぞれの値を取得して、
valueに取り込んでいます。最初、記事一覧からフォームデータにそれぞれの値を持たせて、それぞれのデータを受け渡そうとしたんですが、何故かエラーが出て使い物になりませんでした。苦肉の策という所でしょうか(^^ゞ

今回の最大の関門は、ここで取得した
$e_msgの値の扱いでした。書き込みの段階でnl2br( )関数を使っていますので、ファイルデータから直接表示する場合には、ここがネックになって不具合が発生していました。そこで、ここではstr_replace( )関数を使って$msgに逆の処理を施しています。これに気づくのに何時間かかった事か…(^^ゞ
//==================コメント一覧表示関数=====================
function View(){
 global $data_file,$pline,$page_view,$PHP_SELF,$password,$passwd,$action;
 $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($vcode,$vsubject,$vmsg,$vdate) = split( ",", $message[$i]);
  echo "<form action=$PHP_SELF method=POST>\n";
  echo "<input type=hidden name=action value=edit>\n";
  echo "<input type=hidden name=e_code value=$vcode>\n";
  echo "<table border=1 width=600 bordercolor='green'>\n";
  echo "<tr><td><b>■ $vdate</b>\n";
  echo " <font color='blue' size=4><b>$vsubject</b></font>\n";
  if (($action == 'edit') && ($password == $passwd)) {
   echo "<input type=hidden name=password value=$passwd> <input type=submit value=訂正>\n";
  }
  echo "</td></tr><tr><td><blockquote>$vmsg</blockquote></td></tr></table></form>\n";
 }
 $next_line = $page_end + 1;
 if($page_end != $end_data){
  echo "<form method=Post action=$PHP_SELF>\n";
  if (($action == 'edit') && ($password == $passwd)) {
   echo " <input type=hidden name=action value=edit>\n";
   echo "<input type=hidden name=password value=$passwd>\n";
  }
  echo "<input type=hidden name=pline value=$next_line>\n";
  echo "<input type=submit value=次のページ>\n";
  echo "</form>\n";
 }
}
記録データを一覧表示する為の関数View( )を作ります。1ページ毎の表示件数を設定しているので、最初の部分がちょっとややこしいですが、この部分は掲示板スクリプトと同じなので、詳しくはそちらを参考にして下さい。

最初に
グローバル変数を設定している点に注意して下さい。

一つ一つの記事に、条件分岐の為の値を持たせている点に注意して下さい。
$actionの値が編集指定(edit)なら記事に「訂正」ボタンを付けます。

「次のページ」に移る場合も、編集指定を維持する為に、そのボタンに必要な値を持たせています。
//===============データ書き込み関数=================
function Regist(){
 global $date,$subject,$msg,$data_file,$data_max;
 if ($msg != ""){
  //ここから書き込みデータの調整
  $subject = htmlspecialchars($subject);
  $subject = nl2br($subject);
  $subject = str_replace("\r", "", $subject);
  $subject = str_replace("\n", "", $subject);
  $msg = htmlspecialchars($msg);
  $msg = nl2br($msg);
  $msg = str_replace("\r", "", $msg);
  $msg = str_replace("\n", "", $msg);
  //ログファイルの区切文字(",")と区別するために文字コード(&#44)に書き換える。
  $subject = str_replace(",", "&#44;",$subject);
  $msg = str_replace(",", "&#44;",$msg);
  //記事番号をゲット
  $message = file($data_file);
  if(count($message) < 1){
   $new_code = 1;
  } else {
   list($ncode,$nsubject,$nmsg,$ndate) = split( ",", $message[0]);
   $new_code = $ncode + 1;
  }
  //配列要素を文字列により連結
  $input_msg = implode(",", array($new_code,$subject,$msg,$date));
  $fp = fopen($data_file, "w");
  rewind($fp);
  fputs($fp, "$input_msg\n");
  //最大記録数の調整
  if($data_max <= count($message))
   $msg_num = $data_max - 1;
  else
   $msg_num = count($message);
  for($i = 0; $i < $msg_num; $i++){
   fputs($fp, $message[$i]);
  }
  fclose($fp);
  unset($message);
 }
}
データを書き込む為の関数Regist( )を作ります。

最初に
グローバル変数を設定している点に注意して下さい。

内容的には、掲示板スクリプトでもうお馴染みかと思います。詳しくは、そちらをご覧下さい。
//===============データ修正関数===================
function Replace(){
 global $data_file,$date,$code,$subject,$msg;
 //ここから書き込みデータの調整
 $subject = htmlspecialchars($subject);
 $subject = nl2br($subject);
 $subject = str_replace("\r", "", $subject);
 $subject = str_replace("\n", "", $subject);
 $msg = htmlspecialchars($msg);
 $msg = nl2br($msg);
 $msg = str_replace("\r", "", $msg);
 $msg = str_replace("\n", "", $msg);
 //ログファイルの区切文字(",")と区別するために文字コード(&#44)に書き換える。
 $subject = str_replace(",", "&#44;",$subject);
 $msg = str_replace(",", "&#44;",$msg);
 $repdata = file($data_file);
 $fp = fopen($data_file, "w");
 for($i=0; $i<count($repdata); $i++){
  list($rcode,$rsubject,$rmsg,$rdate) = split( ",", $repdata[$i]);
  if ($code == $rcode) {
   $repdata[$i] = "$code,$subject,$msg,$date\n";
   fputs($fp, $repdata[$i]);
  } else {
   fputs($fp, $repdata[$i]);
  }
 }
 fclose($fp);
}
既存の記事の内容を修正する為の関数Replace( )を作ります。

最初に
グローバル変数を設定している点に注意して下さい。

基本的にはデータ書き込みの場合と同じですが、ミソはループ処理の中で記事番号が一致した時に、その内容をフォームデータから受け取った値に入れ替えている点です。今回ここで最も苦労しました。出来てしまったら、本当簡単なコードなんだけどね(^^ゞ
//===============データの削除関数==================
function Delete(){
 global $data_file,$code;
 $deldata = file($data_file);
 $fp = fopen($data_file, "w");
 for($i=0; $i<count($deldata); $i++){
  list($dcode,$dsubject,$dmsg,$ddate) = split(",", $deldata[$i]);
  if ($code != $dcode) {
   fputs($fp, $deldata[$i]);
  }
 }
 fclose($fp);
}
既存のデータを削除する為の関数Delete( )を作ります。

最初に
グローバル変数を設定している点に注意して下さい。

ここも定番の処理です。
PHP4ならPerlみたいに該当記事だけを配列から削除出来るのですが、うちのサーバーではPHP3が動いているもので…(^^ゞそのうちアップグレードしますです_(._.)_
//==================フッター表示関数====================
function Foot(){
 global $PHP_SELF,$pline;
 echo "<div align=left>\n";
 echo "<form action=$PHP_SELF method=POST>\n";
 echo "<input type=hidden name=action value=edit>\n";
 echo "<input type=password size=10 name=password>\n";
 echo " <input type=submit value=管理><br>\n";
 echo "</form></div>\n";
}
管理者画面に移る為のボタンを表示する関数Foot( )を作ります。

パスワードによって、一般の人が書き込み出来ないようになっています。
//==================メイン処理=======================
if(($action == "regist") && ($button == "修正/更新")){ Replace(); View(); Foot(); }
elseif(($action == "regist") && ($button == "削除")){ Delete(); View(); Foot(); }
elseif($action == "regist"){ Regist(); View(); Foot(); }
elseif(($action == "edit") && ($password == $passwd)){ Comment(); View();}
else { View(); Foot(); }
メイン処理です。
?> PHP終了の合図。
</BODY>
</HTML>
本体がHTML文なもので…(^^ゞ

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

HOME