本の貸出システムを作っていまして、貸出処理も返却処理も作成し、本の貸出登録後、F5キーなどを押すと「このページを再表示するには以前送信した~~~」とアラートが出て、「再試行」をクリックすると返却処理をしてしまうのですが、これを誤って「再試行」押してしまっても貸出処理を行わないようしたいのですが、どのようにしたら良いのでしょうか?また、別の方法はありますでしょうか?
必要があればソースコード載せます。
上司の方から「CGIが全く同じパラメータで連続して呼ばれるわけですから、CGI側で前どんな処理をしたかを覚えておけば、2度目以降をはじくことはできるはずです。」と言われたのですがそのやり方が良く分かりません。
あとかろうじてリロード対策でWalrus::Session::Liteを使うという所まで分かり、一応試しにhttp://d.hatena.ne.jp/d4-1977/20050706/1120670844のと同じサンプルを作ってみたのですが、15行目のmy @ID = tied(%session_data)->list_session_id;
の所でエラーで引っかかりCan't call method "list_session_id" on an undefined value at /usr/local/apache2/cgi-bin/test.cgi line 15, <DATA> line 64. というエラーを吐き出すのですが、経験者の方で原因がお分かりになる方はいらっしゃいますでしょうか?
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
気軽に答えてるので参考程度にしてください。
えっと、貸出登録後にリロードすると返却処理をするということは、
貸出処理と返却処理は同じロジックを使ってるってことですかね?
「貸し出されてた場合は返却、返却されている場合は貸出」なのかな?
ご指定のようにセッションに保存してチェックしても良いでしょうし、
最初の処理の前に一意のキーみたいなものを用意できるのであれば、
そのキーが一致した場合には処理しない、みたいにもできるでしょう。
(その処理以前に生成しないと、リロードで別のキーが生成されちゃいますけど)
で、私のよくやる回避策ですが、
貸出処理を行った後、Locationを別の画面、例えば「完了しました」と表示
するだけの画面にとばしちゃいます。で、この画面では何の処理もしません。
この画面をリロードしても何の問題も無いですからね。
Walrus::Session::Lite は、ちょっと使ったことありましたけど忘れちゃいました。
ごめんなさい。
他にもCGI::SessionやApache::Sessionも探してみてください。
ちなみに私は上記3つとも、アクセスが集中した時に誤動作を起こしたので、
セッション管理は自前でシンプルに行ってます。
この回答への補足
kt_yuka様ありがとうございます。
>>貸出処理と返却処理は同じロジックを使ってるってことですかね?
という事ですが貸出中か貸出可能かという「状態」という列を作成してものをDB登録させてif文で状態が貸出中なら返却処理を貸出可能なら貸出処理をしているという状況です。
また、別の方法でフラグを立てるやり方もあるみたいで、
最初の状態=まだ押していない状態=貸し出し処理をしていない、
DBは貸し出しフラグ「0」の状態のはず。ここでボタンが押されたら、貸し出し処理。貸し出しフラグ「1」を記録する。
ここで、ユーザーが2度押しというか更新ボタンを押したとする。
しかし、DBには貸し出しフラグ「1」がすでに記録されているはず。
だから、「あなたはもう借りてるよ」とか出して
やればいい。みたいな事も言われましたが、自分の書いたコードでは全く意味がなく歯が立たないです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- CGI (フリーの)ツリー掲示版CGI、昔は多用させてもらいましたが・・今セキュリティ上どうでしょう? 2 2023/06/25 07:18
- 消費者問題・詐欺 駐車場調べ隊というサイトで、会員登録してましたが 無料期間で退会するためサイトで申し込みしたところ 2 2023/06/03 23:22
- CGI htmlからcgiを自動的に起動させたい 1 2023/02/21 19:39
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- その他(データベース) c言語の問題です。これを踏まえてコーディングしたいのでおしえていただきたいです。 3 2023/08/03 09:27
- デスクトップパソコン 「自動修復でPCを修復できませんでした」と表示されPCが起動しないのですが対処法はありますか? 5 2022/05/13 09:16
- 美術・アート トレパク疑惑をかけられにくくするには ここ最近いわゆるトレパク警察のいいがかりがが厳しくなったようで 1 2023/08/21 09:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
どう増強すべきか
-
シェルスクリプトでファイル内...
-
iPhoneのニューラルエンジンっ...
-
Functionで戻り値を複数返す方法
-
private subモジュールを他のモ...
-
VCでビープ音を鳴らし続ける
-
フォルダのアクセス権確認について
-
VBA Column型は存在しないの?
-
StatusStripの表示が更新されな...
-
エクセル画面のちらつきなくす...
-
エクセルVBAでプロシージャ名を...
-
特定の名前のオートシェイプの...
-
マクロで、次のコードへ行く前...
-
特定のファイルを他のプロセス...
-
VBAでのマクロ実行中のオーバー...
-
ExcelのVBAで、選択したファイ...
-
【VBA】エラー処理で別プロシー...
-
ASP.NETで特定のページだけ文字...
-
For ~ Next文
-
時間間隔の計算方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
IF文に時間(何時から何時ま...
-
private subモジュールを他のモ...
-
シグナル 6(SIGABRT)とは?
-
Functionで戻り値を複数返す方法
-
特定の名前のオートシェイプの...
-
ExcelのVBAで、選択したファイ...
-
マクロで、次のコードへ行く前...
-
どう増強すべきか
-
VBA 複数の行を高速で削除する...
-
Excel VBA セルの名前があるか...
-
特定のファイルを他のプロセス...
-
Word VBA。各マクロの間に待ち...
-
どうやってもFor文を抜けてしま...
-
【VBA】エラー処理で別プロシー...
-
エクセル VBAで複数セル選択時...
-
シェルスクリプトでファイル内...
-
【Vb.net】プリンタジョブの取得
-
vbaのエラー対応(実行時エラー...
-
VBAでBook読み込み時の非表示方...
おすすめ情報