PHPで簡易ブログを作ろう!

コメント機能をつけるの章

PHP講座簡易ブログ構築スクリプト>コメント機能をつける
今回の目標:記事にコメントをつけられるようにする

CMS機能は前回までで一応の区切りをつけて、今度はブログにコメントをつけられるようにしましょう。

方法としては次のような感じです。

  1. コメント投稿処理専用プログラムcomments.phpを作成
  2. テンプレートファイル自体にコメントフォームを入れておく
  3. 生成された記事ファイルにはコメントフォームとページIDが埋め込まれる
  4. ユーザーは記事ファイルからコメント投稿
  5. comments.phpで、コメントを専用ファイル (pageid.dat) に保存
  6. 記事ファイルからコメントファイルをincludeする(そのため記事ファイルはphpで作成する)

何のことか分からない人もいるかもしれないので、とりあえずサンプルスクリプトを。

サンプルスクリプト

makefile.phpについては変更箇所のみ記入します。

makefile.php
	// 乱数を生成してファイル名に
	$pageid = rand( 1000000, 9999999);
	$filename = $pageid . ".php";

	// 置換対象となる独自タグを設定
	$originaltag{"PAGETITLE"} = $pagetitle;
	$originaltag{"PAGECONTENTS"} = $honbun;
	$originaltag{"PAGEID"} = $pageid;

今回、追加された独自タグ<%PAGEID>はファイル名と一致させることにしページごとのID情報を保持します。

template.php
<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("ファイル名"); // ファイルを読み込み出力する

comments.php
<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(フォーマット文字列); // 現在の日付をフォーマット文字列によってフォーマットして返す

【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' (書き出しのみ。ファイルポインタをファイルの終端に。ファイルが存在しない場合には作成)になっていることに注意してください。

PHP講座簡易ブログ構築スクリプト>コメント機能をつける