CGI-BBS > SO−HO > ショッピングバスケット > ショッピングバスケットver3 在庫数チェック の強化をしたい


カレッヂ
カレッヂ


質問者 PON  投稿日 10/26(日) 17:41:12
ショッピングバスケットver3の試験中なのですが
予約販売などで同じ商品に注文が一斉に入ってしまう場合のために、
デフォルトのserch.cgiで表示してある時点と、申し込みの最終確認の2回の他に
お客様情報入力画面に進む際、最終確認画面に移動する際の2カ所にチェックを入れたいと思っておりますが
なかなかうまく出来ないでおります。

また、注文申し込みの際に、ブラウザ2つ使ってちゃんと在庫数チェックが昨日するかテストしてみたのですが
一度は「商品コード〜は在庫数がゼロになりました」と表示がでるのですが、
ブラウザのバックボタンでcargo.cgiの所まで戻って
再度注文ボタンを押すと、注文出来てしまいます。
こちらの誤動作(?)を防ぐ方法は無いものでしょうか。
一つの質問欄で2つの質問となってしまい申し訳ございません。
どなたかおわかりになる方がいらっしゃいましたらご教授くださいませ。

プロバイダ参照:
サーバのOS:UNIXサーバ
パソコンのOS:Mac9
エディタ:JEDIT
FTPソフト:fetch
サーバ移転:していない
改造:していない
CGI習熟度:middle

回答者 呑兵衛@大阪  [削除]  投稿日 10/27(月) 14:46:49
このバージョンの「在庫が減る」前提は、
最終段階の注文をし、メール送信されるまで完了している、
ことです。途中は常に在庫量を確認しながら進行していきます。
なので、おっしゃるような動作で二重注文ができることはありえないでしょう。
また途中でスクリプトが確認した在庫量を表示することは可能ですが、
どのセッションにおいても注文が完結することで在庫が変動するので、
それが表示を見ている人に、その注文なり在庫を保証するものではないので、
その表示に意味はないと思います。
質問者 PON  [削除]  投稿日 10/27(月) 15:28:41
呑兵衛@大阪 さん、早速のご返信ありがとうございます。
私も、理屈では出来ないと思っていたのですが、
やはり一旦「商品コード〜の商品は在庫が無くなりました」の表示が一度出た後、
ブラウザで2つ前の画面まで戻ると、在庫がないはずの商品が注文出来てしまいます。
今回はMacとwin2台使ってテストしてみたのですが
やはり注文出来てしまいました。
cgiはダウンロードして、setup.plで設定をした以外は元のままなのですが...

原因がわからなくて困っております。
cookie使用のカートなので、ルータでグローバルIPアドレス→ローカルと割り振ってあっても
関係ないですよね...
テストするお時間がございましたらお試しいただければ幸いです。

お手間かけまして申し訳有りません。
質問者 PON  [削除]  投稿日 10/27(月) 15:49:25
訂正事項です

最初の質問の際に、「cargo.cgiまで戻って」と記載してありますが
正しくは「《ご注文フォーム》」の表示(メールアドレスなどを入力する画面)のページ
でした。
宜敷お願いいたします。
回答者 呑兵衛@大阪  [削除]  投稿日 10/28(火) 10:40:02
setup.pl の $viewzaiko を 0 にしていると商品ファイル上の在庫は減りません。
確認してください。
それから、多分それはブラウザのキャッシュの動作ではないかと推察します。
キャッシュを空にして再確認してください。
質問者 PON  [削除]  投稿日 10/28(火) 11:49:24
たびたびのご返信ありがとうございます。

最初から説明し直しますね。
まず、インターネットエクスプローラー(以後IE)とネットスケープ(以後NC)を起動します。

それからそれぞれのブラウザで
search.cgi?file=A.01にアクセスします。
在庫管理機能をONにして、在庫数を1にした同じ商品をIEとNCでそれぞれカゴに入れます。

そしてcargo.cgi→order.cgiへとIE、NCそれぞれのブラウザで進みます。

《ご注文フォーム》表示の画面にて、IE、NCそれぞれ必要事項を入力します。
そうしましたら<<お申し込みの最終確認>>という表示の画面に移ります。

そして、IE、NCそれぞれ「○この申し込みの実行」ボタンをクリックしますと
javascriptポップアップウインドウで「注文申し込みをしますが、よろしいですか?」
というメッセージがIE、NCそれぞれで表示されます。

