fopenとfcloseとfwriteを使ったデータの書き込み:ぺたっとPHPサンプルソースコード |
ファイルへデータを書き込むのに必要な関数は
fopen と fclose と fwrite
これを使ってファイルに書き込むには
$write_test = fopen("test.txt" , "w");
としてファイルを開き、
fwrite($write_test , "書き込みテスト" . "\n");
で書き込む。
fopenの引数"w"は平たく言えば元のデータを消してから書き込む事になる。
元のデータに追記する場合は"a"を使う。
fwriteは(開いたファイルの変数 , 書き込む内容);となっている。
ここでは内容に . (ピリオド)で"\n"(改行コード)を連結して書き込んでいるので注意。
最後の改行は別にカンマでもtabでも、もちろんなくてもいいのだが、
データを読み出す際に区切りが無いと意味不明になりがちなので普通は何か入れる。
CSVを想定しているならカンマを使う方がいいが、
個人的には改行がもっとも使いやすい。
これはデータファイルを後から見る時に見やすいから。
そして最後に行儀良く
fclose($write_test);
としてファイルを閉じる。
ここまでをまとめると
|
|
これが最もシンプルな書き込み。
上のソースをコピペしてtest.phpとして実行すると、test.txtが作られて中には"書き込みテスト"と書かれているのを確認してほしい。
書き込みオプションの"w"はファイルが無い場合は自動で作ってくれて全部上書きする感じのモード。
書き込みをする場合、普通はファイルロックをしてから書き込む。
これは不特定多数の人が同時に書き込みをしようとした場合、
ロックしていないとファイルが壊れるから。
「別にそんなにアクセスないし、いらなさそうだからいいや〜」と言うのはない。
何故なら例えば送信ボタンを押すことで送られてきたデータを書き込むような良くあるパターンでは、
送信ボタンをなぜかダブルクリックする人がいるからだ。
そして意外にもたったこれだけでファイルが壊れる。
と言う事でファイルへの書き込みにはロックするのは必須と覚えておいた方が良い。
で、ロックするのに使う関数は
flock
これを使って
flock($write_test , LOCK_EX);
などのようにする。
普通は条件制御して
if(flock($write_test , LOCK_EX){
などとする。
書き込み処理
}
で、fwirteで書き込むわけだが、どうもflockする時に"w"モードで開いているとロックの意味がないらしく、
"r+"や"a"などを使うほうがいいらしい。
そういえばPerlでもそんな理由でロック中を示すディレクトリを作ったりした気がする。
とりあえず今回はそれは置いといて
ここまでをまとめると
|
|
ちなみに!
"w"や"a"モードでデータを書き込む時にファイルがないと、そのファイル名で自動で作られる。
どっちがいいかは知らないが、自分で作った空のデータファイルなどにPHPから何かを書き加えると、
各ファイルやページの文字コード如何では「化ける」事もあるので注意が必要。
テスト時にでも最低1度は自動で作る方が安全牌。
そして"r+"ではファイルが無かった場合エラーとなるのも注意が必要。
ここまでが理解できれば、PHPやPerlの基本スクリプトでもあるアクセスカウンターは容易に作れる。
めんどいからコピペしたい と言う方には
最もシンプルなアクセスカウンター
からどうぞ。
一応解説もしてます。
上記の例では1つのデータを書き込んでいるが、
いくつものデータを書き込む場合の処理にも触れておく。
まず、読み出しについては
データの読み出し
のサンプルを使う。
これでターゲットとなるファイルから必要なデータを配列に格納する。
(ファイルが空であってもかまわない)
読み出しサンプルが理解出来ていればさして難しい事は無く、
読み出し部分を書き込みに変えるだけ。
つまり、
for($i=0; $i<$number; $i++){
ってだけ。
fwrite($write_test,$read_test[$i]. "\n");
}
先にまとめると、
|
//ここでやりたい事を処理
//書き込み |
上部分は読み出しサンプルそのまま。
下部分は行数を格納した変数$number分の回数、$read_testの配列に入っているデータを順番に繰り返し書き込んでいる。
確認のためprintで1行ずつ書き出している。
"r+"について詳しく説明すると、
ファイルを読み書き可能で開き、ファイルポインタを先頭に置く
というもの。
分かりやすく言えばカーソルが先頭に来るみたいなもの。
上のサンプルでは読み出したデータと書き込むデータの数(配列の数)が同じなので、
"r+"で書き込んでもファイルの内容は全く同じになる。
読み出して書き込んでいるだけなのでそりゃそうですな。
ちなみに上のサンプルをそのままPHPファイルとして実行した場合、test.txtが無いとエラーとなる。
先に作っといたら大丈夫、という話ではなくそう言う場合でも処理が終了する方が理想的。
つまり、ファイルが無かった場合は処理しないように
if($write_test = fopen("test.txt" , "r+")){
というようにでもすれば良い。あれば処理されるし無かったらそのまま終わる。
}
で、この処理を簡潔に書くと
$write_test = fopen("test.txt" , "r+") or die("ファイル無かったし");
まとめると
|
//ここでやりたい事を処理
//書き込み |
ここまでが理解できればあとは応用。 PHP使う肝ってファイル操作だと思うのだが、 この部分を懇切丁寧に解説してるとこってあんまりないですよね。 最も基本的な部分から書いたので比較的分かりやすいかな〜っと思いますがどうでしょうか。
当サイト「ぺたっとPHPサンプルソースコード」は、初めてPHPを触る初心者でもすぐにPHPプログラミングができる・分かるサイトです。
PHPのサンプル
0から始めるPHP
日記