• ベストアンサー

前回の値を覚えておくには?

Perlでページが更新された場合、前回の値と今回の値を見て処理を 違うようにしたいです。 例えば、同一のホストでパスワードが3回以上間違えると、1時間 以上経過しないとアクセスできないようにする。ここで、同一の ホストかどうかは、Perlスクリプトの最後で、  $old_host = $host; と違う変数にセーブしても処理の最初で $host=$old_host とロード した時、値が""になっています。Perlはどうやらグローバル変数ですが スタティックな変数なようです。 この場合、$old_hostという値を次回に同じパスを通ったときまで 覚えておきたいのですが、どういう解決方法があるのでしょうか。 ファイルにして保存しないと無理なのでしょうか。

  • Perl
  • 回答数5
  • ありがとう数5

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

  • ベストアンサー
回答No.2

結論から言いますと、ファイルやDBなど永続記憶装置に記憶するしかないです。 CGIは、perlコマンドでCGIを実行し、終了時に標準出力へ出力された結果をブラウザに返すと言うプロトコルです。この「終了時に」と言うところが重要で、プログラムは一旦終了してしまっているために、このタイミングでメモり上のデータは全て破棄されます。 mod_perlやFastCGIを利用すると状況は変わってきますが、これは上級者向けの技術ですのでお勧めできません。

myfrend
質問者

お礼

回答ありがとうございます。 No1.さんの通り、永続記録装置(ファイル)に記録することに しました。

その他の回答 (4)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.5

質問のケースに向かないかもしれませんが、簡単なものならば変数を name 属性に 埋め込む方法があろうかと思います。 <input type="submit" name="Q$no" value="next"> クイズを出題する CGI と思ってください。ユーザーが next ボタンを押して、次の 問題を要求したら、サーバーでは現在の出題 no を取り出して、インクリメントして 次の問題を出題するという仕掛けです。このようにすると、ユーザー毎に昇順で問題 を出題することができます。

myfrend
質問者

お礼

勉強になりました。 回答どうもありがとうございます。

  • W_H
  • ベストアンサー率47% (21/44)
回答No.4

Cookieに保存したらどうでしょうか。 確かに確実性という意味では、Cookieを許可していない、ブラウザを閉じると自動削除という設定、手動で削除、などを実行されると消えます。 が、中身に間違った回数を入れ、保存期間を一時間後に設定し、Cookieの中身が三以上なら、Cookieが削除されるまでエラーページに誘導、という手があります。 他には、フォームに間違った回数を同時に送るようにして、三以上になったらCookieを発行、もしくはファイルに時間とホストなどを書き込む、などをすれば、少しは応用が利くのではないでしょうか。 とにかく、一度処理を終了するたびに使っていたデータは削除しないと、他の処理にメモリの容量とかを回せず、サーバーの処理速度が落ちていきます。 一応いろいろな方法があるので、自分にとって楽なのを探してみてください。

myfrend
質問者

お礼

いろいろな方法があるのですね。 勉強になりました。回答ありがとうございました。

  • vsba23895
  • ベストアンサー率58% (18/31)
回答No.3

speedy http://www.daemoninc.com/SpeedyCGI/ というものがあって、(本来は起動を速くするのが目的ですが)、これだとセッションを跨いでも前の情報が消えません。 ただ、その分、初期化すべき変数はきちんと初期化しないと、予想外の結果が返ります。又、レンタルサーバでは設置できないかも知れません。 利用方法は、#! /usr/bin/perl の代りに #! /usr/bin/speedy とするだけで、とても簡単。

参考URL:
http://www.daemoninc.com/SpeedyCGI/,
myfrend
質問者

お礼

speedyは全く知りませんでした。回答ありがとうございます。

  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.1

CGIとも何とも書いていませんが、普通、前回のデータはファイルか データベースなど、どこかに保存しないと無理です。 「データの永続化」の問題です。 有料、無料のデータベース、テキストファイル、DBMと呼ばれる 簡易なデータベースなど、いくらでも方法が有ります。 しかし、中にはCGIの亜種で、データをグローバルに扱うことの できるものもあります。 過去に自分で使ったものでお勧めできるものが無いので、ここで 具体的なソフトウェア名は挙げられませんが。

myfrend
質問者

お礼

回答ありがとうございます。 「データの永続化」というんですね。ファイルに保存しようかと 思います。