NCで先にOKボタンをクリックすると、当然、

”受け付けしました
ただ今ご記入された内容を電子メールで送信しました。
次の内容は写しですので、お控えください。”

の表示になり、オーダーは通ります。
IEの方はNCよりあとでOKボタンをクリックしたので、
こちらは
”
在庫エラー
商品コードA01-00001の商品は在庫が無くなりました.
画面を戻して当該商品を削除してください.

[直前の画面に戻る]

”
との表示が出ました。

ここで、[直前の画面に戻る]をクリックして前の画面
(《お申し込みの最終確認》の表示画面)に戻ります。

ここでさらに[前の画面に戻る]をクリックして
もう一つ前の画面(《ご注文フォーム》)の表示画面に戻ります。

そこで、「申し込みの最終確認」ボタンをクリックします。

再度、《お申し込みの最終確認》
の表示画面に移動します。

そこで、”○この申し込みの実行”ボタンをクリックすると、
先ほどのポップアップウインドウが再度でます。
そしてOKをクリックすると注文が通ってしまいます。

尾のように動作しております。

IEで在庫エラーが出た後に、キャッシュをクリアしても同様の症状となっておりますのでキャッシュのせいでは無いようですがはっきりとはわかりません。

この症状が出ると、csvデータの上で在庫が0になっているのにもかかわらず、
注文が通ってしまいますので、トラブルのおそれがあります。

何度もおつきあいいただきまして本当に申し訳ございません。
宜敷お願いいたします。
回答者 呑兵衛@大阪  [削除]  投稿日 10/28(火) 19:54:42
在庫管理のスクリプト部分が抜け落ちてましたねぇ。
order.cgi の sub confirm の「#画面出力開始」以前の部分で

    foreach $zaiko_file (keys %ZAIKO_TARGET) {
        @NEW = ();
        if (!open(IN,"$base_dir$zaiko_file\.csv")) { &error('エラー',"$zaiko_fileがオープンできません."); }
        @lines = <IN>;
        close(IN);

        foreach $line (@lines) {
            $line =~ s/\n//g;
            $zaiko = '';
            ($code,$name,$tanka,$tax,$rem,$url,$zaiko,$type) = &DecodeCSV($line);
            if ($zaiko =~ /\d+/ && $zaiko ne '') {
                foreach $target (@ZAIKO_KANRI) {
                    ($TARGET_FILE,$CODE,$KAZU) = split(/:/,$target,3);

                    $old = $zaiko;
                    if ($CODE eq $code && $zaiko == 0) { &error("在庫エラー","商品コード$codeの商品は在庫が無くなりました.",'画面を戻して当該商品を削除してください.'); }
                    if ($CODE eq $code) { $zaiko = $zaiko - $KAZU; }
                    if ($zaiko < 0) { &error("在庫エラー","商品コード$codeの商品が在庫数($old)を上回る数($KAZU)をご選択されています.",'画面を戻して当該商品を削除してから、改めて商品をご選択ください.'); }
                }
            }
        }

    }

を追記してください。Rescueさんには伝えておきます。
回答者 rescue  [削除]  投稿日 10/28(火) 21:27:49
この度は貴重なレポートありがとうございました。
呑兵衛@大阪さんのご指摘の通り挿入ください。
ただそれでもさらにもう一ページ戻って進んでしまうと注文できてしまうことが
判明しましたので、order.cgi中に2箇所ある下記の修正をしてください。

if ($zaiko{$code} =~ /\d/ && $zaiko{$code} > 0) { print "<input type=hidden name=\"_ZAIKO\" value=\"$target_file{$code}:$code:$list{$code}\">\n"; }

↓

print "<input type=hidden name=\"_ZAIKO\" value=\"$target_file{$code}:$code:$list{$code}\">\n";

修正したものはできれば本日中修正版として告知したいと思います。
質問者 PON  [削除]  投稿日 10/29(水) 17:19:38
呑兵衛@大阪  さん、気長におつきあいしていただきましてありがとうございました。
RESCUEさんが書き直した物をダウンロードさせていただきました。
こちらで当初の「在庫管理機能の強化」及び「誤動作」の両方とも解決いたしました。
お二方の迅速な対応に大感激です。
本当にありがとうございました。

このページは終了したので返信(回答)は書きこめません
 


Web裏技