プロが教える店舗&オフィスのセキュリティ対策術

アンケートのようなシステムを作っています。
ユーザーからの投票データをログに保存するときに、

1.1行ずつ読み込む
2.データの番号とポストされた番号が一致していればデータを+1
3.変数$buffに処理が終わった行をためておく
4.1に戻る
5.全ての行が終わったらまとめて保存($buffを保存)

という流れにしており、1~4はファイルロックして、読み込みおよび書き込みさせています。

例えば
3,あなたの好きな食べ物は?,0,0,0
2,あなたの好きな色は?,0,0,0
1,あなたの好きな車は?,0,0,0
というログデータがあるとして、投票フォームから渡ってきた値をforeach($_POST as $key =>$value)として
$keyとログの先頭の番号が一致していれば$valueにあたるデータを+1しています。
ファイルを保存するときは
$fp=@fopen($log, "w+")
としていますが、これだとログデータが全部消えて0バイトになってしまいます。
$fp=@fopen($log, "r+")
だと、ログデータの後に修正されたデータが追加されて保存されてしまいます。(倍のデータになってしまいます)
直前にセーブする$buffのデータを出力させると正常ですので、fopenのモードが問題だと考えています。
このような場合、どのように処理すればいいのでしょうか。
一度ファイルを消してから保存する方法も考えたのですが、ファイルをロックしながらデータを消す方法がわかりませんでした。
よろしくご教授お願い致します。

A 回答 (1件)

'r+' 読みこみ・書きこみ用にオープンします。

ファイルポインタを ファイルの先頭に置きます。

'w+' 読みこみ・書きこみ用でオープンします。ファイルポインタを ファイルの先頭に置き、ファイルサイズをゼロにします。 ファイルが存在しない場合には、作成を試みます。

マニュアルにはこういう風に書いてあります。r+で追加されるのは、ファイルポインタがデータの最後にあるからで(おそらく、その前にデータを読み込んでいるのでしょう)、w+だと消えるのは仕様です。

r+で読んだあとに、書き込み前にrewindしてください。
参考URLのfopenのマニュアルの下の記述の中に、サンプルがいくつかあると思います。英語だけど、ソースは読めると思うので、rewindを検索してみてください。

参考URL:http://www.php.net/manual/ja/function.fopen.php
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
素晴らしいです。うまくできました。
めっちゃ感激いたしました。
本当に助かりました。ありがとうございます。

お礼日時:2004/03/09 14:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!