
ととろさんのところを(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で質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- CGI CGIで出力するhtmlの<!DOCTYPE html>等のタグは要りますか? 2 2023/02/05 21:26
- Chrome(クローム) Cookieを削除 他サイトでの自動ログインなどの設定も削除されますか パソコン クロームです 1 2022/09/10 21:47
- PHP sessioncookieをではなくcookieを使わなければならない理由について… 4 2022/11/07 13:01
- CGI 古ーくからフリーのtree.cgi掲示板を利用させてもらって来ましたが、最新でなにか復活できないか? 2 2023/04/07 10:43
- PHP PHPで訪問回数を表示するカウンタを作成したい 3 2023/05/27 07:09
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlで作ったcgiがIE6で西ヨー...
-
以下のような記述では エラー...
-
Jeditで漢字コードを変更したの...
-
Perl CGIの中で # を使ってコメ...
-
CGIが動作しません。
-
CGIファイルを参照制御でき...
-
結果を得て自動的にページ移動...
-
パソコン → パャRン
-
アクセス人数制限CGIについて。
-
CGIが文字化けしてしまう。(Pe...
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
phpでボタンを押したときに変数...
-
C# GetFilesで複数のファイルの...
-
<SELECT>タグの折り返し
-
ホームページ上にある表に書き...
-
STLのlistで重複するものだけを...
-
セレクトボックスの「選択して...
-
vbaでxmlからNodeListでデータ...
-
python のfor を使ったプログラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パソコン → パャRン
-
malformed header from script....
-
Apacheのログにエラー出力
-
結果を得て自動的にページ移動...
-
CGI(Perl)とHTMLについて
-
CGIのライブラリ表示について。
-
Perl CGIの中で # を使ってコメ...
-
テキストエリアにテキストファ...
-
UTF8 URLエンコード
-
CGI内からSSIを実行した...
-
CGIファイルを参照制御でき...
-
アクセス人数制限CGIについて。
-
my $html<<EOMの意味を教えてく...
-
CGIにおいて、エンコード・文字...
-
TeraPadでよく使う文字を特定キ...
-
Yomi-Searchのサイトピックアッ...
-
JSONで文字列が長い時
-
Application.ScreenUpdating = ...
-
formで特定のinputを送信しない...
-
メモリをアドレスを直接指定し...
おすすめ情報