質問: fopen($filename , "a"); fwrite( $fp2 , $data); fclose($fp2); } ?> 【 投稿一覧 】 ", $value); echo "$result[0] $result[1] $result[2] $result[3] " ; } } ?> ```
回答: 削除処理のところをピックアップしてみます。 ``` /*POST送信があったとき*/ if (isset($_POST["delete"])) { /*変数に代入*/ $delete = $_POST["deleteno"]; /*ファイル全体を読み込んで配列に格納する*/ $delCon = file("mission_3-1.txt"); /*配列の要素数(=行数)だけループさせる*/ for ($j = 0; $j < count($delCon) ; $j++){ /*区切り文字「<>」で分割して、投稿番号を取得*/ $delData = explode("<>", $delCon[$j]); /*投稿番号と削除対象番号を比較。等しくない場合はファイルに追加書き込みを行う*/ if ($delData[0] == $delete) { array_splice($delcon, $j, 1); file_put_contents($filename, implode("\n", $delCon)); } } fclose($fp); } ``` `file_put_contents()`で`implode()`で連結したものをファイルに書き出しているようですが、 書き出したあとのファイルの中身を確認していますか? 書き出しの処理のところで ``` /*書き込む文字列を組み合わせた変数*/ $data = "$num <> $name <> $comment <> $date". PHP_EOL; ``` としていて`PHP_EOL`を使っているのに、 `implode()`でなぜ`"\n"`を使うのでしょう? ふつうは、同じ改行コードにしますよね。 結果が同じだったらどう表記してもいいという考えでしょうか。 そして、 `implode()`で投稿データの再連結をしていますが、 一番最後のデータの後ろに`"\n"`はつくのかなぁ。 丁寧に、投稿データの加工のそれぞれの場面で、 `var_dump()`とか駆使しながら、狙った通りのデータの持ち方になっているかを しっかり確認してください。 思い込みを排除して冷静に丁寧に。 あと、削除の動作についてですが、 投稿番号が一致したら削除ですよね、 投稿データをひとつ削除して書き出すので物理削除します。 例えば1,2,3,4,5の投稿があって、4を削除すると、 ファイル上には1,2,3,5があります。 データ数を`$num = count(file($filename))+1;`にて求めると「5」が使われてしまいます。 簡単に投稿番号の重複を呼び起こします。 重複を起こさないためには、 a) 面倒でも投稿データをひとつひとつチェックして、 投稿番号の最大値を求め、+1して使う。 b) 投稿データファイルとば別に 投稿番号のみを管理するファイルを設け、 投稿を書き込むたびに+1した内容に更新する。 などといった方法が考えられます。 投稿データの書き込みの箇所でもう一点。 ``` /*書き込む文字列を組み合わせた変数*/ $data = "$num <> $name <> $comment <> $date". PHP_EOL; ``` こんな連結方法でいいのでしょうか? 分離方法が ``` $result = explode("<>", $value); ``` となっているので、どちらかに統一しないと、 前後に余計に空白がついたデータが使われます。 HTML上に出力したソースコードで意図せず空白が前後についていると思われます。 揃えるなら例えば ``` $result = explode(" <> ", $value); ``` とするか、そもそも連結箇所を ``` /*書き込む文字列を組み合わせた変数*/ $data = implode("<>", [$num, $name, $comment, $date]) . PHP_EOL; ``` などとするかです。 まぁ、それを言い出すと、 フォームで投稿文字列に「<>」が入っている場合の対策がないことも気になります。 $nameや$commentに当たる箇所に「<>」が入っていると、 ファイルから読み出して分離するときに投稿データに含まれる「<>」で区切られると おかしなことになります。