phpな休日 BBS sitemap
1. コメントを表示する

カレンダーを表示したら予定やメモなど書き込みたくなるので(日記として使っても良いし)、ログファイルを作って読み書きできるようにします。
イメージはこんな感じ。

実行

ログファイルはFORMから編集できるようにするつもりですが、今は

<><>1<>サラダ記念日<br>ポテトサラダが美味しかった日。<>
<><>15<>誰かの誕生日<br>だれか~!(にゃんこでも、わんこでも)<>

このようなファイル(calendarlog1.cgi)をテキストエディタで書いて、それを読み込んで表示しています。
読み込み部分のソースは以下のようになっています。

<table class="calendartable" cellspacing="0">
<?php
$hi = 1; //"日"は 1 から始める
$log = file("./calendarlog1.cgi"); //データを開いて
for ($i = $hi; $i < 3654; $i++) { //繰り返し
$you = date("w", mktime(0, 0, 0, $gatsu, $hi, $nen)); //曜日を取得
print "<tr><td valign='top' class='calendartdl'>" . $hi . "</td>¥n";
print "<td valign='top' class='calendartdy'>" . $youbi[$you] . "</td>¥n";
print "<td valign='top' class='calendartdr'>";
for ($i = 0; $i < count($log); $i++) { //展開する
$list = explode("<>", $log[$i]);
if ($hi == $list[2]) {
print $list[3];
break;
}
}
print "&nbsp;</td></tr>¥n";
$hi++; //日付+1
if (checkdate($gatsu, $hi, $nen) == false) { //+1した日付がありえない日付だったら
break; //繰り返し処理を抜ける
}
}
?>
</table>

2. コメントを書き込む

コメントを書き込むフォームを表示させるために、行末にセルを作り w の文字からその日の書き込みフォームへリンクするようにします。表示部分を

<a href='./memocalendar.php?wfnen=$nen&wfgatsu=$gatsu&wfhi=$hi'>w</a>

とした上で、ページを読み込む時に GET で $wfnen が送られてきた場合はフォームを表示します。
(変数 $wfnen は [Write Form 年] の略のつもりです。)

