- ベストアンサー
keyの最大値を取得する方法
- DB_Fileを使用して掲示板を作っています。投稿者の発言に、管理者がレスをつけるといったいわばオーソドックスなBBSです。書き込み時に書き込み数(カウント)をkeyとしてデータを格納していますが、一番大きな数字を取得する方法を教えてください。
- %DBのキーで一番大きな数字を取得する方法について教えてください。現在、DB_Fileを使用して掲示板を作っています。投稿者の発言に、管理者がレスをつけるといったいわばオーソドックスなBBSです。
- 掲示板を作成中で、DB_Fileを使用しています。投稿者の発言に、管理者がレスをつけるという形式のBBSです。書き込み時に書き込み数をkeyとしてデータを格納しているのですが、一番大きな数字を取得する方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>つまり、書き込み内容などの問題で部分的に記事を削除する場合は >・データは保存したままで、表示はしない(書き込みナンバーを常に連番にするなら「削除しました」と表示するなど) >という事ですよね。 ええ、そうです。 >で、データファイルから100件まとめて消す時は、消す前にトータル書き込み数を$maxなどに保存しておきそこから参照して$noを設定すればいい、という事ですよね。 ちょっと違います。消す前に$maxに保存しておくのではなく、$maxは常に最新の、最後の投稿の番号を保存してある形にしています。 私の場合は、まとめて消すというより、ファイルを大きくしないためのバックアップなので、必ず若い番号からまとめて削除します。 なので、現在データファイルにある投稿の番号が何番から何番までなのかを、$min~$maxでわかるようにしているのです。$minは当初1で、バックアップで100件削除すれば101になると。$maxは投稿があるたびに、プログラムで1ずつ増えていくので、最新の番号を指していると。こういうことです。 ただ、これはあくまでも私がそうやって作っているということであって、ひとつの考え方ですので。 ついでに少し説明しておくと、私のプログラムの場合、掲示板をデフォルトで開くと、$maxから20件をDBMから読み出して表示します(最新からの読み出し)。$maxを読むことで、表示すべきメッセージの番号が確定する($max,$max-1,$max-2,...)ので、ソートなどがいらず、プログラムもシンプルになります。 古いメッセージへさかのぼってページめくりしていくとき、どこかで最も古いメッセージへ行き当たり、それ以上表示できなくなりますよね。それを$minで管理しています。 そんな感じです。
その他の回答 (2)
- taba
- ベストアンサー率61% (349/567)
>しかし、部分的に削除した場合にはちょっと辛いですね・・。 そうですね。あくまでもまとめてバックアップを取ったときの処理で、部分的に削除したときは別のロジックで処理しています。削除したところのデータ($DB{$no}の中の$deleteとかいう変数)に削除されたことを示すフラグを立てるような形です。 >$DB{$no}のキーが、1.2.3.4...105だったとして、 >書き込み編集後1.3.8...104になるとします。 >この状態で次の書き込み時に$no=105としたいのです。 このあたりは全体の整合性を取らないといけないので、部分的に論じるとうまくいかないかもしれませんね。 ただ、maxという値を保持するというのは、つまり次の番号が何になるかを、これまでの値とは別に持っておくということです。 105まで書き込まれたとき、私のコードではmax=105になっていて、次の書き込みをするときは105に1を加えてkeyを106にします。 直前に削除があって105が無くなっていたとしても、次が106になってもいいのではないですか?(飛び番号ができるのは構わないのですよね?)何か勘違いしていたら指摘してください。 上にも書きましたが、私の使っているコードの場合、削除があってもメッセージの実体は削除せず、削除されたメッセージという扱いで「表示しない」というプログラムにしています。なので、連番は崩れないんですよね。 つまり、削除とバックアップは別になるわけです。伝わりますか?
補足
ご丁寧な回答ありがとうございます!わかってきました・・・! つまり、書き込み内容などの問題で部分的に記事を削除する場合は ・データは保存したままで、表示はしない(書き込みナンバーを常に連番にするなら「削除しました」と表示するなど) という事ですよね。 で、データファイルから100件まとめて消す時は、消す前にトータル書き込み数を$maxなどに保存しておきそこから参照して$noを設定すればいい、という事ですよね。 この認識で間違っていたら教えていただけないでしょうか。 何度もすみません、平行してこちらも試してみますが、よろしくお願いします!
- taba
- ベストアンサー率61% (349/567)
私もDBMを使って掲示板を動かしていますが、私の場合は書き込み数の最大値を保存しています。 $max = $DB{'max'} $max++; $DB{$max} = "$max$delim$name$delim$addr$delim・・・・"; という感じでしょうか。 この場合、keyを全部取得してソートして表示するようなコードを書くときにmaxを別途処理しなければならないので気をつける必要があります。 私の場合は、常に番号を指定して呼び出す(投稿の1から10までとか)ようにしているので、同じDBに入っていても問題ないんですが。 最近はメンテナンス用に$minも設定し、数が大きくなった場合は$minを1から例えば1001に変えて、DBから1000件削除するというような対応をしています。 (表示する投稿は、$minから$maxの範囲とする) 直接の回答じゃないですけど、ひとつの考え方ということで。
お礼
ありがとうございます! >メンテナンス用に$minも設定 なるほど、こういうやり方もあるんですね。 しかし、部分的に削除した場合にはちょっと辛いですね・・。 また、質問の仕方がいまいちでした。 $DB{$no}のキーが、1.2.3.4...105だったとして、 書き込み編集後1.3.8...104になるとします。 この状態で次の書き込み時に$no=105としたいのです。 また、例えば1000件書き込まれた時点で200件を削除するとして、 その場合にも次の書き込み時には$no=1001となればいいのですが・・ せっかくDBMを使っているのでメモリに全部読み込んでしまうのはもったいないかなと考えています。(現在はキーの総数を取得しています。) すみません、もう少しみなさんのご意見を伺わせてください。
お礼
すみません、やっとわかりました!^^; ちょっと日本語がおかしいですが if($DB{'max'} eq ''){#最大数が設定されてなかったら $no = scalar keys %DB;#データ数を取得 }else{#入ってたら $no += $DB{'max'};#現在の書き込み数を取得 } $no++; $DB{'max'}="$no";#最大の書き込みナンバーを保存 $DB{$no} = "$no$delim$name$delim$show......"; で、削除時に削除数を$minに保存し、 読み込み時に$min>0の条件で出す、という事ですよね。 読み込み方法はtabaさんと同様の考え方になっています。 ありがとうございました!まずこれでやってみます。 しかし、念の為もうちょっと締切らないでおかせて下さい^^;
補足
前回の確認部分は間違ってましたが・・(恥) しかし、tabaさんの考え方どうりで思ったものが出来ました!! なかなか理解できなくてごめんなさいでした^^; 詳しい解説とアドバイス本当にありがとうございました。 大感謝です!