こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

こんばんわです。
以下のスクリプトで 投稿データを時系列に新しい書込み順に表示させようとしているのですが、一度実行させると同じ投稿がいくつも表示されてしまうのです。ご回答お願いいたします。一部省略しています。
<?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>";
}



?>

投稿日時 - 2006-06-12 20:32:08

QNo.2211674

暇なときに回答ください

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

以下のサンプルコードを参考にどうぞ。

$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

投稿日時 - 2006-06-13 03:59:47

お礼

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

投稿日時 - 2006-06-13 09:51:01

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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>";
}

でないといけないと思います。

投稿日時 - 2006-06-12 23:12:20

お礼

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

投稿日時 - 2006-06-13 09:49:21

あなたにオススメの質問