if (isset($_GET["wfnen"])) { //"年" がGETされてきたら
$wfnen = $_GET["wfnen"];
if (isset($_GET["wfgatsu"])){$wfgatsu = $_GET["wfgatsu"];} //GETの値を受け取って変数に割り当てる
if (isset($_GET["wfhi"])){$wfhi = $_GET["wfhi"];}
print "<form action='./memocalendar.php' method='POST'>";
print $wfnen . "年" . $wfgatsu . "月" . $wfhi . "日";
print " のコメントを編集できます。<br><br><br>¥n";
print "<input type='hidden' name='wnen' value='$wfnen'>";
print "<input type='hidden' name='wgatsu' value='$wfgatsu'>";
print "<input type='hidden' name='whi' value='$wfhi'>";
print "<textarea name='wcomment' rows='7' cols='68'>";
$ediline = file("calendarlog.cgi"); //データを開いて
for ($i = 0; $i < count($ediline); $i++) { //展開する
$edit = explode("<>", $ediline[$i]);
if (($edit[0] == $wfnen) && ($edit[1] == $wfgatsu) && ($edit[2] == $wfhi)) { //編集対象行を探す
if ($edit[3]) {$comment = str_replace("<br>", "¥r¥n", $edit[3]); //<br>を¥nに変換
$comment = str_replace("<br>", "¥r", $edit[3]); //<br>を¥nに変換
print $comment;
}
}
}
print "</textarea>";
print "<br><br><br>¥n";
print "pass ";
print "<input type='password' size='12' name='wpass'><br><br><br>¥n";
print "<input type='submit' value='送信'>¥n";
print "</form>¥n";
}
else {
以下通常の処理 ・


新規に書き込むためのフォームと、すでに書き込んであるコメントを編集するフォームを共用することにしました。上記赤文字部分が編集に必要な部分です。

このフォームから $wnen が POST されてきた場合の処理を追加します。すでに comment が存在する日の処理と、新規書き込み時の処理を if文で分けています。

if (isset($_POST["wnen"])){ //POSTに書き込みの値があれば
$wnen = $_POST["wnen"];
if (isset($_POST["wgatsu"])){$wgatsu = $_POST["wgatsu"];} //POSTの値を受け取って変数に割り当てる
if (isset($_POST["whi"])){$whi = $_POST["whi"];}
if (isset($_POST["wcomment"])){
$wcomment = $_POST["wcomment"];}
if( get_magic_quotes_gpc() ) { $wcomment = stripslashes("$wcomment"); } //クォートをエスケープする
$wcomment = str_replace("¥r¥n", "<br>", $wcomment); //Windows
$wcomment = str_replace("¥r", "<br>", $wcomment); //Machintosh
}
if (isset($_POST["wpass"])){$wpass = $_POST["wpass"];}
if (($wpass != "") && ($wpass == hogehoge)) { //パスワードが正しければ
$edit = file("calendarlog.cgi"); //データを開いて
for ($i = 0; $i < count($edit); $i++) { //展開する
$ediline = explode("<>", $edit[$i]);
if (($ediline[0] == $wnen) && ($ediline[1] == $wgatsu) && ($ediline[2] == $whi)) { //置き換え対象行を探す
$mode = "edit"; //すでにログファイルに同日のデータが存在すればエディットモードとする
$ediwrite = "$wnen<>$wgatsu<>$whi<>$wcomment<>¥n"; //置き換えする1行
array_splice($edit,$i,1,"$ediwrite"); //1行置き換え
}
$nfedi = fopen("calendarlog.cgi", "w"); //書き込みモードでデータを開
foreach($edit as $fe) fputs($nfedi, $fe); //1行置き換えして書き込む
fclose($nfedi); //閉じる
}
if ($mode != "edit") { //エディットモードでない場合(新規書き込み時)
$writeline = "$wnen<>$wgatsu<>$whi<>$wcomment<>¥n"; //書き込みする1行
$log = file("calendarlog.cgi"); //データを読み込む
$list = fopen("calendarlog.cgi","w"); //追加書き込み 空になる
fputs($list, $writeline); //先頭に1行書き込む
for($i = 0; $i < 3654; $i++){ //3654行だけ残して捨てる
fputs($list, $log[$i]); //今までの分を書き込む
}
fclose ($list); //ファイルを閉じる
}
}

一度書き込みをしたけれど後からコメントを削除した場合、ログファイルに“年月日”のデータだけ残ってしまうので、コメントが空の場合はログを削除する処理を加えます。
条件はエディットモードと判断された上で、コメントが空だった場合です。

if (($ediline[0] == $wnen) && ($ediline[1] == $wgatsu) && ($ediline[2] == $whi)) { //置き換え対象行を探す
$mode = "edit";
$ediwrite = "$wnen<>$wgatsu<>$whi<>$wcomment<>¥n"; //置き換えする1行
if ($wcomment != "") {
array_splice($edit,$i,1,"$ediwrite"); //1行置き換え
}
else {
array_splice($edit, $i, 1); //一行削除
}
}
$nfedi = fopen('calendarlog.cgi', 'w'); //書き込みモードでデータを開く
foreach($edit as $fe) fputs($nfedi, $fe); //1行置き換えして書き込む
fclose($nfedi); //閉じる

実行

このメモカレンダーを こちら からzip形式でダウンロードできるようにしました。 お役立てください。


Fatal error: Uncaught Error: Undefined constant "Y.n.j" in /home/users/2/secret.jp-final/web/phpholiday/24/index.cgi:173 Stack trace: #0 /home/users/2/secret.jp-final/web/phpholiday/index.php(334): include() #1 {main} thrown in /home/users/2/secret.jp-final/web/phpholiday/24/index.cgi on line 173