- ベストアンサー
前回の値を覚えておくには?
Perlでページが更新された場合、前回の値と今回の値を見て処理を 違うようにしたいです。 例えば、同一のホストでパスワードが3回以上間違えると、1時間 以上経過しないとアクセスできないようにする。ここで、同一の ホストかどうかは、Perlスクリプトの最後で、 $old_host = $host; と違う変数にセーブしても処理の最初で $host=$old_host とロード した時、値が""になっています。Perlはどうやらグローバル変数ですが スタティックな変数なようです。 この場合、$old_hostという値を次回に同じパスを通ったときまで 覚えておきたいのですが、どういう解決方法があるのでしょうか。 ファイルにして保存しないと無理なのでしょうか。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
結論から言いますと、ファイルやDBなど永続記憶装置に記憶するしかないです。 CGIは、perlコマンドでCGIを実行し、終了時に標準出力へ出力された結果をブラウザに返すと言うプロトコルです。この「終了時に」と言うところが重要で、プログラムは一旦終了してしまっているために、このタイミングでメモり上のデータは全て破棄されます。 mod_perlやFastCGIを利用すると状況は変わってきますが、これは上級者向けの技術ですのでお勧めできません。
その他の回答 (4)
- kumoz
- ベストアンサー率64% (120/185)
質問のケースに向かないかもしれませんが、簡単なものならば変数を name 属性に 埋め込む方法があろうかと思います。 <input type="submit" name="Q$no" value="next"> クイズを出題する CGI と思ってください。ユーザーが next ボタンを押して、次の 問題を要求したら、サーバーでは現在の出題 no を取り出して、インクリメントして 次の問題を出題するという仕掛けです。このようにすると、ユーザー毎に昇順で問題 を出題することができます。
お礼
勉強になりました。 回答どうもありがとうございます。
- W_H
- ベストアンサー率47% (21/44)
Cookieに保存したらどうでしょうか。 確かに確実性という意味では、Cookieを許可していない、ブラウザを閉じると自動削除という設定、手動で削除、などを実行されると消えます。 が、中身に間違った回数を入れ、保存期間を一時間後に設定し、Cookieの中身が三以上なら、Cookieが削除されるまでエラーページに誘導、という手があります。 他には、フォームに間違った回数を同時に送るようにして、三以上になったらCookieを発行、もしくはファイルに時間とホストなどを書き込む、などをすれば、少しは応用が利くのではないでしょうか。 とにかく、一度処理を終了するたびに使っていたデータは削除しないと、他の処理にメモリの容量とかを回せず、サーバーの処理速度が落ちていきます。 一応いろいろな方法があるので、自分にとって楽なのを探してみてください。
お礼
いろいろな方法があるのですね。 勉強になりました。回答ありがとうございました。
- vsba23895
- ベストアンサー率58% (18/31)
speedy http://www.daemoninc.com/SpeedyCGI/ というものがあって、(本来は起動を速くするのが目的ですが)、これだとセッションを跨いでも前の情報が消えません。 ただ、その分、初期化すべき変数はきちんと初期化しないと、予想外の結果が返ります。又、レンタルサーバでは設置できないかも知れません。 利用方法は、#! /usr/bin/perl の代りに #! /usr/bin/speedy とするだけで、とても簡単。
お礼
speedyは全く知りませんでした。回答ありがとうございます。
- guci-ok
- ベストアンサー率33% (49/146)
CGIとも何とも書いていませんが、普通、前回のデータはファイルか データベースなど、どこかに保存しないと無理です。 「データの永続化」の問題です。 有料、無料のデータベース、テキストファイル、DBMと呼ばれる 簡易なデータベースなど、いくらでも方法が有ります。 しかし、中にはCGIの亜種で、データをグローバルに扱うことの できるものもあります。 過去に自分で使ったものでお勧めできるものが無いので、ここで 具体的なソフトウェア名は挙げられませんが。
お礼
回答ありがとうございます。 「データの永続化」というんですね。ファイルに保存しようかと 思います。
お礼
回答ありがとうございます。 No1.さんの通り、永続記録装置(ファイル)に記録することに しました。