どこまで予期しない処理に対して丁寧に対処するか,というところではないでしょうか?私が書ける限り丁寧に書くとすれば
php
1<?php
2
3// Webブラウザに対し,出力データをHTMLとして解釈させず,ただのテキストとして扱わせる
4//
5// (場合によっては推奨)
6header('Content-Type: text/plain; charset=UTF-8');
7
8// 他の階層からrequireされてもパスが変化しないように,相対パスではなく,__DIR__を用いた絶対パスで書く
9//
10// (推奨)
11$filename = __DIR__ . '/file.txt';
12
13// ターミナルから実行した場合には $_SERVER['REQUEST_METHOD'] は未定義で
14// Notice: Undefined index: REUQEST_METHOD のエラーになるので,
15// どちらでも動作するように filter_input 関数で書く
16//
17// (ターミナルから実行することが絶対に無いと言える場合には不要
18// また,次に $_POST['content'] をチェックしており,正常に送信された場合は
19// ここがPOSTであることも確定するので,チェック自体が必ずしも必要ではない)
20if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') === 'POST') {
21
22 // データがPOSTで送信されずに直接アクセスされた場合には $_POST['content'] は未定義
23 // データのPOSTはされたが content[] というパラメータに改竄されていた場合は $_POST['content'] は配列
24 // という予期しない形になっているので,それらを filter_input 経由で安全に取得する
25 // 未定義の場合はエラーを出さずに null に変換してくれ,配列の場合は false にしてくれる
26 // 正常に受け取れた場合だけ文字列になる
27 //
28 // (推奨)
29 if (is_string($content = filter_input(INPUT_POST, 'content')) {
30
31 // パーミッションの問題などでエラーになる可能性を考慮する
32 // a だけだとWindowsで \n が \r\n に変換されてしまうため,それを阻止するために b もつける
33 // また, false !== を先頭に持ってくると $fp = に対して括弧をつける必要が無くなる
34 //
35 // (bフラグは推奨,他は任意)
36 if (false !== $fp = fopen($filename, 'ab')) {
37
38 // 同時アクセスでファイルが破損するのを防ぐために,ファイルに対して排他ロックをかける
39 //
40 // (LOCK_NBフラグをつけない限りはほぼ失敗しないのでfalseチェックは実際には不要
41 // ロック処理の実行自体は推奨)
42 if (false !== flock($fp, LOCK_EX)) {
43
44 // (ローカルファイルに対する編集ではほぼ失敗しないのでfalseチェックは実際には不要)
45 if (false !== fwrite($fp, $content)) {
46 echo '書き込み成功';
47 }
48
49 flock($fp, LOCK_UN);
50
51 }
52
53 fclose($fp);
54
55 }
56
57 }
58
59}
こうなりますね。説明をつけたかったのでわざとらしくifのネストで書きましたが,実際にこんな書き方をする必要は無く,またここまで丁寧にすべて書かなくてもいいです。そうですね,手頃なところだと
php
1<?php
2
3header('Content-Type: text/plain; charset=UTF-8');
4$filename = __DIR__ . '/file.txt';
5
6if ($_SERVER['REQUEST_METHOD'] === 'POST') {
7
8 $content = (string)filter_input(INPUT_POST, 'content');
9
10 $fp = fopen($filename, 'ab');
11 flock($fp, LOCK_EX);
12 fwrite($fp, $content);
13 echo '書き込み成功';
14 flock($fp, LOCK_UN);
15 fclose($fp);
16
17}
全然このぐらいでもいいと思いますよ。filter_input
の返り値ですが,false
もnull
も文字列にキャストすると""
になってくれるので,ちょうどいい感じかと思います。またアンロックやクローズ処理に関しては省略しても構いません。変数$fp
が消滅するときにPHPが勝手に後始末してくれます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/12 12:15