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

回答編集履歴

4

加筆修正

2019/09/04 07:59

投稿

退会済みユーザー
answer CHANGED
@@ -34,8 +34,13 @@
34
34
 
35
35
  削除処理foreachループにて、
36
36
  投稿番号が指定の番号と違ったらファイルに書き出す、のもいいですが、
37
+ 元のデータファイルを残したまま「追記モード」で書き出すと、
38
+ それだけでデータのダブリを生みますね。
39
+ 読みだした直後にファイルを削除するのが妥当でしょう。
40
+ あるいは、
37
41
  例えば書き出すのを後回しにして、書き出し用配列を用意して、
38
- 書き出す配列をもとに改行コードで連結してから書き出す、という技もでそうで
42
+ 書き出す配列をもとに改行コードで連結してから書きで
43
+ という技でもできそうです。
39
44
 
40
45
  ---
41
46
 
@@ -48,4 +53,8 @@
48
53
  flock()にて排他ロックを行い、
49
54
  ロック中は待ち合わせするような工夫も必要です。
50
55
  簡易掲示板だからそこまで求めないと考えるのか、
51
- 簡易掲示板だけどしっかり作り込むかは考え方次第です。
56
+ 簡易掲示板だけどしっかり作り込むかは考え方次第です。
57
+ Aさんが削除のアクションを、Bさんが投稿のアクションを同じタイミングで起こしたとき、
58
+ 削除処理でファイルを削除したところで投稿の処理が走ると、
59
+ データが消えるか、投稿が無視されるか、
60
+ 毎度実行しても結果がバラバラな動作になりかねません。

3

加筆修正

2019/09/04 07:59

投稿

退会済みユーザー
answer CHANGED
@@ -16,10 +16,10 @@
16
16
  例えば5番まで使っている時に3番を削除したら、
17
17
  本来1,2,4,5の行がある状態になりますよね。
18
18
  でもこのとき$countは行数4に対して1を加えて5にしてしまうと、
19
- 投稿番号がダブることになります。
19
+ 投稿番号5番がダブることになります。
20
20
  なので、投稿データの順序が入れ替わることがないのであれば、
21
21
  必ず最後の行の投稿番号が最大値になるはずなので、
22
- 「最後の今日の投稿番号+1」を使うのも手ですし、
22
+ 「最後のの投稿番号+1」を使うのも手ですし、
23
23
  あるいは、
24
24
  別途投稿番号発番用データファイルを用意して、
25
25
  投稿番号を払い出したら+1して保存するなどすればよいです。
@@ -35,4 +35,17 @@
35
35
  削除処理foreachループにて、
36
36
  投稿番号が指定の番号と違ったらファイルに書き出す、のもいいですが、
37
37
  例えば書き出すのを後回しにして、書き出し用配列を用意して、
38
- 書き出す配列をもとに改行コードで連結してから書き出す、という技でもできそうです。
38
+ 書き出す配列をもとに改行コードで連結してから書き出す、という技でもできそうです。
39
+
40
+ ---
41
+
42
+ web上のシステムなので、実際に複数の人が使い始めると、
43
+ ほぼ同じタイミングで投稿されることも起こりえます。
44
+ file()やfile_get_contents()やfile_put_contents()などの簡易ファイルアクセス関数は
45
+ ファイルの排他ロックがかからないため、
46
+ タイミングによってはデータファイル破損を招きます。
47
+ ファイルでやりきるならfopen()~fgets()~fputs()~fclose()といっしょに
48
+ flock()にて排他ロックを行い、
49
+ ロック中は待ち合わせするような工夫も必要です。
50
+ 簡易掲示板だからそこまで求めないと考えるのか、
51
+ 簡易掲示板だけどしっかり作り込むかは考え方次第です。

2

加筆修正

2019/09/04 07:55

投稿

退会済みユーザー
answer CHANGED
@@ -4,6 +4,12 @@
4
4
  htmlspecialchars()加工前の文字列で扱い、
5
5
  htmlとして出力する場合に直前にhtmlspecialchars()で臨時に加工するのがセオリーです。
6
6
 
7
+ 但し、今回のデータファイル上で、データの区切りに「<>」を使っているため、
8
+ もしも投稿POSTデータに「<>」が含まれていたらどうするか、
9
+ 拒否するのか、
10
+ 含まれていても差し支えないように置き換えるか、
11
+ の工夫は絶対必要です。
12
+
7
13
  ---
8
14
 
9
15
  投稿番号を管理する上で、`$count`を使用していますが、
@@ -15,5 +21,18 @@
15
21
  必ず最後の行の投稿番号が最大値になるはずなので、
16
22
  「最後の今日の投稿番号+1」を使うのも手ですし、
17
23
  あるいは、
18
- 別途投稿番号発番用ファイルを用意して、
24
+ 別途投稿番号発番用データファイルを用意して、
19
- 投稿番号を払い出したら+1して保存するなどすればよいです。
25
+ 投稿番号を払い出したら+1して保存するなどすればよいです。
26
+
27
+ ---
28
+
29
+ やっと削除部分の処理の評価ですが、
30
+ 変数名がわかりにくすぎます。
31
+ 変数名を見て、それがなんの目的のものなのかがピンとこないものは
32
+ 見直すべきです。
33
+ $valueと$value4って何がどう違うのか、パット見で把握できないでしょ。
34
+
35
+ 削除処理foreachループにて、
36
+ 投稿番号が指定の番号と違ったらファイルに書き出す、のもいいですが、
37
+ 例えば書き出すのを後回しにして、書き出し用配列を用意して、
38
+ 書き出す配列をもとに改行コードで連結してから書き出す、という技でもできそうです。

1

加筆修正

2019/09/04 07:48

投稿

退会済みユーザー
answer CHANGED
@@ -2,4 +2,18 @@
2
2
  [「何故htmlspecialcharsを通すのか?」を一言でどうぞ - Qiita](https://qiita.com/mpyw/items/19e6fed835ccdbcb0d6d)
3
3
  データとして保持する文字列(ファイルに書き出す文字列)は
4
4
  htmlspecialchars()加工前の文字列で扱い、
5
- htmlとして出力する場合に直前にhtmlspecialchars()で臨時に加工するのがセオリーです。
5
+ htmlとして出力する場合に直前にhtmlspecialchars()で臨時に加工するのがセオリーです。
6
+
7
+ ---
8
+
9
+ 投稿番号を管理する上で、`$count`を使用していますが、
10
+ 例えば5番まで使っている時に3番を削除したら、
11
+ 本来1,2,4,5の行がある状態になりますよね。
12
+ でもこのとき$countは行数4に対して1を加えて5にしてしまうと、
13
+ 投稿番号がダブることになります。
14
+ なので、投稿データの順序が入れ替わることがないのであれば、
15
+ 必ず最後の行の投稿番号が最大値になるはずなので、
16
+ 「最後の今日の投稿番号+1」を使うのも手ですし、
17
+ あるいは、
18
+ 別途投稿番号発番用ファイルを用意して、
19
+ 投稿番号を払い出したら+1して保存するなどすればよいです。