投稿した内容をファイルに格納

広告

では今度は投稿された内容をファイルに格納していきます。

投稿された内容を保存するファイル名を「keijiban.txt」として、フォームから投稿があった時にファイルに追加で格納していくためモード「ab」でファイルを開きます。(バイナリモードで開いています)。

$keijban_file = 'keijiban.txt';

$fp = fopen($keijban_file, 'ab');

fclose($fp);

次にフォームから送られたきた内容をファイルに書き込みます。前のページでフォームから送られてきた内容を画面に表示させるには下記のように行っていました。

$personal_name = $_POST['personal_name'];
$contents = $_POST['contents'];
$contents = nl2br($contents);

$data = '<p>投稿者:'.$personal_name.'</p>';
$data = $data.'<p>内容:</p>';
$data = $data.'<p>'.$contents.'</p>';

実際にファイルに書き込む時には、書き込む内容を1つのString型の変数にまとめておきます。またファイルに書き込まれた時に見やすいように各行毎に改行を追加して記述しておきます(改行には「\r\n」を使いますが、このエスケープ文字を有効にするためにはシングルクォーテーションで文字列を囲むのではなく、ダブルクォーテーションで囲んでおく必要があります。ついでに投稿ごとに区別が付くように<hr>も先頭に書いておきます。

$personal_name = $_POST['personal_name'];
$contents = $_POST['contents'];
$contents = nl2br($contents);

$data = "<hr>\r\n";
$data = $data."<p>投稿者:".$personal_name."</p>\r\n";
$data = $data."<p>内容:</p>\r\n";
$data = $data."<p>".$contents."</p>\r\n";

上記で作成した文字列をファイルに書き込みます。

$personal_name = $_POST['personal_name'];
$contents = $_POST['contents'];
$contents = nl2br($contents);

$data = "<hr>\r\n";
$data = $data."<p>投稿者:".$personal_name."</p>\r\n";
$data = $data."<p>内容:</p>\r\n";
$data = $data."<p>".$contents."</p>\r\n";

$keijban_file = 'keijiban.txt';

$fp = fopen($keijban_file, 'ab');

if ($fp){
    if (flock($fp, LOCK_EX)){
        if (fwrite($fp,  $data) === FALSE){
            print('ファイル書き込みに失敗しました');
        }

        flock($fp, LOCK_UN);
    }else{
        print('ファイルロックに失敗しました');
    }
}

fclose($fp);

では試しに行ってみましょう。

keijiban3.php

<html>
<head><title>PHP TEST</title></head>
<body>

<p>掲示板</p>

<form method="POST" action="<?php print($_SERVER['PHP_SELF']) ?>">
<input type="text" name="personal_name"><br><br>
<textarea name="contents" rows="8" cols="40">
</textarea><br><br>
<input type="submit" name="btn1" value="投稿する">
</form>

<?php

$personal_name = $_POST['personal_name'];
$contents = $_POST['contents'];
$contents = nl2br($contents);

$data = "<hr>\r\n";
$data = $data."<p>投稿者:".$personal_name."</p>\r\n";
$data = $data."<p>内容:</p>\r\n";
$data = $data."<p>".$contents."</p>\r\n";

$keijban_file = 'keijiban.txt';

$fp = fopen($keijban_file, 'ab');

if ($fp){
    if (flock($fp, LOCK_EX)){
        if (fwrite($fp,  $data) === FALSE){
            print('ファイル書き込みに失敗しました');
        }

        flock($fp, LOCK_UN);
    }else{
        print('ファイルロックに失敗しました');
    }
}

fclose($fp);

?>
</body>
</html>

では実際にWWWサーバに設置して試してみます。

掲示板

この時、「keijiban.txt」には下記のように書き込まれています。(もし「keijiban.txt」が存在していなければ、自動的にファイルが作成されて下記のように書き込まれます)。

掲示板

※何も投稿していなくてもファイルには書き込まれてしまっています。これは同じHTMLファイルを使っているためで、フォームからの投稿後の表示ではなく初回表示の際にもファイルへの書き込み処理が行われてしまっているためです。この部分は次のページで修正します。

何か適当に入力してから「投稿」ボタンをクリックして下さい。

掲示板

掲示板

画面には表示されていませんが「keijiban.txt」には下記のように書き込まれています。

掲示板

これでファイルへの書き込みは行えることが出来ました。次のページでは初回表示の場合だけ、ファイルには何も書き込まないようにしてみます。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。