CMS機能は前回までで一応の区切りをつけて、今度はブログにコメントをつけられるようにしましょう。
方法としては次のような感じです。
何のことか分からない人もいるかもしれないので、とりあえずサンプルスクリプトを。
makefile.phpについては変更箇所のみ記入します。
// 乱数を生成してファイル名に
(追記) $pageid = rand( 1000000, 9999999);
$filename = $pageid . ".php"; (追記ここまで)
// 置換対象となる独自タグを設定
$originaltag{"PAGETITLE"} = $pagetitle;
$originaltag{"PAGECONTENTS"} = $honbun;
(追記) $originaltag{"PAGEID"} = $pageid; (追記ここまで)
今回、追加された独自タグ<%PAGEID>はファイル名と一致させることにしページごとのID情報を保持します。
<html> <head> <title><%PAGETITLE></title> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> </head> <body> <h1><%PAGETITLE></h1> <h2>記事本文</h2> <%PAGECONTENTS> (追記) <h2>コメントする</h2> <form method="POST" action="comments.php" name="comment_form"> <input type="hidden" name="pid" value="<%PAGEID>"> <!-- ※(注記)1 --> 名前:<input type="text" name="cname" size="20"><br> コメント:<br> <textarea name="ctext" rows="5" cols="30"> </textarea><br> <input type="submit" value="コメントする"> </form> (追記ここまで) (追記) <h2>この記事へのコメント</h2> <?php // ※(注記)2 コメントファイルを読み込み if(file_exists("<%PAGEID>.dat")) { include("<%PAGEID>.dat"); } ?> (追記ここまで) </body> </html>
次にテンプレートファイルです。コメントフォームをあらかじめ記入しておきます。
(追記) <input type="hidden" name="pid" value="<%PAGEID>"> <!-- ※(注記)1 --> (追記ここまで)
コメント処理プログラムcomments.phpにページIDを渡すことで、どの記事に対してのコメントなのかを判断します。
(追記) // ※(注記)2 コメントファイルを読み込み (追記ここまで)
ここでもページIDは活躍。投稿されたコメントは、ページID.datというファイルに保存されるようにしておいて、このファイルが存在する場合にはinclude関数を使ってファイルを読み込みます。
file_exists("ファイル名") // ファイルが存在すればTRUE
include("ファイル名"); // ファイルを読み込み出力する
<html>
<head>
<title>コメント投稿</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
</head>
<body>
<?php
if ($_POST{"ctext"}) {
// POSTデータを全て受け取りエスケープして変数に入れる
foreach($_POST as $k => $v) {
if(get_magic_quotes_gpc()) { $v=stripslashes($v); }
(追記) $v=htmlspecialchars($v); (追記ここまで)
$array[$k]=$v;
}
extract($array);
// 文字コードをEUCに変換
$ctext = mb_convert_encoding($ctext, "EUC-JP","AUTO");
$cname = mb_convert_encoding($cname, "EUC-JP","AUTO");
// 改行を<br>タグに
$ctext = nl2br($ctext);
// コメント内容を編集
$comment = $ctext . "<br><br>";
$comment.= $cname . " | ";
(追記) $comment.= date("Y年m月d日 g:i a"); // ※(注記)1 投稿日時 (追記ここまで)
$comment.= "<br><br><br>";
(追記) // ※(注記)2 コメントファイルに追記
if ( ($handle = fopen( $pid.".dat" , 'a')) == FALSE) { return false; }
fwrite( $handle, $comment);
fclose( $handle ); (追記ここまで)
echo "コメントを投稿しました。";
} else {
echo "コメントを記入してください。";
}
?>
</body>
</html>
ここは初期のmakefile.phpとほとんど同じです。フォームから渡される変数の名前が違うことに注意すれば、ほとんど問題は無いでしょう。
(追記) $comment.= date("Y年m月d日 g:i a"); // ※(注記)1 投稿日時 (追記ここまで)
date関数でコメント投稿日時を調べて追加します。というかよく考えたらブログ記事自体には日付機能がついてませんでしたね(汗)
例としては、2007年04月01日 6:33 pmのように表示されます。
date(フォーマット文字列); // 現在の日付をフォーマット文字列によってフォーマットして返す
| フォーマット文字 | 説明 | 戻り値の例 |
|---|---|---|
| 日 | --- | --- |
| d | 日。二桁の数字(先頭にゼロがつく) | 01 から 31 |
| D | 曜日。3文字のテキスト形式。 | Mon から Sun |
| j | 日。先頭にゼロをつけない。 | 1 から 31 |
| l (lowercase 'L') | 曜日。フルスペル形式。 | Sunday から Saturday |
| w | 曜日。数値。 | 0 (日曜)から 6 (土曜) |
| z | 年間の通算日。数字。(ゼロから開始) | 0 から 365 |
| 月 | --- | --- |
| F | 月。フルスペルの文字。 | January から December |
| m | 月。数字。先頭にゼロをつける。 | 01 から 12 |
| M | 月。3 文字形式。 | Jan から Dec |
| n | 月。数字。先頭にゼロをつけない。 | 1 から 12 |
| t | 指定した月の日数。 | 28 から 31 |
| 年 | --- | --- |
| L | 閏年であるかどうか。 | 1なら閏年。0なら閏年ではない。 |
| Y | 年。4 桁の数字。 | 例: 1999または2003 |
| y | 年。2 桁の数字。 | 例: 99 または 03 |
| 時 | --- | --- |
| a | 午前または午後(小文字) | am または pm |
| A | 午前または午後(大文字) | AM または PM |
| g | 時。12時間単位。先頭にゼロを付けない。 | 1 から 12 |
| G | 時。24時間単位。先頭にゼロを付けない。 | 0 から 23 |
| h | 時。数字。12 時間単位。 | 01 から 12 |
| H | 時。数字。24 時間単位。 | 00 から 23 |
| i | 分。先頭にゼロをつける。 | 00 to 59 |
| s | 秒。先頭にゼロをつける。 | 00 から 59 |
| タイムゾーン | --- | --- |
| O | グリニッジ標準時 (GMT) との時差 | 例: +0200 |
フォーマット文字にない文字はそのまま表示されます。
(追記) // ※(注記)2 コメントファイルに追記
if ( ($handle = fopen( $pid.".dat" , 'a')) == FALSE) { return false; } (追記ここまで)
この部分も初期の makefile.php とほぼ同じ。ただし、ファイル名が $pid.dat となっていることと、読み書きモードが 'a' (書き出しのみ。ファイルポインタをファイルの終端に。ファイルが存在しない場合には作成)になっていることに注意してください。