PHPプログラミング

ワークショップ

ひと言掲示板を作る(4)

ファイルにデータを保存する

「ひと言掲示板」のメッセージ入力フォームから受け取ったデータをファイルに保存する機能を付けます。

この記事のポイント

  • ファイルを開くにはfopen関数を使い、安全に閉じるにはfclose関数を使う
  • fwrite関数でテキストファイルにデータを書き込む

目次

メッセージをファイルに保存する

今回は、フォームから受け取ったメッセージのデータをファイルに保存する機能を付けていきます。

今までに次の3つのステップでメッセージの入力フォームを作成してきましたが、今回で一通り完成します。

  • 入力フォームのHTMLを作成
  • メッセージのデータを受け取る
  • ファイルへデータを書き込み ← 今回

「ひと言掲示板を作る」の概要については「ひと言掲示板を作る」をご覧ください。
デモはこちら

前回までに作成したコードはこちら:Github

受け取ったデータをファイルに保存する

前回までで、フォームに入力されたデータをスーパーグローバルの$_POSTでアクセスすることができました。
今回はそのデータをファイルに書き出して保存します。

例えば、次のようにメッセージを入力すると…

メッセージを書き込む

テキスト形式のファイルにメッセージが書き込まれます。

メッセージがファイルに書き込まれる

掲示板に書き込まれたメッセージはファイルにどんどん追加されていきます。

書き込まれたメッセージは順番にファイルに保存される

メッセージを保存するファイルは「message.txt」として、掲示板本体の「index.php」と同じ階層に設置します。
そこで、まず最初に「message.txt」へのパスを「定数」として宣言しておきましょう。

コード例

<?php

// メッセージを保存するファイルのパス設定
define( 'FILENAME', './message.txt');

if( !empty($_POST['btn_submit']) ) {
	var_dump($_POST);	
}
?>

-- 以下省略 --

「定数」は変数と同じようなものですが、変数と異なる点は値を1度設定すると後から変更することができません
今回のファイル名のような不変の値をあらかじめ「宣言する」という形で作成して使用します。
また、定数名は通常の変数と見分けやすいように、アルファベットの大文字で指定する慣習があります。

それでは、PHPから「message.txt」にアクセスして、受け取ったデータを書き込んでいきましょう。

PHPでファイルにアクセスする

まずはPHPからファイルにアクセスしていきます。
次の赤字のコードを追記してください。

コード例

<?php

// メッセージを保存するファイルのパス設定
define( 'FILENAME', './message.txt');

if( !empty($_POST['btn_submit']) ) {
	
	if( $file_handle = fopen( FILENAME, "a") ) {
	
		// ファイルを閉じる
		fclose( $file_handle);
	}	
}
?>

-- 以下省略 --

if文の中に、もう1つif文を追加して入れ子の状態になりました。
2つ目のif文の条件式ではfopen関数を使用して指定したファイルを開いています。

fopen関数は次のように使用します。

fopen関数のコード例

fopen( message.txt, "r");

1つ目のパラメータにはファイル名を含めたパスを指定し、2つ目のパラメータには「モード」を指定します。
2つ目のモードは用途に応じて様々な値があり、読み込みだけを行う「r」、書き込みを行う「w」や「a」などが用意されています。

w」と「a」は同じ書き込みを行うためのモードですが、「w」はファイル内容を一旦リセットして書き込みを行い、「a」は末端から追記する形で書き込みを行うという違いがあります。
いずれのモードも、もしファイルが存在しない場合は新規で作成します。
(指定できるモードについてより詳しくは「fopen関数でファイルの読み込み/書き込みを行う」をご覧ください。)

Note

ファイルの書き込みや新規作成では書き込み権限が必要です。
今回作成する「message.txt」が新規作成されなかったり、書き込みができない場合はPHPコードとあわせてディレクトリが書き込みを許可しているかも確認してみてください。

ファイルを無事に開くことができると、$file_handleに「ファイルポインターリソース」と呼ばれるファイルへのアクセス情報が代入されます。
ファイルからデータを読み込んだり書き込むときに、このポインターリソースが必ず必要になります。
もしファイルを開くことができなかった場合は$file_handlefalseが代入され、if文の中は実行されません。

