ととろさんのところを(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解説サイトをみたのですが、どうしてもここだけが理解できませんでした。
No.1ベストアンサー
- 回答日時:
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'}>という感じです。
回答ありがとうございます!
アドバイスをいただいたように変更してみました。
#!/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.ボタンを押すとログファイルに名前を残す。
というようにしたいのです。
No.4
- 回答日時:
>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
No.3
- 回答日時:
> >前の質問にも回答しましたがご覧になっていませんか?
> もちろん読まさせていただきました。
こういう場合(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の中に表示される、というわけです。
長文失礼しました。ご参考までに。
回答ありがとうございます。
>こういう場合(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」となるわけではないのでしょうか?
また、ここで保存されている「回数」を一旦リセットしたい場合はどうすればいいのでしょうか?
No.2
- 回答日時:
前の質問にも回答しましたがご覧になっていませんか?
これから書くことは前の回答とほぼ同じ内容です。
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
ととろさんではなくとほほさんなのでは・・・。
再度回答ありがとうございます。
>前の質問にも回答しましたがご覧になっていませんか?
もちろん読まさせていただきました。
ただ以前はいろいろとつけて質問したがために自分でわからなくなってしまったので、今回はシンプルに質問をしてみたんです。
少しずつ進めていこうと思って…。
>Cookieの読み込みはとほほさんのサンプルソースが参考になると思います。
みてみたのですが、とてもたくさんあって、ひとつひとつみてはいるのですが、まだまだ理解が及ばない状態です。
日付のところとかがなんとかわかる程度です。
>あとはPerl標準のCGI.pmというPerlモジュールを使うとより簡単にCookieの設定が出来ます。
>連想配列とかもCookieにセットできます。
試してみます。
>ととろさんではなくとほほさんなのでは・・・。
そのとおりです(恥)。すいませんとほほさん…。
いつもお世話になっているのに…。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストエリアにテキストファ...
-
my $html<<EOMの意味を教えてく...
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
VBAでPDFのコピーとリネームを...
-
formで特定のinputを送信しない...
-
回数を指定しないで空白行まで...
-
構造体の各データの表示につい...
-
実行時エラー 3020の対策
-
実行中の変数の中身をイミディ...
-
セレクトメニューで2つの項目...
-
この曲のピアノの最後の和音が...
-
メモリをアドレスを直接指定し...
-
<SELECT>タグの折り返し
-
SELECT要素の垂直位置
-
C言語のflagの使い方が分かりま...
-
途中まで出来ているのですが‥(D...
-
Perlにfunctionってないんですか?
-
pythonを使ったプログラミング...
-
awkの正規表現での最左最短マッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
my $html<<EOMの意味を教えてく...
-
ランダムに背景画像を変える方法。
-
ランダムリンク(ランダム表示...
-
CGIにてPrintを一気に行う
-
CGIのテキストが文字化けし...
-
FLASHとCGIでのデータの受け渡...
-
CGIから出力される文字が化けて...
-
フリーCGI ラジオボタンの改行...
-
malformed header from script....
-
TeraPadでよく使う文字を特定キ...
-
HTMLで作っているサイトに、別...
-
出来ているHTMLに無料CGIをつけ...
-
shift-jisからutf8に変換
-
テキストエリアにテキストファ...
-
TXTに出力すると文字化けが起こる
-
CGIの中に、自動ページジャンプ...
-
CGIが動作しません。
-
結果を得て自動的にページ移動...
-
パソコン → パャRン
-
HTMLの代わりに「SCALAR(・・・...
おすすめ情報