ファイルへのデータの書き込み

ファイルへデータを書き込むのに必要な関数は
fopen と fclose と fwrite
これを使ってファイルに書き込むには
$write_test = fopen("test.txt" , "w");
としてファイルを開き、
fwrite($write_test , "書き込みテスト" . "\n");
で書き込む。
fopenの引数"w"は平たく言えば元のデータを消してから書き込む事になる。
元のデータに追記する場合は"a"を使う。
fwriteは(開いたファイルの変数 , 書き込む内容);となっている。
ここでは内容に . (ピリオド)で"\n"(改行コード)を連結して書き込んでいるので注意。
最後の改行は別にカンマでもtabでも、もちろんなくてもいいのだが、
データを読み出す際に区切りが無いと意味不明になりがちなので普通は何か入れる。
CSVを想定しているならカンマを使う方がいいが、
個人的には改行がもっとも使いやすい。
これはデータファイルを後から見る時に見やすいから。
そして最後に行儀良く
fclose($write_test);
としてファイルを閉じる。
ここまでをまとめると

<?php
$write_test = fopen("test.txt" , "w");
fwrite($write_test , "書き込みテスト" . "\n");
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でもそんな理由でロック中を示すディレクトリを作ったりした気がする。
とりあえず今回はそれは置いといて
ここまでをまとめると

<?php
$write_test = fopen("test.txt" , "r+");
if(flock($write_test , LOCK_EX)){
fwrite($write_test , "書き込みテスト" . "\n");
}
fclose($write_test);
?>

ちなみに!
"w"や"a"モードでデータを書き込む時にファイルがないと、そのファイル名で自動で作られる。
どっちがいいかは知らないが、自分で作った空のデータファイルなどにPHPから何かを書き加えると、 各ファイルやページの文字コード如何では「化ける」事もあるので注意が必要。
テスト時にでも最低1度は自動で作る方が安全牌。 そして"r+"ではファイルが無かった場合エラーとなるのも注意が必要。

ここまでが理解できれば、PHPやPerlの基本スクリプトでもあるアクセスカウンターは容易に作れる。
めんどいからコピペしたい と言う方には
最もシンプルなアクセスカウンター
からどうぞ。
一応解説もしてます。

いくつものデータを処理する場合

上記の例では1つのデータを書き込んでいるが、
いくつものデータを書き込む場合の処理にも触れておく。

まず、読み出しについては
データの読み出し
のサンプルを使う。
これでターゲットとなるファイルから必要なデータを配列に格納する。
(ファイルが空であってもかまわない)

読み出しサンプルが理解出来ていればさして難しい事は無く、
読み出し部分を書き込みに変えるだけ。
つまり、
for($i=0; $i<$number; $i++){
fwrite($write_test,$read_test[$i]. "\n");
}
ってだけ。
先にまとめると、

<?php
//読み出し
$read_test = @file("test.txt");
$number = count($read_test);
for($i=0; $i<$number; $i++){
 $read_test[$i]=rtrim($read_test[$i]);
}

//ここでやりたい事を処理

//書き込み
$write_test = fopen("test.txt" , "r+");
if(flock($write_test , LOCK_EX)){
 for($i=0; $i<$number; $i++){
  fwrite($write_test,$read_test[$i]. "\n");
  print ($read_test[$i] . "<br>");
 }
}
fclose($write_test);
?>

上部分は読み出しサンプルそのまま。
下部分は行数を格納した変数$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
//読み出し
$read_test = @file("test.txt");
$number = count($read_test);
for($i=0; $i<$number; $i++){
 $read_test[$i]=rtrim($read_test[$i]);
}

//ここでやりたい事を処理

//書き込み
$write_test = fopen("test.txt" , "r+") or die("ファイル無かったし");
if(flock($write_test , LOCK_EX)){
 for($i=0; $i<$number; $i++){
  fwrite($write_test,$read_test[$i]. "\n");
  print ($read_test[$i] . "<br>");
 }
}
fclose($write_test);
?>

ここまでが理解できればあとは応用。 PHP使う肝ってファイル操作だと思うのだが、 この部分を懇切丁寧に解説してるとこってあんまりないですよね。 最も基本的な部分から書いたので比較的分かりやすいかな〜っと思いますがどうでしょうか。



サンプル

著作権について
ファイルからデータの読み込み
ファイルへのデータの書き込み
フォルダ内のファイル名取得
アクセスカウンターの作り方
アンケートの作り方
フォームからのデータの取得
フォーム以外のページからのデータの取得
ファイル内、文章内の文字列の検索
パスワード認証の方法と作り方

0から始めるPHP

PHPのすすめ(これ飛ばしてもいい)
必要な環境とPHPへのアクセス
開発に使うもの
初めての方への注意点
PHPの基本(何らかの言語経験者向け)
PHPの基本(初めての人向け)
書き方
ファイルの読み込み

プログラミング講座
文字などの出力
PHPにおける変数
ifによる条件比較
forによる繰り返し処理
PHPにおける配列
これまでとこれからの学び方

PHPの使える
おすすめレンタルサーバー

スタードメイン

レンタルサーバーの選び方


その他

プログラミングのコツ
プログラマーと年齢
誰でも簡単にできるサーバー負荷対策
社内や自宅サーバーのグローバルIPアドレスが変わってもアクセスできるようにする

日記

2014年
日本語形態素データとキーワード出現回数
Androidベースのゲーム機に期待
4月末に判明したIEの脆弱性について
フラッシュプレーヤーの製作
ホームページとウェブサイトの違い
WIFIなどの用語は正しく使いたい
国産ゲーム会社のサイトについて
検索エンジンの開発について
プレインストールWindowsからの脱却
Android・iPhoneとアプリ開発
Windows8、スタートボタンはもういらない?
サイトの作成とやるやらないは別
あの人は詳しいと言う人と言われる人
index.htmlと/の正規化について
AndroidOSとLinuxOS
モバイル端末で必ず見るもの
ユーザー参加型市民アプリ

2013年2月
2013年1月
2012年12月
2012年11月
2012年10月
2012年9月