CGI-BBS > SO−HO > ショッピングバスケット > V6.09の改造でCookieが有効になっていないことを知らしたい。


カレッヂ
カレッヂ


質問者 k-taro  投稿日 2/21(金) 18:10:24
caig.cgiの始めのところに

++$countNum;
if($countNum>1 && !$ENV{'HTTP_COOKIE'}){&error("Cookieを有効にしてください。");}

と記述しましたが、期待通りには表示しません。
何処が悪いのでしょうか?
教えてください。

プロバイダ参照:
サーバのOS:UNIXサーバ
パソコンのOS:Mac9
エディタ:Jedit
FTPソフト:Fetch3.0.3J1
サーバ移転:していない
改造:している 改造前正常動作
CGI習熟度:middle

回答者 呑兵衛@大阪  [削除]  投稿日 2/22(土) 19:34:04
cart.cgi がcookie を発行しますが、保存されているかどうかがわかるのは、プログラム上最終確認の時点ですよね。
そもそも ++$countNum; が何によって動くのかわかりません。
cookie データは一度同じドメイン同じディレクトリからHTML出力した後、
そのデータがあるかどうかを、次にアクセスしたとき、$ENV{HTTP_COOKIE}が拾いますので、
最初にかごが表示された段階で評価するにはちょっとしんどいです。
買い物をした後ですと、cookieデータを出力するためHTMLを再出力しなければなりませんので、
一時買い物データを保存するかまたはFORMで再出力する作業がいります。
商品.html がcart.cgi と同じディレクトリにおけるのなら、商品.html に<meta>タグでcookie を記述することも可能です。
cookie認識するかどうかのテストプログラムを別途もうけたほうが早いかと。
質問者 k-taro  [削除]  投稿日 2/22(土) 21:02:08
>cart.cgi がcookie を発行しますが、保存されているかどうかがわかるのは、
>プログラム上最終確認の時点ですよね。
最初にcookieの判断をせず、2回目にしようかと考えました。
ご指摘のように、最初から判断するプログラムにすべきです。
cari.cgiにデータが渡された時点で$countNumがカウントされると考えました。
これで二回目に判断するかなと・・・。(そもそも間違いでした。)
それでも$countNum>1にすればcookieがセットされたのが分かるかなと思ったのですが、
無理のようですね。

>そもそも ++$countNum; が何によって動くのかわかりません。
全く機能しませんでした。

><meta>タグでcookie を記述することも可能です。
初回から認識させるには、cart.cgiにデータを渡す段階でcookieの判別できるデータを
渡すべきですね。

>cookie認識するかどうかのテストプログラムを別途もうけたほうが早いかと。
いろいろ試してみます。
回答者 呑兵衛@大阪  [削除]  投稿日 2/23(日) 19:59:06
cookie を発行するスクリプトが異なる path を指定してもサーバーが無視すると思い込んでいたけれど
大間違いでした。指定の通りに cookie を食わせることができました。
テストしてみて下さい。
http://www.kosei.nu/cargo608/index_t.html

商品.html
<meta http-equiv="Set-Cookie" content="name=COOKIE_TEST; domain=www.hogehoge.com; path=/cgi-bin/shopping;">

cart.cgi
cookie のデコード部分
if ($key eq "$ENV{'SCRIPT_NAME'}:0" || $key eq "$ENV{'SCRIPT_NAME'}:1") {
  ::::
}
の後で
elsif ($key eq 'name') { $COOKIE{$key} = $val; }

デコードが終わったあたり
$COOKIE{'CART'} =~ s/\D//g;
の後で
if ($COOKIE{name} !~ /COOKIE_TEST/) { &error('エラー','COOKIEを送ったのに...食べてよ!','3'); }

setup.cgi sub error で
if ($msg[0] =~ /^!/) { $back = 1; $msg[0] = substr($msg[0],1); }
の次に
if ($msg[2] =~ /^\d$/) { $go_back = 1; pop(@msg); }
追記と変更
if ($go_back) { print qq#<a href="JavaScript:window.close()">画面を閉じる</a>\n#; }
else {
print qq#<a href="$nossl\?" target="_self">カートに戻る</a>\n#;
print qq#&nbsp;|&nbsp;\n#;
print qq#<a href="JavaScript:window.close()">画面を閉じる</a>\n#;
}

回答者 呑兵衛@大阪  [削除]  投稿日 2/23(日) 20:04:35
path の指定は cart.cgi のあるディレクトリを指定すること。
質問者 k-taro  [削除]  投稿日 2/24(月) 13:23:24
色々お教えいただき有難う御座いました。
スクリプト自分で作ろうかと思いましたが、
多分出来なかったかもしれません。
早速参考にさせていただきます。

有難う御座いました。

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


Web裏技