ゼロから始めるPHP講座Vol17 ファイル操作の基礎


ゼロから始めるPHP講座Vol17 ファイル操作の基礎
目次
  1. ゼロから始めるPHP講座ファイル操作の基礎
  2. ファイル操作
  3. ファイルの読み書きの基本的な流れ
  4. ファイルを開く
  5. ファイル読み込み
  6. ファイル書き込み
  7. ファイルを閉じる

ゼロから始めるPHP講座ファイル操作の基礎

ファイル操作

ファイル操作の基本として、読み込み・書き込みがあり、データの保存や利用において重要な操作となります。

まずはお手本にある通り、使ったプログラムを書いてみましょう。またプログラム実行前に空のfile_write.txtを作成してください。


<?php

$filename = './file_write.txt';

if ($_SERVER['REQUEST_METHOD'] === 'POST'){

    $comment = $_POST['comment'];

    if (($fp = fopen($filename, 'a')) !== FALSE) {
        if (fwrite($fp, $comment) === FALSE) {
            print 'ファイル書き込み失敗:  ' . $filename;
        }
        fclose($fp);
    }
}

$data = array();

if (is_readable($filename) === TRUE) {
    if (($fp = fopen($filename, 'r')) !== FALSE) {
        while (($tmp = fgets($fp)) !== FALSE) {
            $data[] = htmlspecialchars($tmp, ENT_QUOTES, 'UTF-8');
        }
        fclose($fp);
    }
} else {
    $data[] = 'ファイルがありません';
}

?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ファイル操作</title>
</head>
<body>
    <h1>ファイル操作</h1>

    <form method="post">
        <input type="text" name="comment">
        <input type="submit" name="submit" value="送信">
    </form>

    <p>以下に<?php print $filename; ?>の中身を表示</p>
<?php foreach ($data as $read) { ?>
    <p><?php print $read; ?></p>
<?php } ?>
</body>
</html>

php-files1-639

file.phpではfile_write.txtというファイルに対して

  • ファイルの作成- テキストボックスに入力した内容の書き込み- ファイルの読み込み

という処理を行っております。

同じファイルの読み込みや書き込みという処理でも、用途により様々な関数がPHPでは用意されていますが、本章ではよく利用する関数及び処理について紹介します。

ファイルの読み書きの基本的な流れ

基本的な流れは次のようになります。

  • ファイルを開く(fopen)- ファイルから読み込み(fgets)or書き込み(fwrite)- ファイルを閉じる(fclose)

ファイル操作を行うときは上記のように「ファイルを開き」、終了するときは必ず「ファイルを閉じる」必要があります。

ファイルを開く

ファイルを開くにはfopen関数を使います。

php-files2-639

fopenはファイルを開き、対象ファイルを示すファイルハンドルを返します。

ファイルハンドルとはファイルを特定するためのIDのようなものファイルを特定するためのIDのようなものファイルを特定するためのIDのようなもの

fopenでは「どのような状態でファイルを開くのか」ということを、次のようなモードで指定します。

fopenモード

※「r+」「w+」「a+」とすると、読み込みと書き込みの両方ができる

ファイルポインタとは、ファイルの中で今どこが対象になっているかという「ファイル内の位置」を示すものファイルの中で今どこが対象になっているかという「ファイル内の位置」を示すものファイルの中で今どこが対象になっているかという「ファイル内の位置」を示すもの

例えばテキストエディタでキーボードから文字を入力した際、文字が表示される箇所がファイルポインタの位置で、大抵は点滅してファイルポインタの位置を表示しています。

また「w」「a」はファイルが存在しない場合はファイルを新規作成してくれますが、これができるかは「パーミッション」というアクセス権限が絡んできます。

パーミッションには「読み込み」「書き込み」「実行」といった種類の権限があり、ファイル操作はこの設定により行えない場合もあります。

パーミッションの詳細については割愛します。

ファイル読み込み

ファイル読み込みにはfgets関数を使います。

php-files3-639

読み込みは1行だけ行うため、複数行読み込む場合は、while文などと組み合わせ、読み込む行がなくなりFALSEとなるまで繰り返し処理を行うのが一般的です。

file.phpでは次のように読み込みを行っています。

php-files4-639

fopen関数によりファイルを開いています。読み込みだけを行うのでモードは「r」と指定してます。

は最初、オープンしたファイルから1行を読み込みます。このとき対象となる行はファイルポインタの位置により決まり、「r」でファイルを開いたのでファイルポインタは先頭にあり、まずはファイルの1行目から読み込みます。fgets関数

正常に読み込むと、その読み込んだ文字列を$tmpに代入し、ファイルポインタを次の行に進めます。

最後の行を読み込んだら読み込む行がないのでFALSEとなり、whileの繰り返しを終了します。

while文の流れをまとめると、次のようになります。

php-files5-639

なおファイル読み込みから少し離れた話になりますが、file.phpでは配列$dataに読み込んだ文字列を格納し、これをforeach文で表示しています。

これはPHPとHTMLをできるだけ明確に分けたほうが、見やすさなど利便性が高まるためです。

[]

php-files6-639

例として、file_write.txtの中身が3行だった場合、file.phpではコメント(//で追記した行)に書かれた処理を行っています。

php-files7-639

例では3回ですが、実際に配列$dataへの追加処理が何回行われるかは、file_write.txtに書き込まれた行数によって変動します。

このように配列に不特定多数の値を追加していく場合、$data[]とキーを指定しないことでキーを自動で割り振る書き方は便利でよく使われます。

配列はファイル操作に限らず今後頻繁に利用しますので、いまいち配列処理の流れや仕組みが分からない人は、var_dump()により作成した配列の中身を表示するなどして、配列処理の内容をしっかりと理解しておきましょう。

ファイル書き込み

ファイル書き込みにはfwrite関数を使います。

php-files8-639

ファイルハンドル(対象ファイル)を指定することで、ファイルポインタのある位置から書き込を行います。

file.phpでは次のように書き込みを行っています。

php-files9-639

fopen関数によりファイルを開いています。書き込みだけを行うのでモードは「a」と指定してます。

はファイルポインタの位置から書き込みを行い、「a」でファイルを開いたのでファイルポインタは末尾にあり、ファイルの末尾に$commentの値を追記しています。fwrite関数

正常に書き込むと、ファイルポインタを書き込んだ値の末尾に進めます。

同じ書き込みでもモードを「w」とすると、ファイル内容を削除してから開くため、追記ではなく新規書き込みになります。実際にfile.phpにて、モードを「a」から「w」に変更し試してみましょう。


if ($_SERVER['REQUEST_METHOD'] === 'POST'){

    $comment = $_POST['comment'];

    if (($fp = fopen($filename, 'a')) !== FALSE) {
        if (fwrite($fp, $comment) === FALSE) {
            print 'ファイル書き込み失敗:  ' . $filename;
        }
        fclose($fp);
    }
}

ファイルを閉じる

ファイルを閉じるにはfclose関数を使います。

php-files10-639

ファイルを開いている時間は可能な限り短いほうが良いため、読み込みや書き込みなどの必要な処理が終わったらすぐに閉じます。

NEXTLESSONファイル操作の使用例と演習ファイル操作の使用例と演習

PREVLESSONforeach文とはforeach文とは


CodeCampus編集部
この記事を書いた人
CodeCampus編集部
まずは7日間お試し!人気プログラミング講座を無料公開中
オンライン・プログラミングレッスンNo.1のCodeCamp