PHPとテキストファイルで簡易掲示板を作ってみた ③ ( 後編 )

前編からの続きです。

③ テキストファイルに書き込んで保存する

名前、コメント、投稿日時がそろったところで、いよいよファイル操作を使ったプログラムを書いていきます。
その前に、保存先のファイル名はこの後で何度も使うため、先に変数に代入してしまいます。
今回使用するのはテキストファイルなので'kakikomi.txt'という名前にしました。

// 保存先のファイル名を$filenameに代入
$filename = 'kakikomi.txt';

ファイル操作は基本的に以下の流れで行います。
1. ファイルを開く
2. ファイルに関する処理 (読み込み・書き込みなど)
3. ファイルを閉じる

1. ファイルを開く

ファイルを開くにはfopen関数を使います。
fopen( ' ファイル名 ', ' モード ')で指定したファイルを任意のモードで開くことができます。
モードにはいくつか種類があり、今回は以下の3つを覚えました。(その他のモードについてはこちら)

モード 役割 特徴
r 読み込み    ファイルポインタは先頭
w 書き込み    ファイルポインタは先頭
指定したファイルが存在しない場合に新規作成
a 追加書き込み ファイルポインタは終端
指定したファイルが存在しない場合に新規作成

( 特に注意したいのは、書き込みのモード(w)で開くとその時点でファイルの中身が白紙になってしまう点です。初めこの特徴を理解しておらず、せっかく書き込んだ内容がなかったことに...ということもありました笑 )

fopen() はファイルハンドルと呼ばれるファイルを特定するためのIDのようなものを戻り値として返すので、今回はこれを$fpという変数で受け取ります。(変数名はなんでもOKです!)
今後の操作においても、ファイル名ではなくファイルハンドルを使って行います。

$fp = fopen($filename, 'a'); // ファイルを追記モードで開く

それまでの内容に追加で書き込みたいので追加書き込み( a )のモードを使います。
初めて書き込みが行われる場合は、この時点で保存用のファイルが新しく作られます。

2. ファイルに関する処置を記述する (投稿番号の取得、書き込み)
2-1. 投稿番号の取得

ファイルを開けたところで早速書き込みを行いたいのですが、先に投稿番号を取得します。
count(file( 'ファイル名' ))で指定した名前のファイルにあるデータの行数を数えて戻り値として受け取ることができ、その数値に1を足すと、投稿番号が取得できます。
$num++はインクリメント演算子を使って書いていますが、$num = $num + 1と同じ意味です。

$num = count( file( $filename ) ); // ファイルのデータの行数を数えて$numに代入
$num++; // 投稿番号を取得
2-2. ファイルに書き込む

すべての要素が揃ったところでファイルに書き込みを行います。
ファイルへの書き込みはfwrite関数を使います。
fwrite(' ファイルハンドル ', ' 書き込む内容 ')でファイルへの書き込みができます。
今回は1つの投稿ごとに (投稿番号)<>(名前)<>(コメント)<>(投稿された時間) という形で改行しつつ保存したいので以下のように書きました。(<>で区切る理由は次回説明します。)

// (投稿番号)<>(名前)<>(コメント)<>(投稿された時間) をファイルに書き込む
fwrite($fp, $num . '<>' . $name . '<>' . $comment . '<>' . $date . "\n");
4. ファイルを閉じる

ファイルに関する処理の記述が終わったらfclose関数を使ってファイルを閉じます。
fclose('ファイルハンドル')で指定したファイルを閉じることができます。

fclose($fp); // ファイルを閉じる
5. 処理が行われる条件をつける

最後に、これらの処理を名前とコメントが両方空でない場合にのみ実行するという条件をつけています。
htmlのフォーム作成時にそれぞれの欄にrequiredを指定しているので、多くのブラウザでは送信ボタンを押した時点で警告が出るようになっていますが、念のためPHPでも条件を指定しました。
このようにすることで、名前どコメントの両方、もしくはいずれかが空欄だった場合は書き込みが行われません。

empty関数は値が空であるかを調べるのに使うことができますが、以下ように0のみを入力した場合もからであると判定されてしまうため、より厳密に判定を行いたい場合はisset関数を使うと良いかもしれません。
emptyの使用例やissetとの違いについては以下のページを参考にしました。
isset関数とempty関数と「!」の違い

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.