if文の中にあるfclose関数はファイルを安全に閉じるための関数です。
こちらの関数はfopen関数とセットで使用し、先ほど取得したファイルポインターリソースを渡して閉じるファイルを特定します。

ここまででファイルを開いて、閉じることができるようになりました。

開いたファイルにデータを書き込む

引き続き、開いたファイルにデータを書き込んでいきます。
次の赤字のコードを追記してください。

コード例

<?php

// メッセージを保存するファイルのパス設定
define( 'FILENAME', './message.txt');

// タイムゾーン設定
date_default_timezone_set('Asia/Tokyo');

if( !empty($_POST['btn_submit']) ) {
	
	if( $file_handle = fopen( FILENAME, "a") ) {

		// 書き込み日時を取得
		$now_date = date("Y-m-d H:i:s");
	
		// 書き込むデータを作成
		$data = "'".$_POST['view_name']."','".$_POST['message']."','".$now_date."'\n";
	
		// 書き込み
		fwrite( $file_handle, $data);
	
		// ファイルを閉じる
		fclose( $file_handle);
	}		
}
?>

-- 以下省略 --

上から順に追記したコードを解説していきます。

// タイムゾーン設定」とdate_default_timezone_set関数は、メッセージが投稿された時間を日本のタイムゾーンで取得して書き込むために実行しています。

タイムゾーンは実行環境によって様々ですが、Linuxなどのサーバーではよく世界標準時間が初期設定になっていることがあります。
日本時間以外のタイムゾーンでそのまま投稿された時間を取得してしまうと時間がズレていたり、読み込みの都度時差を修正する必要があるなどやや面倒です。
そこで、上記のように予め扱うタイムゾーンを日本時間に設定してしまいます。

続いてif文の中に入り、次の2行ではメッセージを書き込まれた日時を取得して$now_dateに代入しています。

-- 省略 --

if( !empty($_POST['btn_submit']) ) {
	
	if( $file_handle = fopen( FILENAME, "a") ) {

		// 書き込み日時を取得
		$now_date = date("Y-m-d H:i:s");
	
		// 書き込むデータを作成
		$data = "'".$_POST['view_name']."','".$_POST['message']."','".$now_date."'\n";
	
		// 書き込み
		fwrite( $file_handle, $data);
	
		// ファイルを閉じる
		fclose( $file_handle);
	}		
}
?>

-- 省略 --

続いて、ファイルに書き込むデータを生成します。

-- 省略 --

if( !empty($_POST['btn_submit']) ) {
	
	if( $file_handle = fopen( FILENAME, "a") ) {

		// 書き込み日時を取得
		$now_date = date("Y-m-d H:i:s");
	
		// 書き込むデータを作成
		$data = "'".$_POST['view_name']."','".$_POST['message']."','".$now_date."'\n";
	
		// 書き込み
		fwrite( $file_handle, $data);
	
		// ファイルを閉じる
		fclose( $file_handle);
	}		
}
?>

-- 省略 --

今回はデータを次のような形式で書き込みます。

ファイルの書き込む形式

'Emily','掲示板に書き込んでみる','2019-03-20 23:22:47'

それぞれのテキストを「 (シングルクォーテーション)」で囲み、「表示名」「メッセージ」「投稿日時」をそれぞれ「, (コンマ)」で区切ります。
さらに、それぞれの投稿は「\n (改行)」で区切るようにします。

途中の「. (ドット)」は文字列連結子と呼ばれるもので、前後の文字列をくっつける役割を持ちます。
」と「」が混在するためちょっと分かりづらいかもしれませんが、$dataには最終的にファイルへ書き込みたい形式の文字列データが代入されます。

あとはfwrite関数でファイルへの書き込みを行います。
ここでも、書き込む対象となるファイルを判別するために$file_handleを1つ目のパラメータに指定します。
その後に2つ目のパラメータとして$dataを指定することで、先ほど作成したデータが「message.txt」に追記して保存されます。
メッセージは新しいものをファイルの末尾にどんどん追記していくため、上から古い順に並びます。

以上で、フォームから受け取ったメッセージをファイルに保存することができるようになりました。
次回はファイルからデータを読み込んで、掲示板にメッセージを表示していきます。

今回作成したコード:Github

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。