家・車以外で、人生で一番奮発した買い物

ととろさんのところを(http://tohoho.wakusei.ne.jp/www.htm)みながら、なんとかPerl・CGIを勉強しているところです。

普通にフォームに入力されたものをログファイルにとる、などはできるようになったのですが、
どうしてもクッキーのところでつまづいてしまいます。

Cookie書き込みの例、のところに、
Set-Cookie: NAME=tanaka; Fri, 31-Dec-2030 23:59:59;
とやったら、tanakaというクッキーが作成されるのでしょうか?

どうしてもこの辺がわからないのです。

これを実行する場合、

#!/usr/local/bin/perl

print "Content-type:text/html\n";
print "Set-Cookie: NAME=tanaka; Fri, 31-Dec-2030 23:59:59;"
print "\n";

のようにやるのですか?
最終的にはフォームの入力値を取得・反映したいと考えているのですが…。
あちこちわかりやすいと言われるcgi・PERL解説サイトをみたのですが、どうしてもここだけが理解できませんでした。

A 回答 (4件)

Set-Cookie: クッキー名=値; 有効期限


なので、tanakaという名前のcookieを作るのでしたら
Set-Cookie: tanaka=namae:hoge; 有効期限
ですね。

あと、
print "Content-type:text/html\n";
print "Set-Cookie: NAME=tanaka; Fri, 31-Dec-2030 23:59:59;"
print "\n";
は、惜しくも2行目に改行が足りないです。

>最終的にはフォームの入力値を取得・反映
get_cookie はフォーム値のデコードと似ています。
反映させるには
<input type=text name=namae value=$COOKIE{'namae'}>という感じです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

アドバイスをいただいたように変更してみました。

#!/usr/local/bin/perl

print "Content-type:text/html\n";
print "Set-Cookie: tanaka=namae:hoge; Fri, 31-Dec-2030 23:59:59\n";
print "\n";

print "<input type=text name=namae value=$COOKIE{'namae'}>";

exit;



※tanaka=namae:hogeの「hoge」って何でしょうか?

この場合、フォームのところは別のファイルで操作してフォームのアクションで、このcgiを選択すると、その情報がクッキーに入るのですか?

1.名前入力フォーム表示
(1回目だったら名前を入力してもらう。2回目以降なら表示させる。)
2.ボタンを押すとログファイルに名前を残す。
というようにしたいのです。

お礼日時:2002/10/30 17:03

>print "Set-Cookie: tanaka=NAME:hoge; Fri, 31-Dec-2030 23:59:59\n";


>で、「tanaka」というファイル名で、「NAME=hoge」という値が

解釈はOKですが、正確には「NAME:hoge」ですね。

>かいてあることはきちんと合っていますでしょうか?

テストされてみましたか?
たぶん、書き換えが上手くいかないのではないでしょうか。
それはフォーム値のデコードが行われていないからです。
# 転記してないだけかもしれないですが

デコードに関しては別件になるので、参考URLを入れておきます。
これが理解できれば、getcookieが何をしているのかよく解ります。

HTML部分はあまりきちんと見ていませんが、
スクリプトを一度に全部を実行するのではなく、
cookieの取得 → 値の確認 → HTMLへの代入 などのように
少しずつ切り分けて確認することをオススメします。
でないと、どこで不具合が起きているのか判別しづらいですからね。

欲しい値が、意図したところに入っているか、
少しずつprintして確認してみましょう。


>C\Documents and Settings\user名\Cookies\user名@****.txt
>として保存されるんですよね?(win2000です。)
>この****の部分がさきほど設定した「tanaka」となるわけではないのでしょうか?

このあたりは環境/ブラウザの仕様によるようです。
win2kでも、Netscapeなら
C:\Program Files\Netscape\Users\USER_NAME\cookies
に、まとめて記述されます。

>保存されている「回数」を一旦リセットしたい場合

&clearCookie を使うか、0を代入する形でいいのではないかな、と思います。

参考URL:http://metuocgi.virtualave.net/nihongo1.html
    • good
    • 0

> >前の質問にも回答しましたがご覧になっていませんか?


> もちろん読まさせていただきました。

こういう場合(1つの事例で複数の質問を立てる時)は、前回のURLを入れておくといいですね。
そうすれば同じ回答を繰り返して遠回りをすることもないですし、
前回答えた人も答え甲斐があり、気持ちがいいです。
何より、情報の共有・資源の活用になります。

余談でした。
さて、自分も結構cookieには苦しみましたので...

>※tanaka=namae:hogeの「hoge」って何でしょうか?

例えば、namaeというformにhogeさんが名前を入力します。
<input type=text name=namae>

この「namaeというformにはhogeという値」というモノをcookieに保存するには?
まず、自分のスクリプト用のcookieの名前が必要になります。
それが、NAMEの部分です。
ここでは「tanaka」というクッキー名にしましょう。

次に、「tanaka」という名前のクッキーに、モノを保存します。
保存したいモノを「名前:値(namae:hoge)」とセットにして、全体をtanakaというcookieに入れます。
それが Set-Cookie: tanaka=namae:hoge; 有効期限 という例文です。
cookieにとっての名前はtanaka、値はnamae:hogeです。

そしてget_cookieの時は、これ(tanaka=namae:hoge; 有効期限)を分解するわけです。
詳しくは割愛しますが、ログ保存の前のデコードと構文は似ています。

最終的に$COOKIE{'namae'}の中に、hogeという値が入っていれば、
<input type=text name=namae value=$COOKIE{'namae'}>
とすることで、textboxの中に表示される、というわけです。

長文失礼しました。ご参考までに。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>こういう場合(1つの事例で複数の質問を立てる時)は、前回のURLを入れておくといいですね。

前回のをかいておくと逆にまたわかりづらくなるかな、と思って避けてしまってました。
配慮が足りませんでした。すいません。

「hoge」というのは値なんですね。
最終的にはここをフォームのテキストボックスの値、というようにしてやればいいんですよね。


今現在以下のようなことでテストをしています。
----------------------------------------
#!/usr/local/bin/perl

print "Content-type:text/html\n";
print "Set-Cookie: tanaka=NAME:hoge; Fri, 31-Dec-2030 23:59:59\n";
print "\n";

exit;
----------------------------------------
で、「tanaka」というファイル名で、「NAME=hoge」という値がセットされるんですよね?


----------------------------------------
#!/usr/local/bin/perl

#
# Cookieの値を得る
#

&getCookie();
$time = $COOKIE{'KAISUU'};
if ($time eq "") {
$time = 1;
}
$date = $COOKIE{'HIZUKE'};
if ($date eq "") {
$date = "???";
}
$name = $COOKIE{'NAME'};
if ($name eq "") {
$name= "???";
}

#
# 書き込むCookieの値を得る
#
$time_new = $time + 1;
($sec, $min, $hour, $mday, $mon, $year) = localtime();
$date_new = sprintf("%04d/%02d/%02d %02d:%02d:%02d",
$year + 1900, $mon + 1, $mday, $hour, $min, $sec);
$name_new=$name;

#
# ページを表示する。
#
print &setCookie("KAISUU", $time_new);
print &setCookie("HIZUKE", $date_new);
print &setCookie("NAME", $name_new);
print "Content-type:text/html\n\n";
#print "Set-Cookie:NAME=chc; Fri, 29-Oct-2002 23:59:59\n";
#print "\n";
print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE>Cookie Test</TITLE>\n";
print "</HEAD>\n";
print "<BODY TEXT=black BGCOLOR=white>\n";
print "<HR>\n";
print "<H3>読み込んだCookieの値(整形前)</H3>\n";
print "HTTP_COOKIE = $ENV{'HTTP_COOKIE'}\n";
print "<HR>\n";
print "<H3>読み込んだCookieの値(整形後)</H3>\n";
print "これまでの訪問回数:$time<BR>\n";
print "前回の訪問日:$date<BR>\n";
print "お名前:$name_new<BR>\n";
print "<HR>\n";
print "<H3>書き込んだCookieの値</H3>\n";
print &setCookie("KAISUU", $time_new);
print "<BR>\n";
print &setCookie("HIZUKE", $date_new);
print "<BR>\n";
print &setCookie("NAME", $name_new);
print "<HR>\n";
print "リロードしてみてください。\n";
print "一度ブラウザを終了させても、値が保存されています。\n";
print "</BODY>\n";
print "</HTML>\n";

#
# Cookieの値を読み出す
#
sub getCookie {
local($xx, $name, $value);
foreach $xx (split(/; */, $ENV{'HTTP_COOKIE'})) {
($name, $value) = split(/=/, $xx);
$value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
$COOKIE{$NAME} = $value;
}
}

#
# Cookieに値を書き込むためのSet-Cookie:ヘッダを生成する
#
sub setCookie {
local($tmp, $val);
$val = $_[1];
$val =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
$tmp = "Set-Cookie: ";
$tmp .= "$_[0]=$val; ";
$tmp .= "expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
return($tmp);
}

#
# Cookieを削除するためのSet-Cookie:ヘッダを生成する
#
sub clearCookie {
$tmp = "Set-Cookie: ";
$tmp .= "$_[0]=xx; ";
$tmp .= " expires=Thu, 1-Jan-1980 00:00:00 GMT;\n";
return($tmp);
}
----------------------------------------

として中身を呼び出しています。
かいてあることはきちんと合っていますでしょうか?

(とほほさんのところを拝借させていただいています。)




この時保存されたクッキーというのは、
C\Documents and Settings\user名\Cookies\user名@****.txt
として保存されるんですよね?(win2000です。)
この****の部分がさきほど設定した「tanaka」となるわけではないのでしょうか?
また、ここで保存されている「回数」を一旦リセットしたい場合はどうすればいいのでしょうか?

お礼日時:2002/10/31 09:30

前の質問にも回答しましたがご覧になっていませんか?


これから書くことは前の回答とほぼ同じ内容です。

Cookieについてはこちらの方がわかりやすいかもしれません。
http://www.futomi.com/lecture/cookie/index.html

このサイトの例としては
print 'Set-Cookie: CookieTest=%83e%83X%83g; expires=Tue, 01-May-2001 11:32:58 GMT;';
print 'Content-Type: text/html',"\n";
print "\n";
とContent-Typeの前に書かれています。

>Cookie書き込みの例、のところに、
>Set-Cookie: NAME=tanaka; Fri, 31-Dec-2030 23:59:59;
>とやったら、tanakaというクッキーが作成されるのでしょうか?

正確にはNAMEというのがクッキー名です。これをパラメータ名(変数)としてtanakaというデータが入っていると考えてください。

Cookieの読み込みはとほほさんのサンプルソースが参考になると思います。

あとはPerl標準のCGI.pmというPerlモジュールを使うとより簡単にCookieの設定が出来ます。
連想配列とかもCookieにセットできます。

http://member.nifty.ne.jp/hippo2000/perltips/Cgi …
http://member.nifty.ne.jp/hippo2000/perltips/CGI …
http://www.itboost.co.jp/perl/perl_10.php
http://www13.cds.ne.jp/~ohsaru/perl/cgipm.html

ととろさんではなくとほほさんなのでは・・・。
    • good
    • 0
この回答へのお礼

再度回答ありがとうございます。

>前の質問にも回答しましたがご覧になっていませんか?

もちろん読まさせていただきました。
ただ以前はいろいろとつけて質問したがために自分でわからなくなってしまったので、今回はシンプルに質問をしてみたんです。
少しずつ進めていこうと思って…。

>Cookieの読み込みはとほほさんのサンプルソースが参考になると思います。

みてみたのですが、とてもたくさんあって、ひとつひとつみてはいるのですが、まだまだ理解が及ばない状態です。
日付のところとかがなんとかわかる程度です。

>あとはPerl標準のCGI.pmというPerlモジュールを使うとより簡単にCookieの設定が出来ます。
>連想配列とかもCookieにセットできます。

試してみます。

>ととろさんではなくとほほさんなのでは・・・。

そのとおりです(恥)。すいませんとほほさん…。
いつもお世話になっているのに…。

お礼日時:2002/10/30 17:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!