CGI-BBS > SO−HO > ショッピングバスケット > ショッピングバスケットV6:明細が無いとなってしまう。


カレッヂ
カレッヂ


質問者 キクちゃん  投稿日 3/30(日) 18:20:15
ショッピングバスケットV6:確認画面で明細が存在するのにが無いとなってしまう。
ショッピングバスケットV6の導入テストと、改造を行っている物です。

未改造で導入出来ましたので、現在ローカルでAn http + active perl を
インストールして、改造を行っております。

テスト中に、削除後何度もリロード繰り返したりしてから、メールアドレスを
入力して確認画面に移動すると、明細が存在するにも関われず、
現在、保留中のご注文はありません。
となってしまいます。
sub mado {
	s/\n//g;
	if (/^#|^$/) { next; }
	if (/^\*(\d+)/ && !$DELETED{$1}) { $DELETED{$1} = 1; $del ++; }
	elsif (/^\*(\d+)/) { ; }
	else { push(@CARGO,$_); }

sub cfm {
	while (<ORDER>) {
	s/\n//g;
	if (/^#|^$/) { next; }
	if (/^\*(\d+)/) { $DELETED{$1} = 1; $del ++; }
	else { push(@CARGO,$_); }

と、削除されたデータのカウントルーチンに差が有りますが、何か意味があるのですか?
sub cfm の判定部分を、sub mado 同じにしたところ、一応動いているようなのです。
CGI(Perl)をはじめて3日ですので、詳しい事がわかりません。VBならば・・・。
この修正は、問題あるのでしょうか?

以下は、そのときの、作業ファイルです。
(商品CD 単価 数量 項目を追加していますので、
標準の形式では有りませんが・・・。)

# Shopping Bascket Pro v6 CART File
# http://www.rescue.ne.jp/cgi/cargo6/
# This is a generated file!  Do not edit.

030330172740	727	商品A	294	1	294
*030330172740
030330172749	727	商品A	294	1	294
030330172957	727	商品A	294	1	294
030330173016	727	商品A	294	1	294
*030330173016
*030330172957
*030330172957
*030330172957
*030330172957
030330173114	788	商品B	316	1	316
030330173120	789	商品C	809	5	4045
030330173222	789	商品C	809	5	4045
030330173306	789	商品C	809	5	4045
*030330173222
*030330173306
030330173605	841	商品D	1790	1	1790
*030330173605
*030330172749
030330173745	727	商品A	294	1	294

プロバイダ参照:http://localhost/
サーバのOS:WINサーバ
パソコンのOS:WinNT系
エディタ:秀丸
FTPソフト:FFFTP
サーバ移転:していない
改造:している 改造前正常動作
CGI習熟度:firsttime

回答者 呑兵衛@大阪  [削除]  投稿日 4/1(火) 20:15:23
setup.cgi の $domain $path を外部サーバー用に設定されていませんか?
手元でのテストではサーバーはローカルですから 192.168.***.*** などに
しなければなりません。
質問者 キクちゃん  [削除]  投稿日 4/2(水) 09:56:40
呑兵衛@大阪 様、回答ありがとうございます。

早速設定してみましたが、別の原因の様で
かごの中身は3明細表示されるのに、
メールアドレスを入力し次に進と、
「現在、保留中のご注文はありません。」でした。

自分でもリファレンス片手にがんばって調べています。

sub mado { の方では、先頭が*で始まる行で、かつ $DELETED{} のフラグが立っていない
物のみをカウントしているのに、
sub cfm { の方では、先頭が*で始まる行をすべてカウントしている様で
差が生じているような気がします。
(データ上、同一の商品を削除しているデータが複数存在して、有効なデータ件数と、
削除マークのついたデータ件数が同じになると発生する気がします。)

正規表現とかが難しくて理解しきれていないので、間違っているかもしれません・・・。
質問者 キクちゃん  [削除]  投稿日 4/2(水) 10:06:45
たびたびすみません。
設置ミスかと思って公式ページのサンプルで試してみました。

http://www.rescue.ne.jp/cgi/cargo6/sample/
に有るサンプルで、
1 例1)の商品を 1個かごに入れる。
2 例1)の商品を 1個かごに入れる。
3 バスケットの画面で1個削除する
4 バスケットの画面をリロードする
5 次へ で、注文処理を進める

をすると、同様の状態になるので、setup.cgiの問題では無いかもしれません。
回答者 呑兵衛@大阪  [削除]  投稿日 4/2(水) 18:19:25
これは cookie に関連しています。
$nossl = 'http://path/to/cgi/file';
$ssl   = 'http://path/to/cgi/file';
$domain = "";
$path = "/";
以上4項目がローカル上の設定になっているか確認ください。
質問者 キクちゃん  [削除]  投稿日 4/4(金) 09:05:37
毎回無くなる訳ではいので、クッキーは疑っていませんでした。
削除後のリロードを行わない場合は、最後までちゃんと動作します。

setup.cgi の設定は、最初は、

$nossl = 'http://localhost/cgi-bin/cart.cgi';
$ssl = 'http://localhost/cgi-bin/cart.cgi';
$domain = "";
$path = "/";
でした。

前回の回答で
$nossl = 'http://localhost/cgi-bin/cart.cgi';
$ssl = 'http://localhost/cgi-bin/cart.cgi';
$domain = "localhost";
$path = "/";
に変えてみましたが、同じ症状が出ます。

回答者 呑兵衛@大阪  [削除]  投稿日 4/4(金) 10:16:13
商品.html の子ウィンドを作る JavaScript を変えていませんか?
function Cart(){
window.open("","Cart","location=no,status=yes,toolbar=no,menubar=no,scrollbars=yes,resizable=yes,width=550,height=450");
}
の toolbar=no を toolbar=yes にして子ウィンド上でリロードボタンを操作していませんか?
作業ファイルは追加書き込みになっているので、削除できる商品がなくなっていれば削除できないはずで、
削除記録ができるはずはありません。
5行続く削除記録までで、4つしか購入していないのに削除は6つ記録されている。

質問者 キクちゃん  [削除]  投稿日 4/4(金) 12:36:12
JavaScriptは、変更しておりませんが、リロード操作は行っております。

ブラウザーに タブ形式の opera  を使用してみると
ふつうにリロードが出来ます。
また、IEなどでも、F5キーなのでリロードはかけられるので、
複数の削除記録を作ることが出来ました。
(未改造のcart.cgi + IE 5.5 sp2)で作業ファイルをのぞいて確認。

(http://www.rescue.ne.jp/cgi/cargo6/sample/ のサンプル + IE5.5 F5のリロードで
カート内には明細が有るのに、確認画面では「現在、保留中のご注文はありません。」
となりました。(作業ファイルは覗けないので、実際に複数の削除記録が有るのかは不明)
回答者 呑兵衛@大阪  [削除]  投稿日 4/4(金) 14:10:07
プログラムはリロード対策していなかったですねぇ。では対応しましょう。

りろーど対策
その1
sub mado
以下を追加
<meta http-equiv="Refresh" content="0">

sub delete
以下に変更
    if (!-e $tmp) { &error("設定エラー","作業用ファイルを展開するフォルダが見つかりません。"); }
    if ($COOKIE{'CART'} eq '') { &mado; }
    if (open(ORDER,"$tmp$COOKIE{'CART'}\.bk6")) {
        while (<ORDER>) {
            s/\n//g;
            if (/^#|^$/) { next; }
            if (/^$delete_gcode/) { $i++; }
            elsif (/^*$delete_gcode/) { $d++; }
        }
        close(ORDER);
    }
    if ($i > $d) {
        if (!open(FILE,">> $tmp$COOKIE{'CART'}\.bk6")) {
            &error("!設定エラー","作業用ファイルを展開するフォルダのパーミッションが正しく設定されていません.");
        }
        print FILE "\*$delete_gcode\n";
        close(FILE);
    }
    &mado;

商品の取消しはこれでいいですが、商品が追加されるリロードはサーバー間のアクセス時間に
影響があるので、もう少し工夫が必要です。が、まぁこのあたりで。
質問者 キクちゃん  [削除]  投稿日 4/5(土) 08:49:49
解決出来ました。
ありがとうございました。

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


Web裏技