旅インプットファイナンス時事ネタその他GRAYCODEについてお問い合わせプライバシーポリシーサイトポリシーPHPプログラミングfacebookTweethatenaline2019.06.10ワークショップひと言掲示板を作る(4)ファイルにデータを保存する「ひと言掲示板」のメッセージ入力フォームから受け取ったデータをファイルに保存する機能を付けます。この記事のポイントファイルを開くにはfopen関数を使い、安全に閉じるにはfclose関数を使うfwrite関数でテキストファイルにデータを書き込む目次メッセージをファイルに保存する受け取ったデータをファイルに保存するPHPでファイルにアクセスする開いたファイルにデータを書き込むメッセージをファイルに保存する今回は、フォームから受け取ったメッセージのデータをファイルに保存する機能を付けていきます。今までに次の3つのステップでメッセージの入力フォームを作成してきましたが、今回で一通り完成します。「ひと言掲示板を作る」の概要については「ひと言掲示板を作る」をご覧ください。デモはこちら前回までに作成したコードはこちら:Github受け取ったデータをファイルに保存する前回までで、フォームに入力されたデータをスーパーグローバルの$_POSTでアクセスすることができました。今回はそのデータをファイルに書き出して保存します。次のようにメッセージを入力すると...テキスト形式のファイルにメッセージが書き込まれます。掲示板に書き込まれたメッセージはファイルにどんどん追加されていきます。メッセージを保存するファイルは「message.txt」として、掲示板本体の「index.php」と同じ階層に設置します。そこで、まず最初に「message.txt」へのパスを「定数」として宣言しておきましょう。--「定数」は変数と同じようなものですが、変数と異なる点は値を1度設定すると後から変更することができません。今回のファイル名のような不変の値をあらかじめ「宣言する」という形で作成して使用します。定数名は通常の変数と見分けやすいように、アルファベットの大文字で指定する慣習があります。それでは、PHPから「message.txt」にアクセスして、受け取ったデータを書き込んでいきましょう。PHPでファイルにアクセスするまずはPHPからファイルにアクセスしていきます。次の赤字のコードを追記してください。--if文の中に、もう1つif文を追加して入れ子の状態になりました。2つ目のif文の条件式ではfopen関数を使用して指定したファイルを開いています。fopen関数は次のように使用します。"r");1つ目のパラメータにはファイル名を含めたパスを指定し、2つ目のパラメータには「モード」を指定します。2つ目のモードは用途に応じて様々な値があり、読み込みだけを行う「r」、書き込みを行う「w」や「a」などが用意されています。「w」と「a」は同じ書き込みを行うためのモードですが、「w」はファイル内容を一旦リセットして書き込みを行い、「a」は末端から追記する形で書き込みを行うという違いがあります。いずれのモードも、もしファイルが存在しない場合は新規で作成します。(指定できるモードについてより詳しくは「fopen関数でファイルの読み込み/書き込みを行う」をご覧ください。)Noteファイルの書き込みや新規作成では書き込み権限が必要です。今回作成する「message.txt」が新規作成されなかったり、書き込みができない場合はPHPコードとあわせてディレクトリが書き込みを許可しているかも確認してみてください。ファイルを無事に開くことができると、$file_handleに「ファイルポインターリソース」と呼ばれるファイルへのアクセス情報が代入されます。ファイルからデータを読み込んだり書き込むときに、このポインターリソースが必ず必要になります。ファイルを開くことができなかった場合は$file_handleにfalseが代入され、if文の中は実行されません。if文の中にあるfclose関数はファイルを安全に閉じるための関数です。こちらの関数はfopen関数とセットで使用し、先ほど取得したファイルポインターリソースを渡して閉じるファイルを特定します。ここまででファイルを開いて、閉じることができるようになりました。開いたファイルにデータを書き込む引き続き、開いたファイルにデータを書き込んでいきます。次の赤字のコードを追記してください。--上から順に追記したコードを解説していきます。タイムゾーン設定」とdate_default_timezone_set関数は、メッセージが投稿された時間を日本のタイムゾーンで取得して書き込むために実行しています。タイムゾーンは実行環境によって様々ですが、Linuxなどのサーバーではよく世界標準時間が初期設定になっていることがあります。日本時間以外のタイムゾーンでそのまま投稿された時間を取得してしまうと時間がズレていたり、読み込みの都度時差を修正する必要があるなどやや面倒です。そこで、上記のように予め扱うタイムゾーンを日本時間に設定してしまいます。続いてif文の中に入り、次の2行ではメッセージを書き込まれた日時を取得して$now_dateに代入しています。--続いて、ファイルに書き込むデータを生成します。--今回はデータを次のような形式で書き込みます。(コンマ)」で区切ります。(改行)」で区切るようにします。(ドット)」は文字列連結子と呼ばれるもので、前後の文字列をくっつける役割を持ちます。「“」と「‘」が混在するためちょっと分かりづらいかもしれませんが、$dataには最終的にファイルへ書き込みたい形式の文字列データが代入されます。あとはfwrite関数でファイルへの書き込みを行います。ここでも、書き込む対象となるファイルを判別するために$file_handleを1つ目のパラメータに指定します。その後に2つ目のパラメータとして$dataを指定することで、先ほど作成したデータが「message.txt」に追記して保存されます。メッセージは新しいものをファイルの末尾にどんどん追記していくため、上から古い順に並びます。以上で、フォームから受け取ったメッセージをファイルに保存することができるようになりました。次回はファイルからデータを読み込んで、掲示板にメッセージを表示していきます。今回作成したコード:Githubこちらの記事は役に立ちましたか?GoodBadありがとうございます。よろしければ、あわせてフィードバックや要望などをご入力ください。コメント送信コメントありがとうございます!運営の参考にさせていただきます。)PHP2019-11-16フォームの基本構造を作成するPHP2019-11-16はしご高など旧字体漢字の文字化けを防ぐRECOMMEND遅いインターネット評論家の宇野常寛の新著。2018年頃から提唱されている「インターネットによって失った未来をインターネットによって取り戻す」をテーマにした本書が、いよいよ2月20日から書店に並びます。宇野さんがずっと温めてきた構想が詰まった1冊なので、個人的に非常に楽しみにしている一冊です。