関連するQ&A

  • 環境変数の設定

    PerlでCGIを書いています。 環境変数LD_LIBRALY_PATHを設定するのに、 Perlのスクリプト内で、$ENV{LD_LIBRARY_PATH}に値を代入しているのですが、もっとスマートな環境変数の設定法はありませんでしょうか。 残念ながら、httpd.confを書き換える権限は持っていません。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • 現画面のセレクタタグの値を呼び出して使いたい

    ちょっと基本的なことで悩んでしまっているのですが、 セレクタタグにname="selform"という名前を付けて、現画面上で選択されている値を取り出したいのですが、 <script type="text/javascript"> <!--    atai = document.forms[0].selform.value; //--> </script> ここで、このataiをPHPの変数として渡してPHP側で何がしかの処理をしたいのですが、その場合、どのように書けばよいのでしょうか? 御教示願えればと思います。

  • 【 REMOTE_HOSTの値の取得方法について 】

    既製のCGIを設置するのがイッパイイッパイの 初心者ですm(__)m REMOTE_HOSTの値を取得して表示させたいのですが 当方レンタル中のサーバーの初期設定では取得できず 下記の如くの手順で取得するように表示してありましたが どうにも理解できず困っております。 下記の「Perl内」とは何処の事を指しているのか アドバイスを頂きたくお願い申し上げます。 ****以下、該当サーバーの説明文引用***** 【 REMOTE_HOSTの値の取得方法について 】 レンタルサーバーの処理速度を優先して、初期状態ではIPアドレスからDNSの参照をしないように設定している為、REMOTE_HOSTの値を取得したい場合はPerl内で下記の記述をして下さい。 $addr = $ENV{'REMOTE_ADDR'}; $host = gethostbyaddr(pack('C4',split(/\./,$addr)),2) || $addr;

    • ベストアンサー
    • Perl
  • 値の比較を効率よく行う方法を教えてください

    最近、Perlによるプログラミングを始めました。 いろいろ学習していて不明なことがあったので、質問させていただきます。 比較による処理の分岐で、毎回比較する変数名と値は決まっています。 変数には、if文の外でforなどの処理により毎回違う値が格納されています。 このとき、何も考えずに力技で書けば if ($value eq 'aaa' || $value eq 'bbb' || $value eq 'ccc' || $value eq 'ddd' ||・・・){ # 処理 } となると思います。 これでも、処理はできるのですが、比較する値が少ないうちはいいですが、多くなったとき効率が悪いと思います。 それに、スマートではないですし・・・。 これを、効率よく処理なおかつスマートに書ける方法があれば、教えてやってください。 初心者の質問で申し訳ないですが、よろしくお願いします。

    • ベストアンサー
    • Perl
  • パールについて

    CGIでの環境変数を使ってホスト名を取得するときの (($host eq "") || ($host eq $addr)))の文のなかで使われている ||の意味が分かりません。とても初歩的な質問のような気がするのですが教えて頂けませんか。言語はパールです。

    • ベストアンサー
    • Perl
  • switch()文で値の大小比較

    例えば$numという変数の値が50以下の場合、 51以上80以下の場合、81以上の場合の処理と分けたい場合、 switch()文でif()のように値の大小比較をする事は出来ないのでしょうか? 以下のような比較を行いたいです。 (以下は例なので、if()で良いだろうという突っ込みは要りません) switch ($num) { case <= 50: 処理1 case <= 80: 処理2 default: 処理3 }

    • ベストアンサー
    • PHP
  • suとsu -の場合に実行されるスクリプトの違い

    suとsu -の場合でPATH変数の値が変わってきます。 これはどのスクリプトが実行されているからなのでしょうか? スクリプトの内容からは、/etc/profileや、~/.bash_profileではないように思われます。

  • PHPスクリプトでperlスクリプト

    はじめまして。PHP初心者です。助け舟をお願いします。 PHPスクリプトで、formの表示からデータの受け取り→ファイルに書込み→終了画面の表示ができるスクリプトを書くことが出来ました。 これをphpスクリプト1とします。 POSTで受け取った変数を元に処理した変数を返すperlスクリプトがあります。 これをperlスクリプト1とします。 perlスクリプト1をphpスクリプトにすることは私には困難なため、phpスクリプト1のファイルに書き込む前に、perlスクリプト1を実行→返った変数をphpスクリプトで使用しファイルに書込み→終了画面の表示を行いたいです。 こんなことってできますか?

    • 締切済み
    • PHP
  • 変数名をプログラム中で作成して値を取り出す方法

    perlで変数名をプログラム中で作成して、その変数の値へアクセスする方法は、どのようにしたらよいのでしょうか? 例えば以下のスクリプトで、var_valueという変数名をプログラムで生成し、その値「12345」を取り出したい、というものです。 ================================ #! /usr/bin/perl $var_value ="12345"; $tmp1 = "var"; $tmp2 = "value"; $tmp3 = $tmp1."_".$tmp2; # $tmp3にvar_valueという文字列を作成              # print "tmp3 is $tmp3";  # 本当は$tmp3自体ではなく、$var_value=12345を取り出したい。。。 ================================ 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • エクセルマクロ #N/A 値の処理について

    お世話になります。 エクセルVBAにてエクセルデータをSQLServerへロードするプログラムを組んでおります。 文字列変数にinsertクエリを登録し、それを実行する形でロードを行っております。 この時、セル値が通常の値では問題なくDB取込できるのですが、#N/A値の場合処理が途中で 終了してしまいます。 セルの値が#N/Aかを判断する方法はどのようになりますでしょうか。 どうかご教授頂けますよう、よろしくお願いいたします。