CGI-BBS > SO−HO > ショッピングバスケット > ショッピングバスケットV3で在庫が0なのに注文できてしまう。


カレッヂ
カレッヂ


質問者 BIBON  投稿日 2/10(日) 14:03:56
ショッピングバスケットV3を利用して約1年が経ちます。
めったに無いことなのですが、
商品管理ファイル(*.csv)には、ちゃんと在庫数を、
1に設定しておいたのに、なぜか注文が2件来てしまうことがあります。

本来ならば、在庫数が1の場合、複数の人がカゴに入れることは
できますが、注文できるのは1人だけのはずです。

おそらく、注文のタイミングが重なったときに
発生するものと思われますが、
実験的に2台のPCで、同タイミングで注文してみると、
ちゃんと「在庫がなくなりました」といったメッセージが表示され、
何度やってもその現象はおきません。

もしかしたら、注文してくださる方のサーバーの違いにより、
こういった現象がおきるのでしょうか。

自分は、サイトのデザインに合わせるために、
いろいろとHTMLの部分を変更しており、その時に、
いじってはいけない所も変更してしまったのでは?
と思いまして、よく調べてみたのですが、
そういった箇所はありませんでした。

また商品管理ファイルも、よく調べてみたのですが、
間違いは見当たりませんでした。

このところ連続して、こういった不具合が発生し、
注文してくれた方にご迷惑をおかけしています。
どなたかお分かりになる方いらっしゃいましたら、
教えていただけないでしょうか。

なにとぞよろしくお願いいたします。
回答者 呑兵衛@大阪  [削除]  投稿日 2/17(日) 15:00:56
最も簡便に出来る対策ですが、order.cgi の
$lockfile = $tmp_dir . "$in{'_file'}\.lock";

$lockfile = $tmp_dir . "$$\.lock";
にして様子を見てください。

おっしゃる現象は、複数プロセスの同時進行で、ロックファイル名(.csv を除く商品ファイル名)が同じ場合、
sub confirm から sub mail に送られるデータが
<input type=hidden name=\"_ZAIKO\" value=\"$target_file{$code}:$code:$list{$code} で、
sub mail に送られたデータのデコード部分で、他のプロセスが介在できる、
if ($name eq '_ZAIKO') {
push(@ZAIKO_KANRI,$value);
($TARGET_FILE,$CODE,$KAZU) = split(/:/,$value,3);
$ZAIKO_TARGET{$TARGET_FILE} = 1;
}
ことになっているためではないかと推察します。

ここを強化するには、sub confirm で name=\"_ZAIKO\" の部分を一時ファイルにし、
sub mail で他のプロセスのデータを同時進行でため込まないよう、
一時ファイルから読み出す流れを作る必要を感じます。

複数のプロセスの介在は、様々なデータトランザクション(複数サイトからのパケットの並列処理)があるので、いかんともし難いです。
質問者 BIBON  [削除]  投稿日 2/17(日) 16:10:13
呑兵衛@大阪様、本当にありがとうございます。
さっそく、$lockfileのところを書き換えてみました。
しばらくこれで様子をみたいと思います。
どうもありがとうございました。
質問者 BIBON  [削除]  投稿日 3/11(月) 18:15:29
呑兵衛@大阪様
$lockfileのところを書き換えて約1カ月ほど様子を見ていたのですが、
やはり、同じ現象がおきてしまいました。
今回は、在庫が2つの商品に対し、3人の方から注文がきてしまいました。
やはり、以前教えてくださったように、もう少しこの部分を強化しないと
いけないようですね。
しかし自分にはその力がないので困りました・・・・。
回答者 呑兵衛@大阪  [削除]  投稿日 3/14(木) 19:06:36
version up してみるとどうでしょうか。
質問者 BIBON  [削除]  投稿日 3/14(木) 21:36:53
お返事ありがとうございます。
バージョンは最新のv3.42を使っております。
回答者 呑兵衛@大阪  [削除]  投稿日 3/17(日) 21:43:14
検索をかけてみて、重複するアイテムを2つ以上登録していないか確認してみてください。
商品データを更新したときに、重複させる例もあるようです。
それとは別に、最初にお話した、プロセスが複数進行中で商品在庫が一つだけの場合、
一時的にその商品が選択できなくなるバイパスを作る作業もしてみます。
質問者 BIBON  [削除]  投稿日 3/19(火) 18:39:07
お返事どうもありがとうございます。

クエリー検索で調べてみたところ、
商品管理ファイル(*.csv)に設定されている商品コードは、
唯一の値で、重複はありませんでした。

ただ、商品管理ファイルは、
A.01.csv〜A.10.csvの計10個ファイルがあるのですが、
買い物かごを分ける目的で(会計を別にするため)、B.01.csvという
ファイルもあります。
A.01.csvと、B.01.csvで、
一部重複している商品コードがあり、
1つの商品に2注文が届いてしまった商品も含まれていました。
このことが原因なのでしょうか。

現在は、どのファイルに対しても重複がないように変更しました。
よろしくお願いいたします。
回答者 呑兵衛@大阪  [削除]  投稿日 3/19(火) 21:47:53
原因はそれです。掲載されている csv ファイルが違えば、同一商品でも別物として扱うようになっているので
重複を徹底的に根絶してください。
多分それで二重購入は避けられるはずです。
質問者 BIBON  [削除]  投稿日 3/20(水) 13:31:09
お返事どうもありがとうございます。
商品コードの重複を徹底的に無くして、
様子を見てみます。
どうもありがとうございました。

返信(回答)する


Web裏技