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

回答編集履歴

1

更新処理部分を追記

2019/08/27 04:52

投稿

45_Shingo
45_Shingo

スコア177

answer CHANGED
@@ -70,7 +70,7 @@
70
70
  $edit = $_POST["edit"];
71
71
 
72
72
  foreach($editline as $ccc){
73
- $data3 = explode(" ",$ccc);
73
+ $data3 = explode("<>",$ccc);
74
74
  if($data3[0] == $edit){
75
75
  $namae_e = $data3[1];
76
76
  $message_e = $data3[2];
@@ -199,4 +199,47 @@
199
199
  ```
200
200
  という感じで処理を分岐していけばよいかと思います。
201
201
 
202
- ※全体的にPHP部分を1か所にまとめ、フォーム中にセットする値は$name等の変数のセットしておいて、それをHTML中に埋め込む方が可読性も上がるので良いと思います。
202
+ ※全体的にPHP部分を1か所にまとめ、フォーム中にセットする値は$name等の変数のセットしておいて、それをHTML中に埋め込む方が可読性も上がるので良いと思います。
203
+
204
+ ---
205
+
206
+ すみません、1行だけ変更する方法…って質問でしたね。肝心なその部分の処理を書いてませんでしたので追記です。
207
+
208
+ 単純に、データを取得する時と同じ処理の途中で、numberと一致しているかどうかをチェックし、そこだけ書き出し方を変えています。
209
+ なお、勉強用の簡易掲示板という事ですのでロック処理等はあえて書いてないですが、実際に掲示板として機能させようとした場合には、排他ロック等の処理が必要になりますので、一旦予定していた動作確認が取れたらそういった処理を追加していけばよいと思います。
210
+
211
+ ```PHP
212
+ $date = date("Y/m/d H:i:s");
213
+ $delimiter = "<>";
214
+
215
+ if(!empty($_POST["name"]) && !empty($_POST["comment"])){
216
+ $namae = $_POST["name"];
217
+ $message = $_POST["comment"];
218
+
219
+ if(!empty($_POST["number"]){
220
+ $lines = file($filename);
221
+ $number = $_POST["number"];
222
+
223
+ $fp = fopen($filename, "w" );
224
+
225
+ foreach($lines as $current_line){
226
+ $posted_data = explode(" ",$current_line);
227
+
228
+ if($posted_data[0] == $number){
229
+ $update_line = implode( $delimiter, array( $number, $name, $message, $date) );
230
+ fwrite( $fp, "$update_line\r\n");
231
+ } else{
232
+ fwrite( $fp, "$current_line\r\n");
233
+ }
234
+ }
235
+
236
+ fclose($fp);
237
+ } else{
238
+ // 新規追加処理
239
+ }
240
+ }
241
+
242
+ ```
243
+
244
+ あと、あちこちからコピペして作られてるのかと思いますが、データファイルに保存時にデータを連結しているデリミタと、explodeしているときのデリミタが異なっているので多分データが正しく保存されていません。
245
+ できれば、今回のデリミタ等、プログラム中で何度も出てくる文字列は定数(変数)として最初に定義しておいてそれを使う方がバグが出にくくなります。