ファイルの読み込み - PHPでファイルの読み書き・掲示板
目次
- PHPでファイルの読み書き・掲示板
- ファイルの読み込み
- ファイルの書き込み
- ファイルの読み書き(ゲストブック)
- 設定ファイルの読み書き
- CSVファイルの読み込み
- テキストエディタの作成
- アンケートシステムの作成
- 掲示板1(シンプル)
ファイルを読み込んで画面に一行出力する
プログラムの作成
まず、ファイルを読み込んでその内容を画面に出力するプログラムを作成します。以下のソースを入力してください。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>ファイルから読み込んで画面に表示</title>
</head>
<body>
<?php
// ファイルを読み込み専用でオープンする
$fp = fopen('read.txt', 'r');
// ファイルから一行読み込む
$line = fgets($fp);
// 読み込んだ行を出力する
print $line;
// ファイルをクローズする
fclose($fp);
?>
</body>
</html>
入力が終わったら「read1.php」というファイル名で保存し、サーバにアップして実行してみてください。読み込むテキストファイルの準備
上記のプログラムを実行すると、読み込むテキストファイルを用意していないので、エラーが出ると思います。メモ帳などで以下のテキストファイルを作ってください。
1行目です。
2行目です。
3行目です。
「read.txt」というファイル名で保存し、サーバの同じディレクトリにアップします。その後、read1.phpをもう一度実行してみてください。エラーが消え、以下の出力結果になれば正常です。
1行目です。
ソースの解説
PHPのソース部分は、<?phpと?>で囲まれた部分です。その他はHTMLがそのまま出力されます。
$fp = fopen('read.txt', 'r');
ファイルをオープンし、ファイルポインタに格納します。$fp がファイルポインタです。このファイルポインタを使って様々なファイルの操作をすることができます。一つ目の引数「read.txt」がオープンするファイル名です。二つ目の引数「r」というのは、ファイルを読み込み専用でオープンする、という意味です。このモードでオープンされたファイルにデータを書き込むことはできません。
$line = fgets($fp);
ファイルから一行読み込む関数です。ファイルポインタ$fpが指しているファイル(read.txt)から一行、つまり改行に達するまで読み込み、$lineに格納します。
print $line;
読み込んだ行を出力しています。読み込みと出力を合わせて、
print fgets($fp);
と書くこともできます。
fclose($fp);
ファイルをクローズします。オープンされたファイルは、処理が終わったら必ずクローズしなければいけません。画面に全行出力する
プログラムの作成
ファイルの全ての行を出力するようにプログラムを追加して行きます。read1.phpを開き、
<?php
・・・
?>
の部分を以下のように書き換えてください。
<?php
// ファイルを読み込み専用でオープンする
$fp = fopen('read.txt', 'r');
// 終端に達するまでループ
while (!feof($fp)) {
// ファイルから一行読み込む
$line = fgets($fp);
// 読み込んだ行を出力する
print $line;
// <br>の出力
print "<br>\n";
}
// ファイルをクローズする
fclose($fp);
?>
入力が終わったら「read2.php」というファイル名で保存し、サーバにアップして実行してください。ファイルの全行が出力されれば正常です。ソースの解説
while (!feof($fp)) {
feof関数は、ファイルポインタがファイルの終端に達していたらtrue、達していなければfalseになります。ここではファイルの終端に達していない間ループする、ということになります。
print "<br>\n";
一行出力するたびに普通の改行は入りますが、それだとHTMLでは改行されないので、<br>タグを付けて出力しています。ループの中の3行をまとめて
print fgets($fp) . "<br>\n";
と書いても構いません。readfile関数を使って出力する
実はPHPでは「ファイルを全て読み込んで出力する」という便利な関数があります。それがreadfileです。プログラムの作成
read1.phpを開き、
<?php
・・・
?>
の部分を以下のように書き換えてください。
<?php
readfile('read.txt');
?>
入力が終わったら「read3.php」というファイル名で保存し、サーバにアップして実行してください。以下のような出力結果になると思います。
1行目です。2行目です。3行目です。
ソースの解説
readfile関数は前述の通り、ファイルの内容を全て読み出し、そのまま出力する関数です。便利な反面、行毎に改行タグを入れられないなど、扱いにくい面もあります。file関数を使って出力する
次にreadfile関数よりも扱いやすい、file関数を使ってファイルの出力を行なってみましょう。プログラムの作成
read1.phpを開き、
<?php
・・・
?>
の部分を以下のように書き換えてください。
<?php
$lines = file('read.txt');
foreach ($lines as $l) {
print $l . "<br>\n";
}
?>
入力が終わったら「read4.php」というファイル名で保存し、サーバにアップして実行してください。ソースの解説
$lines = file('read.txt');
readfile関数はファイル内容を画面に出力する関数でしたが、file関数はファイル内容を一行ずつ配列に格納する関数です。今回の場合は、$lines[0] に「1行目です」、$lines[1] に「2行目です」、$lines[2] に「3行目です」という文字列が格納されます。
foreach ($lines as $l) {
$lines 配列の内容を $lines[0] から順番に $l に代入してループの処理を実行します。配列の最後まで達したらループを抜けます。
print $l . "<br>\n";
配列の内容に改行タグを付けて出力しています。file関数の使い道
file関数はとても使い勝手の良い関数です。わざわざファイルをオープンしたりクローズしたり一行ずつ読んだりする手間が省けるのでコーディングの短縮に繋がります。file_get_contents関数を使って出力する
今回のような単純なケースでは、file_get_contents関数を使う方法もあります。プログラムの作成
read1.phpを開き、
<?php
・・・
?>
の部分を以下のように書き換えてください。
<?php
$contents = file_get_contents('read.txt');
$contents = str_replace("\n", "<br>\n", $contents);
print $contents;
?>
入力が終わったら「read5.php」というファイル名で保存し、サーバにアップして実行してください。ソースの解説
$contents = file_get_contents('read.txt');
file_get_contents関数はファイル内容を全てひとつの変数に格納する関数です。今回の場合は、変数 $contents に全ての行が格納されます。
$contents = str_replace("\n", "<br>\n", $contents);
$contents をそのまま出力したのでは改行が入らないので、改行を改行タグに変換しています。str_replace関数によって、$contents 内の全ての「\n」が「<br>\n」に変換されます。readfileとは違い、一度変数に代入されてから画面に出力されるので、途中で改行を変換するタイミングがあるわけです。
どの関数を使うべきか?
ファイルの読み込みに関していくつかの方法がありましたが、どの方法を使うのがベストなのでしょうか?以下にメリットとデメリットをまとめました。fopen・fgets・fclose | readfile | file | file_get_contents | |
---|---|---|---|---|
メリット | 読み込みの基本、どんな細かな処理でもできる。他の言語でもほぼ同じように使える | 最も簡単 | 非常に扱いやすい | それなりに扱いやすい |
デメリット | 必ずopenとcloseをしなければならないので面倒。自分でループを作って読み込みをしてやらなければならない | 途中の加工が全くできないので扱いにくい | 特になし | 行単位で加工したいときなどは少し面倒 |