こんにちは。
以前DBMについて質問したchocolatsです。
おかげさまで、なんとか使えるようになってきました!
さて、現在DB_Fileを使用して掲示板を作っています。
投稿者の発言に、管理者がレスをつけるといったいわばオーソドックスなBBSです。
書き込み時に書き込み数(カウント)をkeyとしてデータを格納しているのですが、当初何も考えずに
$no = scalar keys %DB;
$no += 2;
$DB{$no} = "$no$delim$name$delim$addr$delim・・・・";
#$delimは適当な区切り文字です
としていましたが・・
これだと、当たり前の話しですが、投稿削除や、ログ消去ができないんですよね!^^;
サーバーの容量が50Mですので、ログファイルにとれる容量は多くても1M以下にしておきたいのです。
かなりの件数までは保存できそうですが、いつかはデータの一部削除をしなくてはいけませんし・・
そこで、伺いたいのですが、
■%DBのキーで一番大きな数字を取得する方法
はどういったものがあるのでしょうか。
私に考え付くのは、読み込んで、逆ソートして、一番目のデータを取得する・・といった手段ぐらいです。
これでは要領が悪い(負荷が大きい)ように感じるのですが、他にいい方法があれば、ぜひ教えていただけないでしょうか。
何か足りたい情報がありましたらお知らせください。補足します。
No.1
- 回答日時:
私も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を使っているのでメモリに全部読み込んでしまうのはもったいないかなと考えています。(現在はキーの総数を取得しています。)
すみません、もう少しみなさんのご意見を伺わせてください。
No.2
- 回答日時:
>しかし、部分的に削除した場合にはちょっと辛いですね・・。
そうですね。あくまでもまとめてバックアップを取ったときの処理で、部分的に削除したときは別のロジックで処理しています。削除したところのデータ($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を設定すればいい、という事ですよね。
この認識で間違っていたら教えていただけないでしょうか。
何度もすみません、平行してこちらも試してみますが、よろしくお願いします!
No.3ベストアンサー
- 回答日時:
>つまり、書き込み内容などの問題で部分的に記事を削除する場合は
>・データは保存したままで、表示はしない(書き込みナンバーを常に連番にするなら「削除しました」と表示するなど)
>という事ですよね。
ええ、そうです。
>で、データファイルから100件まとめて消す時は、消す前にトータル書き込み数を$maxなどに保存しておきそこから参照して$noを設定すればいい、という事ですよね。
ちょっと違います。消す前に$maxに保存しておくのではなく、$maxは常に最新の、最後の投稿の番号を保存してある形にしています。
私の場合は、まとめて消すというより、ファイルを大きくしないためのバックアップなので、必ず若い番号からまとめて削除します。
なので、現在データファイルにある投稿の番号が何番から何番までなのかを、$min~$maxでわかるようにしているのです。$minは当初1で、バックアップで100件削除すれば101になると。$maxは投稿があるたびに、プログラムで1ずつ増えていくので、最新の番号を指していると。こういうことです。
ただ、これはあくまでも私がそうやって作っているということであって、ひとつの考え方ですので。
ついでに少し説明しておくと、私のプログラムの場合、掲示板をデフォルトで開くと、$maxから20件をDBMから読み出して表示します(最新からの読み出し)。$maxを読むことで、表示すべきメッセージの番号が確定する($max,$max-1,$max-2,...)ので、ソートなどがいらず、プログラムもシンプルになります。
古いメッセージへさかのぼってページめくりしていくとき、どこかで最も古いメッセージへ行き当たり、それ以上表示できなくなりますよね。それを$minで管理しています。
そんな感じです。
この回答への補足
前回の確認部分は間違ってましたが・・(恥)
しかし、tabaさんの考え方どうりで思ったものが出来ました!!
なかなか理解できなくてごめんなさいでした^^;
詳しい解説とアドバイス本当にありがとうございました。
大感謝です!
すみません、やっとわかりました!^^;
ちょっと日本語がおかしいですが
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さんと同様の考え方になっています。
ありがとうございました!まずこれでやってみます。
しかし、念の為もうちょっと締切らないでおかせて下さい^^;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- その他(法律) 携帯電話会社に保管されている解約済み個人情報を消去したい 3 2022/08/13 23:23
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SNSなどで使われる、n回目とは...
-
中学生でも薬局でTENGAって買え...
-
apxアップデートの認証中遅すぎ...
-
誘いは難しい
-
カカオトークのリンクの貼り付...
-
仕事帰り社内の人と同じ時間に...
-
熟女の保険外交員って誘ってま...
-
子どもは作らない方が賢い、ま...
-
職場で噂される男女とされない...
-
見慣れないアドレス
-
カカオトークをやってるのがバ...
-
自分から話しかけない人ってそ...
-
高2の女子です。 修学旅行で、...
-
5ch
-
私の好きな人が、LINEの返信は...
-
障害者の嫁
-
2chでスレッドを単に閲覧した...
-
エクセルのデータはDVDに保...
-
Outlook 2010の無視という機能...
-
文末によくみる「w」の意味を教...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SNSなどで使われる、n回目とは...
-
中学生でも薬局でTENGAって買え...
-
仕事帰り社内の人と同じ時間に...
-
高2の女子です。 修学旅行で、...
-
子どもは作らない方が賢い、ま...
-
誘いは難しい
-
熟女の保険外交員って誘ってま...
-
職場で噂される男女とされない...
-
5ch
-
カカオトークのリンクの貼り付...
-
雑談たぬきについてなのですが...
-
新卒女性です。男性の先輩から...
-
カカオトーク退会すると、エラ...
-
メールソフト サンダーバード...
-
自分から話しかけない人ってそ...
-
エクセルのデータはDVDに保...
-
障害者の嫁
-
ビデオ通話でのオナニーについ...
-
カカオトークで、私が送った写...
-
語尾に笑いが含まれる人の心理 ...
おすすめ情報