プログラミングTips
2011/09/05
fopen、fclose、fgets、fwrite、die以外のファイル入出力関連関数の中で、よく使う関数には以下のようなものがあります。
☆ file関数
***********************************************************
$line = file(“./test.dat”);
***********************************************************
上記のように記述することで、ファイルの内容を一行毎に配列として$lineに格納します。
また、以下のようにすることにより、Webページのデータも取得する事ができます。
***********************************************************
$line = file(“http://www.example.com/”);
***********************************************************
☆ fread関数
***********************************************************
if($filehandle = @fopen(“./test.dat”, ‘r’)){
$buffer = fread($filehandle,1024);
fclose($filehandle);
}
***********************************************************
freadではバイナリモードでファイルを読み込みます。第一引数がファイルハンドル、第二引数で読み込むサイズを指定します。つまり上記の例では、『test.dat』から1024バイトを読み込み$bufferに格納します。バイナリモードなので、もちろん改行コードなどは関係無く、一つの文字列として読み込む事になります。
上記の例の中の『1024』という部分に、『filesize(“./test.dat”)』という記述を加えることで、ファイルの内容全てを読み込みます。filesize関数は後述致します。
☆ filesize関数
***********************************************************
$size = filesize(“./test.dat”);
***********************************************************
上記のように記述することで、ファイルサイズをバイト単位で取得し、$sizeに格納します。
非常に単純な機能ですが、ファイルのチェックなどによく使用します。
☆ file_exists関数
***********************************************************
$bool = file_exists(“./test.dat”);
***********************************************************
上記例では、ファイルが存在すればTrue、存在しなければFalseを取得し、$boolに格納します。
filesize関数と共にファイルチェックなどによく使用しますが、こちらの関数はサイズが0でも存在さえすればTrueを返します。そのため、この関数を使用することで『ファイルが存在する→ファイルサイズ0のファイルを読み込もうとする→エラー』みたいな流れになってしまう事が稀にあるので、注意が必要です。
・・・と書いていますが、ファイル入出力関数は非常に多く、一度では書ききれないので、少しずつ記述していきます。気長にお待ち下さい。(勝手ですみません。)
※ちなみにこの記事は過去に別ブログで掲載していたものを若干加筆修正したものです。
プログラミングTips
2011/09/02
前回fopen、fclose、fgets、fwrite、dieという5つの関数を使用して、簡単なファイルの入出力についてをまとめましたが、この中でエラー処理に使用するdie関数について、注意しなければならないことがあります。
それはdie関数を実行した時点でエラーメッセージを表示しプログラム処理が終わってしまうという事です。これにより、無限ループになったりする事が無く、またエラーメッセージが表示されるのでデバッグがし易くなりますが、実際のサイト運用の際にはほとんどの場合不適切であると思われます。
そこで使用するのがエラー制御演算子『@』です。これをfopen関数の直前に記述します。以下はその例になります。
***********************************************************
if($filehandle = @fopen(“./test.dat”, ‘r’)){
while(!feof($filehandle)){
$buffer[] = fgets($filehandle);
}
fclose($filehandle);
}
***********************************************************
fopen関数の前に記述する事で、エラーを表示しなくなり、このif文を抜けて次の処理に入ります。また上記のスクリプト中ではfgets関数の部分でもエラーが発生してしまう事が多いので、そこにも記述するとよいと思います。
エラーが出るところで毎回これを付けていると結構な量になるんで、実際には一括して表示をしないようにするコマンド(?)を使う事の方が多いかもしれません。(これに関してはいずれ。) ですが、まずはこのエラー制御演算子『@』を覚えておくととても便利です。
■気を付けたい事
これを付ける事によって、実際の運用上は問題が無くなるかもしれませんが、付けた関数に関わるあらゆるエラーを回避してしまうので、内部的にはエラーが発生しているのに、それに気付かない可能性があります。そのため、充分なデバッグを施してからにすべきであると思われます。
また、逆にエラーが表示されることに関してはセキュリティ上問題があると思われます。このようなPHPプログラミングにおいてのセキュリティに関しては下記書籍がオススメです。
※ちなみにこの記事は過去に別ブログで掲載していたものを若干加筆修正したものです。
プログラミングTips
2011/09/01
PHPでWebページを製作する時に必ずと言っていいほどよく使うファイル入出力についてです。
■ファイルからのデータ読み取り(入力)
一番簡単なのは以下のようなソースになります。
***********************************************************
$filehandle = fopen(“./test.dat”, ‘r’);
while(!feof($filehandle)){
$buffer[] = fgets($filehandle);
}
fclose($filehandle);
***********************************************************
これを実行すると、fopen関数の第一引数で指定したファイル(ここでは『test.dat』)のデータが$bufferという配列変数に格納されます。
ただ、このままだといくつかの問題が発生してしまう可能性があります。
★可能性1:指定したファイルが存在しない場合にエラーが出る。
★可能性2:ファイルは存在するが、何らかの影響でファイルの内容を読み取ることが出来なかった時にエラーが出る。
他にも可能性として考えられるものはありますが、多いのは上記2点だと思われます。これが発生してしまうとwhile関数の部分で無限ループに陥ります。
この問題を解決するには以下のように1行目を変更します。
***********************************************************
if(!($filehandle = fopen(“./test.dat”, ‘r’))){ die; }
while(!feof($filehandle)){
$buffer[] = fgets($filehandle);
}
fclose($filehandle);
***********************************************************
fopen関数が失敗した場合にdie関数でプログラムを終了します。これにより無限ループに陥る事は無くなります。
またこのdie関数は以下のように第一引数に文字列を指定する事により、思い通りのエラーメッセージを表示する事もできます。
***********************************************************
die(“ファイルが存在しないか、ファイルを開く事ができませんでした。”);
***********************************************************
■ファイルへのデータ書き込み(出力)
一番簡単なのは以下のようなソースになります。
***********************************************************
$filehandle = fopen(“./test.dat”, ‘w’);
fwrite($filehandle, “test”);
fclose($filehandle);
***********************************************************
これにより、fopen関数の第一引数で指定したファイル(ここでは『test.dat』)に『test』という文字列が書き込まれます。
こちらの場合も、データ読み込みの場合と同様にエラーが起こる可能性があります。(書き込む内容にもよりますが、こちらの場合は無限ループが起きる可能性は低いと思われます。)
なので、やはり1行目を変更します。
***********************************************************
if(!($filehandle = fopen(“./test.dat”, ‘w’))){ die; }
fwrite($filehandle, “test”);
fclose($filehandle);
***********************************************************
■今回のまとめ
ファイル入出力においては、
基本的にまずfopen関数を使用することになります。
その後、データ読み取りの場合でfget関数、データ書き込みではfwrite関数を使います
そして最後にfclose関数で終了する、という手順になります。
この他にも、いくつか使える関数がありますが、それはまた後日。
※ちなみにこの記事は過去に別ブログで掲載していたものを若干加筆修正したものです。