PHP

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

  1. 最終更新日:
  2. 公開日:

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

この記事のポイント

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

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

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

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

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

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

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

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

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

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

メッセージを書き込む

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

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

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

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

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

index.php

<?php

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

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

---- 以下省略 ----

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

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

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

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

index.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関数とセットで使用し、先ほど取得したファイルポインターリソースを渡して閉じるファイルを特定します。

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

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

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

index.php

<?php

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

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

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

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

---- 以下省略 ----

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

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

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

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

index.php

---- 省略 ----

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

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

---- 以下省略 ----

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

index.php

---- 省略 ----

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

    // 書き込み日時を取得
    $current_date = date("Y-m-d H:i:s");
  
    // 書き込むデータを作成
    $data = "'".$_POST['view_name']."','".$_POST['message']."','".$current_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

前のページメッセージのデータを受け取る

次のページファイルからデータを読み込む

記事一覧

  1. ひと言掲示板を作る
  2. メッセージの入力フォームを作る
  3. メッセージのデータを受け取る
  4. ファイルにデータを保存する
  5. ファイルからデータを読み込む
  6. 投稿完了メッセージを表示する
  7. 投稿の未入力バリデーションをつける
  8. 投稿されたデータをサニタイズする
  9. 投稿データの保存にデータベースを使う
  10. 掲示板のデータベースとテーブルを作成する
  11. 投稿データをデータベースに登録する
  12. データベースからデータを取得する
  13. コードを整理する
  14. セッションで表示名の入力を省略する
  15. 管理ページを作成する
  16. ログインページを作る
  17. 投稿データをCSV形式でダウンロードする
  18. 投稿データをダウンロードする件数を指定する
  19. 投稿メッセージの編集ページを作る
  20. メッセージを編集する機能を実装する
  21. 投稿メッセージの削除ページを作る
  22. 管理ページにログアウトを実装する
  23. リロードによる多重投稿を防止する
  24. 投稿に文字数制限を設定する

前の記事

記事一覧

次の記事