前回までで、ブログの最も便利な点といえる「記事を書けばページ(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プログラムを作る人のメモ帳
前回のスクリプトから、かなり修正がされていますので注意してください。
<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>
<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と同じくエラー処理を組み込んでいます。