修正機能付き日記帳
既存の記事を修正できる機能について研究して見ました。まずは簡単な所で日記帳などを作って見ました。これを使えば、掲示板等に編集機能を付けたりも出来ますよ(^o^)丿
今回から、printをechoに変更しました。少しでも字数が少ない方が…。
<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); //ログファイルの区切文字(",")と区別するために文字コード(,)に書き換える。 $subject = str_replace(",", ",",$subject); $msg = str_replace(",", ",",$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); //ログファイルの区切文字(",")と区別するために文字コード(,)に書き換える。 $subject = str_replace(",", ",",$subject); $msg = str_replace(",", ",",$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文なもので…(^^ゞ |
*上の内容をこのまま複写しても動きません。何故なら、表示を見やすくする為コード中に全角スペースが入っているからです。実際にお使いになる時は、この点を修正してからサーバにアップして下さい。