ファイルの読み書きをする方法や手順を知っていますか?
人がマウスでクリックしてファイルを開くのと同じようにまずは書き込みたいファイルや読み込みたいファイルを開いて使えるような状態にしなければなりません。
ファイルの読み書きを行う場合には必ずfopen関数が必要になってきます。
この記事では、
- fopen関数とは
- ファイルを読み込む方法が知りたい
- ファイルに書き込む方法が知りたい
という基本的な内容から、
- 文字コードを指定して書き込む方法が知りたい
- 書き込みができない場合の対処法が知りたい
- 配列を書き込む方法が知りたい
といった応用的な内容に関しても分かりやすく解説していきます!
また、この記事で出てくる関数の早見表も最後にあるので、逆引きしたい方などはそちらから活用してみてくださいね。
fopen関数とは
fopen関数とは、ファイルまたはURLをオープンしてくれる関数です。
あるデータからファイルにデータの情報を読み込ませたり、ファイルの内容にデータ情報を書き込みする際など、ファイルを指定して、指定したファイルを開いて(持ってきて)くれます。
他のファイルの情報を新しいファイルに書き込む
データベースにある情報やその一部を取り出して内容を取得
などというときに、まずはfopen関数を使って書き込み用なのか、読み込み用なのか、または追記用なのかなどの目的に合わせてファイルを準備します。
fopenでファイルを開いた後、指定の条件を通して処理をし、fclose関数で開いたファイルを閉じる、というのが一連の流れとなります。
fopen基本構文:
$変数名(ファイルポインタ) = fopen (“開きたいファイル名”, “オープンモード”);
オープンモードとは、fopen関数でファイルを開く際に、どういう様式(モード)でファイルを開くかを指定します。
以下が主なオープンモードとなります。
書き込み専用でファイルをオープン
オープンモード | ファイルがない場合 | ファイルポインタ の位置 |
---|---|---|
"w" | エラーが出る | 先頭 |
"x" | 失敗(エラー)する | 先頭 |
"c" | 新規作成する | 先頭 |
"a" ※追記専用 | 新規作成する | 末尾 |
読み込み専用でファイルをオープン
オープンモード | ファイルがない場合 | ファイルポインタ の位置 |
---|---|---|
"r" | エラーが出る | 先頭 |
読み・書き用でファイルをオープン
オープンモード | ファイルがない場合 | ファイルポインタ の位置 |
---|---|---|
"w+" | 新規作成する | 先頭 |
"x+" | エラーが出る | 先頭 |
"c+" | 新規作成する | 先頭 |
"a+" | 新規作成する | 末尾 |
"r+" | エラーが出る | 先頭 |
ファイルポインタとは、どこからファイルに読み込みや書き込みをするかの始まりの位置となります。
既存する内容に追記したい場合は、ファイルポインタが終端にある“a”や“a+”を指定しないと、上書きされてしまうので注意が必要です。
ファイルに書き込む方法
ファイルを書き込むには、まずfopen関数でファイルを開きます。
次にfwrite関数で文字列を書き込みます。
以下、ファイルに書き込むサンプルです。
<?php // 書き込みモードでファイルを開く $fp = fopen("fwrite.txt", "w"); // ファイルに書き込む fwrite($fp, "write sample"); // ファイルを閉じる fclose($fp); ?>
fwrite.txtの実行結果
write sample
fopen("fwrite.txt", "w")で、ファイルfwrite.txtを書き込みモード(w)で開いています。
fwrite関数はファイルポインタに指定した文字列を書き込みます。
fwrite($fp, "write sample")では、fopen関数が返したファイルポインタをfwrite関数に渡し、文字列"fwrite sample"を書き込んでいます。
読み込みと同様、開いたファイルは最後にfclose関数を使用して閉じます。
追加で書き込む
追加で書き込むには、fopen関数のモードに"a"を指定します。
ファイルに追加で書き込むサンプルです。
<?php // 書き込みモード(追記)でファイルを開く $fp = fopen("fwrite.txt", "a"); // ファイルに書き込む fwrite($fp, "add sample"); // ファイルを閉じる fclose($fp); ?>
このプログラムが実行されるたびに、fwrite.txtの末尾に"add sample"が追記されていきます。
文字コードを指定して書き込む
PHPファイルと、読み込んだり書き込むファイルの文字コードが異なると、文字化けが起こります。
例えばPHPファイルの文字コードがUTF-8で、書き込むファイルの文字コードがShif-JISの場合、書き込まれた文字列は文字化けしてしまいます。
文字化けを解消するには、書き込む文字列と書き込むファイルの文字コードを統一します。
mb_convert_encoding関数は、指定した文字列を指定した文字コードに変換し、返します。
基本構文:
mb_convert_encoding(変換する文字列, 変換後の文字コード);
以下、文字コードを変換してファイルに書き込むサンプルです。
<?php // 書き込みモードでファイルを開く $fp = fopen("fwrite.txt", "a"); // Shift-JISに変換する $str = mb_convert_encoding("書き込みサンプル", "Shift-JIS"); // ファイルに書き込む fwrite($fp, $str); // ファイルを閉じる fclose($fp); ?>
mb_convert_encoding("書き込みサンプル", "Shift-JIS")で、"書き込みサンプル"の文字列がShift-JISに変換されます。
その変換された文字列をShift-JISのファイルに書き込めば、文字化けは起こりません。
配列をファイルに書き込む
fputcsv関数を使うと、配列の値をCSV形式(カンマ「,」で区切られたデータ形式)でファイルに書き込むことができます。
以下、ファイルに書き込むサンプルです。
<?php // 書き込む配列を生成する $array = ["data1", "data2", "data3"]; // 書き込みモードでファイルを開く $fp = fopen("fputcsv.csv", "w"); // CSV形式で書き込む fputcsv($fp, $array); // ファイルを閉じる fclose($fp); ?>
ファイルfputcsv.csvの内容結果
data1,data2,data3
fopen("fputcsv.csv", "w")で、ファイルfputcsv.csvを書き込みモード(w)で開いています。
fputcsv関数は、ファイルポインタに指定した配列をCSV形式で書き込みます。
fputcsv($fp, $array)では、fopen関数が返したファイルポインタをfputcsv関数に渡し、配列$arrayを書き込んでいます。
最後にfclose関数を使用して閉じます。
CSVデータを読み込むにはfgetcsv関数が使われます。
CSVファイルの読み込みについては、以下の記事で詳しく解説しています。
ファイルを読み込む方法
ファイルを読み込むには、まずfopen関数でファイルを開きます。
次にfgets関数でファイルの内容を1行ずつ取得して読み込みます。
以下、ファイルを読み込むサンプルです。
ファイル名:fgets.txt
fgets.txtファイルの内容
row1 row2 row3 row4 row5
<?php // 読み込みモードでファイルを開く $fp = fopen("fgets.txt", "r"); // ファイルを1行ずつ取得する while ($line = fgets($fp)) { echo "$line<br>"; } // ファイルを閉じる fclose($fp); ?>
実行結果
row1 row2 row3 row4 row5
fopen("fgets.txt", "r")で指定したファイルfgets.txtを、指定した読み込みモード(r)で開き、ファイルポインタを返します。
fgets関数はファイルポインタから1行ずつ読み込みます。
$line = fgets($fp)では、fopen関数が返したファイルポインタをfgets関数に渡し、1行ずつ読み込んでいます。
fgets関数は読み込むデータがなくなるとFALSEを返すので、それまで読み込みを繰り返すことで、ファイルの内容をすべて読み込むことができます。
開いたファイルは、最後にfclose関数を使用して閉じます。
指定した外部ファイルを読み込み実行する
外部ファイルを読み込み、外部ファイルに書いた処理を呼び出す事も可能です。
外部ファイルを読み込むにはinclude文やrequire文を使用します。
以下の例では、include文を使ってフォルダinclude1.phpからフォルダinclude2.phpを読み込みます。
include1.php
<?php echo "include1"; echo "<br>"; include "include2.php"; ?>
include2.php
<?php echo "include2"; ?>
include1.phpの実行結果
include1 include2
include1.phpのinclude “include2.php”;で include2.phpを読み込み、include2.phpの処理を実行しています。
include文については、以下の記事で詳しく解説しています。
require文については、以下の記事で詳しく解説しています。
ファイルの書き込みができない場合
ファイルの書き込みに失敗するには
- 書き込むファイルが存在しない
- fopen関数のモードに、書き込みモードを指定していない
- ファイルに書き込む権限がない
というような原因が考えられます。
ファイルに書き込む権限がない場合は、以下のようなエラーが表示されます。
Warning: fopen(fwrite.txt): failed to open stream: Permission denied in ...
このエラーを解消するには、パーミッション(アクセス権)を変更します。
PHPでパーミッションを変更するには、chmod関数を使用します。
基本構文:
chmod(変更するファイル名, 変更後のパーミッション)
パーミッションは通常「606」のように表しますが、前にゼロ(0)を付けて4桁で指定しないとエラーになります。
書き込み権限を追加するには、以下のように記述します。
<?php chmod("fwrite.txt", 0606); ?>
もしエラーが出てしまったら、1つ1つ確認してみてくださいね。
fopenに関連する関数早見表
この記事で紹介した関数の早見表です。
ぜひ活用してみてください。
ファイルの開閉(オープン・クローズ)
関数 | 用途 | 基本構文 |
---|---|---|
fopen | ファイルを 開く | $変数名(ファイルポインタ) = fopen (“開きたいファイル名”, “オープンモード”) |
fclose | ファイルを 閉める | fclose($ファイルポインタ) |
ファイルを読み込む
関数 | 用途 | 基本構文 |
---|---|---|
fgets | ファイルを 読み込む | fgets($ファイルポインタ) |
include | 外部ファイル を読み込む | include “読み込みたいファイル名” |
require | 外部ファイル を読み込む | require “読み込みたいファイル名” |
fgetcsv | CSVデータを 読み込む | fgetcsv($ファイルポインタ) |
ファイルに書き込む
関数 | 用途 | 基本構文 |
---|---|---|
fwrite | ファイルに 書き込む | fwrite($対象ファイル, "書き込む文字列またはその $変数") |
fputcsv | CSV形式で 書き込む | fputcsv($ファイルポインタ, $書き込む配列 [,”区 切り文字”]) |
その他
関数 | 用途 | 基本構文 |
---|---|---|
mb_convert _encoding | 文字コードを 指定して書き 込む | mb_convert_encoding(変換する文字列, 変換後の 文字コード); |
chmod | 書き込み権限 を追加する | chmod(“変更するファイル名”, 変更後のパーミッ ション) |
ファイル操作についての記事はいかにまとめてあります。
今後ファイルの操作について勉強したいという方は、ぜひ参考にしてくださいね。
まとめ
今回はfopen関数についてと、ファイルの読み込み、書き込み方法について解説しました。
データのファイル入出力やログ出力など、実際のシステム開発でもファイルを扱う処理は多いです。
ファイルの読み込み、書き込み方法を忘れてしまったら、この記事を思い出して下さい!