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

「ページ作成を関数化しよう」の章

PHP講座簡易ブログ構築スクリプト>ページ作成を関数化しよう
今回の目標:ページ作成機能を関数化する

前回までで、ブログの最も便利な点といえる「記事を書けばページ(HTML)を自動生成してくれる機能(CMS機能)」を実装できました。今回はその機能を関数の形でまとめてみましょう。

フォームデータの読み込み

その前にまず、フォームデータの読み込み、タグの除去、文字コードの変換、クオーテーションマークの変換を行うスクリプトを考えてみましょう。

// POSTデータを全て受け取りエスケープして変数に入れる
foreach($_POST as $k => $v) { 
	if(get_magic_quotes_gpc()) { $v=stripslashes($v); }
	$v=htmlspecialchars($v);
	$array[$k]=$v; 
} 
extract($array);

たとえば<input type="text" name="namae">というフォームからデータが送信されると、$namaeという変数に値が代入されます。なお今回のプログラムでは、htmlspecialcharsはコメントアウトします。

参考: フォームのデータを受け取りエスケープして変数に入れる:PHPプログラムを作る人のメモ帳

サンプルスクリプト

前回のスクリプトから、かなり修正がされていますので注意してください。

new.html
<html>

<body>

<form action="makefile.php" method="POST">
ページタイトル:<input type="text" name="pagetitle" /><br />
本文<br />
  <textarea name="honbun" rows="5" cols="50"></textarea><br />
  <input type="submit" value="送信" />
</form>

</body>
</html>
makefile.php
<html>
〜
<body>

<?php
$template = "template.php";	// テンプレートファイル名

if ($_POST{"honbun"}) {
	// ※1 POSTデータを全て受け取りエスケープして変数に入れる 
	foreach($_POST as $k => $v) { 
		if(get_magic_quotes_gpc()) { $v=stripslashes($v); }
		// $v=htmlspecialchars($v);
		$array[$k]=$v; 
	} 
	extract($array);

	// 文字コードをEUCに変換
	$honbun = mb_convert_encoding($honbun, "EUC-JP","AUTO");
	$pagetitle = mb_convert_encoding( htmlspecialchars($pagetitle), "EUC-JP","AUTO");

	// 改行を<br>タグに変換
	$honbun = nl2br($honbun);

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

	// ※2 メッセージ表示
	if (createNewPage( $filename, $template, $pagetitle, $honbun)) {
		echo $filename. "を生成し、書き込みを行いました。";
	} else {
		echo "ファイルの生成に失敗しました。";
	}
} else {
	echo "フォームから記事の内容を送信してください。";
}

// ※3 ページ生成関数 createNewPage()
function createNewPage( $filename, $template, $pagetitle, $honbun) {
	// ※4 テンプレートファイルの読み込み
	if ( ($contents = file_get_contents( $template)) == FALSE) { return false; }

	// タイトルと記事本文を挿入
	$contents = str_replace( "<%PAGETITLE>", $pagetitle, $contents);
	$contents = str_replace( "<%PAGECONTENTS>", $honbun, $contents);

	// ※5 ファイル生成&書き込み
	if ( ($handle = fopen( $filename, 'w')) == FALSE) { return false; }
	fwrite( $handle, $contents);
	fclose( $handle );

	return true;
}
?>

</body>
</html>

// ※1 POSTデータを全て受け取りエスケープして変数に入れる
上の方で紹介した通り。htmlspecialcharsはコメントアウトしています。ちなみに文字コードの変換をこの処理に含めないのは、将来的に英数字をフォーム送信することを考えてのこと。

// ※2 メッセージ表示
関数createNewPage()を呼び出して、戻り値によって処理を分けています。
true・・・処理成功、false・・・処理失敗です。

// ※3 // ページ生成関数 createNewPage()
これが今回の目玉であるユーザー定義関数です。
関数を定義する構文は、Javascriptとほとんど同じで次のようになります。

function 関数名(変数) {
	// 処理
	・・・

	return 戻り値;	// 省略可
}

ただしPHPでは、関数の内部の変数と外部の変数とは別物扱いされるので、$filename, $template, $pagetitle, $honbunがかぶったりすることはありません。

// ※4 テンプレートファイルの読み込み
file_get_contents()はファイルを読み込めなかった際にFALSEを返すことを利用して、エラー処理を組み込んでいます。
テンプレートファイルを読み込めなかった際には、createNewPage()は処理を中断して、falseを返します。

// ※5 ファイル生成&書き込み
※4と同じくエラー処理を組み込んでいます。

PHP講座簡易ブログ構築スクリプト>ページ作成を関数化しよう