• ベストアンサー

ファイル書き込みが重複する

こんばんわです。 以下のスクリプトで 投稿データを時系列に新しい書込み順に表示させようとしているのですが、一度実行させると同じ投稿がいくつも表示されてしまうのです。ご回答お願いいたします。一部省略しています。 <?php if($name== "" or $body == ""){ echo '<font color = "#FF000">必須項目入力エラー</font><br>'; echo 'お名前と本文は必ず入力してください<br>'; echo '<a href = "javascript:history.back()">戻る</a>'; } $body = substr($body, 0, 1000); $body = str_replace("\r\n", "<br>", $body); $dt = date("y/m/d H:i:s"); $data = file("data.txt"); $file = fopen("data.txt", "w"); fwrite($file, "$name\t$mail\t$body\t$dt\n"); $i = 1; foreach ($data as $value) { if($i < 30) { fwrite($file, "$value"); $i++; } } fclose($file); } echo ' subject03-BBS <h1>subject-BBS</h1> <form method="post" action="subject03.php" > お名前 <input type="text" size="20" maxlength="40" name="NAME"> メール <input type="text" size="30" maxlength="60" name="MAIL"> <p>本文<br></p> <textarea rows="20" cols="80" wrap="soft" name="BODY"></textarea> <p><input type="submit" name="SUBMIT" value="送信"><p/> </form> '; $data = file("data.txt"); foreach($data as $value){ $view = explode("\t",$value); if($mail== ""){ echo "お名前:$name$view[3]<br>"; } else{ echo "お名前:<a href=\"mailto:$mail\">$name</a>$view[3]<br>";} echo "本文:$body<br>"; } ?>

質問者が選んだベストアンサー

  • ベストアンサー
noname#18096
noname#18096
回答No.2

以下のサンプルコードを参考にどうぞ。 $body = substr($body, 0, 1000); $body = str_replace("\r\n", "<br>", $body); /* 追加したコード ここから */ $body = str_replace("\r", "<br>", $body); // 復帰コード $body = str_replace("\n", "<br>", $body); // 改行コード $body = str_replace("\t", " ", $body); // タブ /* 追加したコード ここまで */ $dt = date("y/m/d H:i:s"); $data = file("data.txt"); // 既存データ読み込み array_shift($data); // 配列の1つめの要素を除去 if($file = fopen("data.txt", "w")){ // ファイルオープン fwrite($file, "$name\t$mail\t$body\t$dt\n".implode("", $data)); // 投稿データ+既存データの書き込み fclose($file); // ファイルクローズ } echo ' subject03-BBS <h1>subject-BBS</h1> <form method="post" action="subject03.php" > お名前 <input type="text" size="20" maxlength="40" name="NAME"> メール <input type="text" size="30" maxlength="60" name="MAIL"> <p>本文<br></p> <textarea rows="20" cols="80" wrap="soft" name="BODY"></textarea> <p><input type="submit" name="SUBMIT" value="送信"><p/> </form> '; $data = file("data.txt"); foreach($data as $value){ list($name, $mail, $body, $dt) = explode("\t",$value); // 分割した要素を各変数に代入 if($mail== ""){ echo "お名前:$name$dt<br>"; }else{ echo "お名前:<a href=\"mailto:$mail\">$name</a>$dt<br>"; } echo "本文:$body<br>"; } 復帰コード,改行コードは閲覧者の環境の違いを吸収するため。 タブ文字はコピペで記入できますが、タブ文字が入っていると、データファイルのフォーマット上問題が出てきます。 (タブ文字は区切り文字に使ってますからね) 初期のfile関数のコードはarray_shift関数,implode関数でまとめてみました。 後半のページ出力部分はkaiwareponさんの仰るとおりですが、ユニークな変数に代入するようにしてみました。 多分、こちらの方が管理しやすいのではないかと思います。 最後に、これはお節介ですが、タグを無効化するために、htmlspecialchars関数を使うことをお勧めします。 PHP: htmlspecialchars - Manual http://jp2.php.net/manual/ja/function.htmlspecialchars.php

msnxl
質問者

お礼

ありがとうございました。新しい書込み順に表示させことができました。完全に理解するまで、もうちょっと時間がかかると思いますが アドバイス、ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

if($mail== ""){ echo "お名前:$name$view[3]<br>"; } else{ echo "お名前:<a href=\"mailto:$mail\">$name</a>$view[3]<br>";} echo "本文:$body<br>"; } 上記の部分がよくわかりません。 このコードがすべてひとつのプログラムであるなら、 $name、$mail、$bodyが単純に入力された値から変化がないので すべてに同じ内容が書き出されます。 if($mail== ""){ echo "お名前:$view[0]$view[3]<br>"; } else{ echo "お名前:<a href=\"mailto:$mail\">$view[0]</a>$view[3]<br>";} echo "本文:$view[2]<br>"; } でないといけないと思います。

msnxl
質問者

お礼

ありがとうございました。新しい書込み順に表示させことができました。

すると、全ての回答が全文表示されます。

関連するQ&A