質問: $editNO) { //編集のフォームから送信された値と差し替えて上書き fwrite($fp,$editNO . "<>" . $name . "<>" . $comment . "<>" . $postedAt . "\n"); } else { //一致しなかったところはそのまま書き込む fwrite($fp,$line); } } fclose($fp); } ?> ",$word); //取得した値を表示する echo $getdata[0] . " " . $getdata[1] . " " . $getdata[2] . " " . $getdata[3] . ""; } } ?> ```
回答: まず、端的になぜこのような現象が起こっているかについてですが 17行目からの投稿機能が送信が押された場合に必ず実行されてしまうため、新規投稿が実行された後に108行目の編集機能も実行されてそのような現象が起こっています。 次にこれを直す方法についてですが、色々と書き方はあると思うので今のソースからあまり変えないで わかりやすく直すとすると、108行目以降の編集実行機能は削除して「//編集か新規投稿か判断」を投稿機能の部分に持ってきます。 フォーム内が空じゃない場合でeditNOが空の場合は新規、editNOが空じゃない場合には編集と判断するようにしてみます。 (ネストを深くしたくないなどもあると思うので書き方等は良い感じで) ``` //投稿機能 //フォーム内が空でない場合に以下を実行する if (!empty($_POST['name']) && !empty($_POST['comment'])) { //入力データの受け取りを変数に代入 $name = $_POST['name']; $comment = $_POST['comment']; //日付データを取得して変数に代入 $postedAt = date("Y年m月d日 H:i:s"); // editNoがないときは新規投稿、ある場合は編集 ***ここで判断 if (empty($_POST['editNO'])) { // 以下、新規投稿機能 //ファイルの存在がある場合は投稿番号+1、なかったら1を指定する if (file_exists($filename)) { $num = count(file($filename)) + 1; } else { $num = 1; } //書き込む文字列を組み合わせた変数 $newdata = $num . "<>" . $name . "<>" . $comment . "<>" . $postedAt; //ファイルを追記保存モードでオープンする $fp = fopen($filename, "a"); //入力データのファイル書き込み fwrite($fp, $newdata . "\n"); fclose($fp); } else { // 以下編集機能 //入力データの受け取りを変数に代入 $editNO = $_POST['editNO']; //読み込んだファイルの中身を配列に格納する $ret_array = file($filename); //ファイルを書き込みモードでオープン+中身を空に $fp = fopen($filename, "w"); //配列の数だけループさせる foreach ($ret_array as $line) { //explode関数でそれぞれの値を取得 $data = explode("<>", $line); //投稿番号と編集番号が一致したら if ($data[0] == $editNO) { //編集のフォームから送信された値と差し替えて上書き fwrite($fp, $editNO . "<>" . $name . "<>" . $comment . "<>" . $postedAt . "\n"); } else { //一致しなかったところはそのまま書き込む fwrite($fp, $line); } } fclose($fp); } } ``` 以上です。何かわからない部分があればコメントください。