質問するログイン新規登録

回答編集履歴

3

加筆修正

2018/10/31 08:21

投稿

退会済みユーザー
answer CHANGED
@@ -40,4 +40,29 @@
40
40
  ```
41
41
  ってことでもいいのかな、たぶん。
42
42
  「<br/>」という文字列はあくまでhtmlコード上で改行を意図するタグであって、
43
- file()でのデータ区切りには意味を成さないです。
43
+ file()でのデータ区切りには意味を成さないです。
44
+
45
+ そういえば、これ簡易掲示板だったよね。
46
+ file()やfile_get_contents()やfile_get_contents()って
47
+ 一行書くだけで読み込みや書き込みができて便利なんだけど、
48
+ 簡易掲示板は複数箇所から同時にアクセスされることを想定しないといけないよ。
49
+ 同じタイミングで投稿データを受け付けた場合、
50
+ 追記するだけとはいえファイルが無事に書き込み成功する保証はない。
51
+ だから、自分の処理中に他者が書き込まないよう、
52
+ ファイルを排他ロックしておく必要があるね。
53
+
54
+ そこで登場するのが
55
+ [PHP: flock - Manual](http://jp2.php.net/manual/ja/function.flock.php)
56
+ って関数なんだけど、ファイル名を受け取るわけじゃなく、
57
+ fopen()したときのファイルハンドルを与える必要がある。
58
+ そうするとfile()でラクに読み込む方法が使えなくなる。
59
+
60
+ fopen()でファイルを開いてファイルハンドルを取得し、
61
+ fgets()でファイルから一行データを読み出すのを繰り返して、
62
+ fclose()で読み込み終了すると。
63
+
64
+ 書き込みは、
65
+ fopen()でファイルを開いてファイルハンドルを取得し、
66
+ flock()で排他ロックをかけて、
67
+ fwrite()でファイルに書き出して、
68
+ fclose()で書き込み終了すると。

2

加筆修正

2018/10/31 08:21

投稿

退会済みユーザー
answer CHANGED
@@ -22,10 +22,15 @@
22
22
  file()のドキュメントを読んでほしいのですが、
23
23
  FILE_IGNORE_NEW_LINESフラグを指定することで、
24
24
  読み出した一つ一つの行データの末尾に改行コードがつかないように回避できます。
25
+ 改行コードがついたままでも、
26
+ htmlとして文字列を出力するときテキストとしての改行コードは無視されるので、
27
+ 見た目上の影響はないかもしれませんが、
28
+ その点は「要求仕様をどう解釈して、仕様を満足させるコードをどう書くか」という矜持次第かと。
25
29
 
26
- まり
30
+ づけて
31
+ file()での読み込みは
27
32
  一行一行のデータの区切りとして改行コードをアテにしているので、
28
- ファイルに追記するときは一行データの最後に改行コードが必要になる前提です。
33
+ ファイルに追記するときは**一行データの最後に(テキストとしての)改行コードが必要になる**前提です。
29
34
 
30
35
  試しに
31
36
  [PHP: file_put_contents - Manual](http://jp2.php.net/manual/ja/function.file-put-contents.php)
@@ -33,4 +38,6 @@
33
38
  ```php
34
39
  file_put_contents($filename, $number."<>".$_POST['name']."<>".$_POST['coment']."<>".date("Y年m月d日 H:i:s")."\n", FILE_APPEND);
35
40
  ```
36
- ってことでもいいのかな、たぶん。
41
+ ってことでもいいのかな、たぶん。
42
+ 「<br/>」という文字列はあくまでhtmlコード上で改行を意図するタグであって、
43
+ file()でのデータ区切りには意味を成さないです。

1

加筆修正

2018/10/31 07:54

投稿

退会済みユーザー
answer CHANGED
@@ -7,4 +7,30 @@
7
7
  ってことなんだと思います。
8
8
  そのため、ファイルの存在を先にチェックしてから読み込むようにするのが最初かと。
9
9
  [PHP: file_exists - Manual](http://jp2.php.net/manual/ja/function.file-exists.php)
10
- でチェックできますよ。
10
+ でチェックできますよ。
11
+
12
+ ```php
13
+ $line = array();
14
+ if (file_exists($filename)) {
15
+ $line = file($filename, FILE_IGNORE_NEW_LINES);
16
+ }
17
+ ```
18
+ こんなふうにしておくことで、
19
+ ファイルが有ればファイルから読み取って$line配列を作ってくれるし、
20
+ ない場合は先に初期化したカラのままの$line配列を使えばいい。
21
+
22
+ file()のドキュメントを読んでほしいのですが、
23
+ FILE_IGNORE_NEW_LINESフラグを指定することで、
24
+ 読み出した一つ一つの行データの末尾に改行コードがつかないように回避できます。
25
+
26
+ つまり、
27
+ 一行一行のデータの区切りとして改行コードをアテにしているので、
28
+ ファイルに追記するときは一行データの最後に改行コードが必要になる前提です。
29
+
30
+ 試しに
31
+ [PHP: file_put_contents - Manual](http://jp2.php.net/manual/ja/function.file-put-contents.php)
32
+ 使ってみますか、
33
+ ```php
34
+ file_put_contents($filename, $number."<>".$_POST['name']."<>".$_POST['coment']."<>".date("Y年m月d日 H:i:s")."\n", FILE_APPEND);
35
+ ```
36
+ ってことでもいいのかな、たぶん。