ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと

#!/usr/local/bin/perl

# ライブラリ
require 'cgi-lib.pl';
require 'jcode.pl';
require 'keiji_write_sub.pl';

# デコード
&ReadParse(*form);

# 名前・メッセージ欄のチェック
if ($form{'name'} eq "" || $form{'message'} eq "") {

# 名前・メッセージが空ならエラー
&input_error;

# 終了
exit;

} else {

# 名前・メッセージも空でないなら書込処理

# HTMLタグと衝突する記号を変換
$name = &henkan($form{'name'});
$mail = &henkan($form{'mail'});
$title = &henkan($form{'title'});
$message = &henkan($form{'message'});
$message =~ s/\r\n/<BR>/g;

# 日本語表記の日時を得る
$time = &jp_time;

# データを1行に(区切りはコロン)
$new_data = "$time:$name:$mail:$title:$message\n";

&jcode'convert(*new_data, 'sjis');

open(KEIJI, "<keijiban.dat") || die "File 'keijiban.dat' Open Error.";

# 過去のデータを全て配列に読み込む
@all_data = <KEIJI>;

close(KEIJI);

# 配列の先頭に新規データ追加
unshift(@all_data, $new_data);

open(KEIJI, ">keijiban.dat") || die "File 'keijiban.dat' Open Error.";

#flock(KEIJI, 2);

# (新規データ+過去データ)をファイルに上書き
print KEIJI @all_data;

#flock(KEIJI, 8);

close(KEIJI);

# 書込完了メッセ
&write_ok;
}


というコードでdatファイルに書き込みしています。
この時に、名前などを1度入力したらCookieに記憶させて次からは自動で入るようにしたいのです。
あちこち検索して読んだりしたのですが、わからなくて…。

どなたか教えてください。

A 回答 (3件)

言葉足らずでしたね。


というか、Cookie の機構についても当然そうですが、perl 自体をキチンと理解されていますでしょうか。

> # 書きこみ完了メッセ
> &write_ok(Set-Cookie: LOGIN=tanaka;Set-Cookie: PASSWD=hi.mi.tu;)
>
> # 書きこみ完了メッセ
> &write_ok;
> Set-Cookie: LOGIN=tanaka;
> Set-Cookie: PASSWD=hi.mi.tu;

構文的におかしいという事に気付いてください。

write_ok は、書込完了画面を出力していますよね?
write_ok の中身がどうなってるのかわからないので、write_ok にどうしたらいいのかなんて聞かれても困りますし、何ともいえませんが、write_ok の中で

print "Content-type: text/html\n\n";

みたいなのを書いてると思うんですが、それを書く前に Set-Cookie を書いてくださいという事です。

例えば、
---
Set-Cookie: name=%a4%cb%a4%dd%a4%bf%a4%f3; exp=Thu, 31-Oct-2002 23:59:59 GMT; path=/;
Set-Cookie: sex=%c8%eb%cc%a9; exp=Fri, 01-Nov-2002 08:59:59 GMT; path=/;
Content-Type: text/html
---
というヘッダの後にコンテンツが続いた場合、ブラウザはそのサーバの / 以下の領域に対して有効な Cookie をセットします。
Cookie の値は "name=にぽたん" と、"sex=秘密" で、この Cookie の有効期限は、前者 (name=) は GMT での今月いっぱい。後者 (sex=) は JST での今月いっぱい。(GMT でしかセットできません。)

一度セットされると、ブラウザは、そのサーバの、path が有効な範囲で、有効期限がある場合に限り、サーバに対して、Cookie の情報を含んだリクエストを送ります。
例えば以下のような感じになります。

---
GET /cgi-bin/hogehoge.cgi HTTP/1.1
Host: your.domain
Cookie: name=%a4%cb%a4%dd%a4%bf%a4%f3; sex=%c8%eb%cc%a9
User-Agent: Mozilla/4.0
Accept: */*
Accept-Language: ja
---

こういう形式でリクエストを受け取った /cgi-bin/hogehoge.cgi では、
$ENV{HTTP_COOKIE} 環境変数に Cookie ヘッダの値 "name=%a4%cb%a4%dd%a4%bf%a4%f3; sex=%c8%eb%cc%a9" がそのまま格納されています。

格納されている Cookie は以下のようにパースします。

---
my %cookie = ();
foreach(split /;\s*/, $ENV{HTTP_COOKIE}){
my @buf = split /=/;
map{ s/%([a-f\d]{2})/pack('C', hex($1))/egi }@buf;
$cookie{$buf[0]} = $buf[1];
}
---
こうすることによって、$cookie{name} と $cookie{sex} にそれぞれの値が格納されます。

以降、

print "<input type=text name=\"name\" value=\"$cookie{name}\">";
print "<input type=text name=\"sex\" value=\"$cookie{sex}\">";


とすれば、フォームのテキストボックスに、Cookie から取得された値が取り出せますよね。Cookie から値が取り出せていなければ、$cookie{name} や $cookie{sex} は未定義になるので、出力時に value="" となるはずです。

おわかりいただけたでしょうか。

というか、言わせてもらえれば、この説明の内容は、全て先ほどの参考 URL を読めば同じ内容で理解できるはずなんですがね。
    • good
    • 0
この回答へのお礼

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

>というか、Cookie の機構についても当然そうですが、perl 自体をキチンと理解されていますでしょうか。

ご指摘のとおり、perl自体もきちんと理解していない状態です。
(cgiも多少の改造と設置くらいしかできません。)

質問文にかいた構文は手持ちの本に載っていたものをそのまま使えるかと思い改造しようとしていたのですが、とほほさんのところと違って、本の方は2つに分かれて成り立っているようです。(.cgiと.plの2つ)
わかりづらいのでとほほさんのところを参考にすることにしました。

まだ当分できあがらなそうですが、少し近づいたようです。
(見当違いのことをしていた、ということに気づいただけでも…)

ありがとうございました。
もう少しやってみます。

お礼日時:2002/10/24 13:33

サンプルもある解説ページです。


ここのサンプルを流用すれば作れると思います。
http://www.futomi.com/lecture/cookie/index.html

あとPerlで標準に付いているモジュールCGI.pmを使えば簡単に設定することも出来ます。

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

> # 書込完了メッセ


> &write_ok;

write_ok の中で、Content-Type ヘッダ等を出力する際に、Set-Cookie ヘッダを出力してください。
Cookie は書式や仕様などが複雑に定義されていますので、以下のサイトを参考になさるといいと思います。

参考URL:http://tohoho.wakusei.ne.jp/wwwcook.htm
    • good
    • 0
この回答へのお礼

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

>> # 書込完了メッセ
>> &write_ok;

>write_ok の中で、Content-Type ヘッダ等を出力する際に、Set-Cookie ヘッダを出力してください。

これはどのように記入すればいいのでしょうか?

# 書きこみ完了メッセ
&write_ok(Set-Cookie: LOGIN=tanaka;Set-Cookie: PASSWD=hi.mi.tu;)

# 書きこみ完了メッセ
&write_ok;
Set-Cookie: LOGIN=tanaka;
Set-Cookie: PASSWD=hi.mi.tu;

というのしか思いつきませんでした。
(どちらもエラーが返ってきました。)

教えていただいたページは読んではいたのですが、それでもどこにどう記入してよいかわからないでいます。

何度も申し訳ありませんが、よろしくお願いいたします。

お礼日時:2002/10/24 10:28

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