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

ファイル生成(ファイルの読み書き)の章

PHP講座簡易ブログ構築スクリプト>ファイル生成(ファイルの読み書き)
今回の目標:フォーム(テキストエリア)から受け取ったデータをファイルに保存する。

ブログの最も大きな長所と言えば、記事を書くだけでページ(HTML)を生成してくれることではないでしょうか?(こういう機能をCMS機能と言ったりします)

そのブログの要、最も便利な機能である「ページ生成」を最初に実装してしまいましょう。

処理の流れとしてはこんな感じです。

  1. ユーザーがフォームから記事を書いて送信
  2. テンプレートファイルを読み込む
  3. 読み込んだテンプレートファイルに記事を挿入しHTMLファイルを生成する

なお今回はフォームデータの読み込みから、ファイル作成・保存までを行います。テンプレートファイルの読み込みは次回に。

サンプルスクリプト

まずはテンプレートファイルを読み込まずに、読み込んだフォームデータをそのままファイルに出力するスクリプトを書いてみます。

new.html
<html>
〜
<body>

<form action="makefile.php" method="POST">
  <textarea name="honbun" rows="5" cols="50"></textarea><br />
  <input type="submit" value="送信" />
</form>

</body>
</html>
makefile.php
<html>
<head>
<title>ブログ作成</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
</head>
<body>

<?php
if ($_POST{"honbun"}) {	// ※1 記事が記入されていればファイル生成開始
	$honbun = $_POST{"honbun"};

	// ※2 タグを除去する場合はコメントアウトを外す
	// $honbun = htmlspecialchars($honbun);
 
	// ※3 文字コードをEUCに変換
	$honbun = mb_convert_encoding($honbun, "EUC-JP","AUTO");

	// ※4 クオーテーションマークを変換
	if(get_magic_quotes_gpc()) { $honbun = stripslashes($honbun); } 

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

	// ※6 ファイル生成&書き込み
	$handle = fopen( $filename, 'w');
	fwrite( $handle, $honbun);
	fclose( $handle );

	// メッセージ表示
	echo $filename. "を生成し、書き込みを行いました。";
} else {
	echo "フォームから記事の内容を送信してください。";
}
?>

</body>
</html>

スクリプトの解説

// ※1 記事が記入されていればファイル生成開始
フォームからのデータ受け取りは、method="POST"ならば$_POST{"名前"}、method="GET"ならば$_GET{"名前"}で受け取ることができます。

// ※2 タグを除去する場合はコメントアウトを外す
htmlspecialcharsは、>,<,&などHTMLにおいて特別な意味を持つ記号を&gt;,&lt;,&amp;などの無害な表示に置き換えるタグです。一般公開する場合には有効にすることをおすすめします。

// ※3 文字コードをEUCに変換
mb_convert_encodingは文字コードを変換する関数です。書式としては次のようになります。
mb_convert_encoding( 変換文字列, 変換後文字コード, 変換元文字コード)

指定できる文字コードでよく使われるのは、SJIS(シフトJIS)、UTF-7(UTF), EUC-JP(日本語EUC)などでしょう。変換元文字コードには、AUTO(自動)を選択することもできます。
なお変換元文字コードを省略した場合には内部文字エンコーディングからの変換となります。

// ※4 クオーテーションマークを変換
クオーテーションマーク(')、ダブルクオーテーションマーク(")はフォームから渡されるとそれぞれ、\',\"というようにバックスラッシュ(\) がついてしまうので、stripslashes関数を使ってこれを修正しています。この部分はそのまま覚えておいても良いでしょう。

// ※5 乱数を生成してファイル名に
rand関数は、乱数を生成する関数です。min〜max(両端含む)の間の乱数を生成したい場合には次のような書式となります。
rand( min, max)

// ※6 ファイル生成&書き込み
fopen関数はファイルのオープンを行います。
fopen( ファイル名, 読み書きモード)
読み書きモードでよく使われるものとしては次のようなモードがあります。

mode説明
'r' 読み込みのみ
'r+' 読み書き両用
'w' 書き出しのみ。ファイルサイズをゼロに。ファイルが存在しない場合には作成
'w+' 読み書き両用。ファイルサイズをゼロに。ファイルが存在しない場合には作成
'a' 書き出しのみ。ファイルポインタをファイルの終端に。ファイルが存在しない場合には作成
'a+' 読み書き両用。ファイルポインタをファイルの終端に。ファイルが存在しない場合には作成

このほかに、'x'と'x+'のモードがあるのですが、使う機会はまずないでしょう。

次のfwrite()でファイルに書き出しを行い、fclose()でファイルを閉じています。この一連の流れはそのまま覚えておくと良いでしょう。
fwrite( ファイルハンドル, 書き込む内容)

PHP講座簡易ブログ構築スクリプト>ファイル生成(ファイルの読み書き)