#!/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に記憶させて次からは自動で入るようにしたいのです。
あちこち検索して読んだりしたのですが、わからなくて…。
どなたか教えてください。
No.2ベストアンサー
- 回答日時:
言葉足らずでしたね。
というか、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 を読めば同じ内容で理解できるはずなんですがね。
再び回答ありがとうございます。
>というか、Cookie の機構についても当然そうですが、perl 自体をキチンと理解されていますでしょうか。
ご指摘のとおり、perl自体もきちんと理解していない状態です。
(cgiも多少の改造と設置くらいしかできません。)
質問文にかいた構文は手持ちの本に載っていたものをそのまま使えるかと思い改造しようとしていたのですが、とほほさんのところと違って、本の方は2つに分かれて成り立っているようです。(.cgiと.plの2つ)
わかりづらいのでとほほさんのところを参考にすることにしました。
まだ当分できあがらなそうですが、少し近づいたようです。
(見当違いのことをしていた、ということに気づいただけでも…)
ありがとうございました。
もう少しやってみます。
No.3
- 回答日時:
サンプルもある解説ページです。
ここのサンプルを流用すれば作れると思います。
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
No.1
- 回答日時:
> # 書込完了メッセ
> &write_ok;
write_ok の中で、Content-Type ヘッダ等を出力する際に、Set-Cookie ヘッダを出力してください。
Cookie は書式や仕様などが複雑に定義されていますので、以下のサイトを参考になさるといいと思います。
参考URL:http://tohoho.wakusei.ne.jp/wwwcook.htm
回答ありがとうございます。
>> # 書込完了メッセ
>> &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;
というのしか思いつきませんでした。
(どちらもエラーが返ってきました。)
教えていただいたページは読んではいたのですが、それでもどこにどう記入してよいかわからないでいます。
何度も申し訳ありませんが、よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【再】Cookieを使用してフォー...
-
SUN BBSの改造方法
-
ラジオボタンが両方とも選択で...
-
[HTML]プルダウンメニューの横...
-
VB初心者。小数点以下の表示で...
-
wordの数式について 定積分を書...
-
掲示板の文字色指定について
-
チェックボックスで選択した内...
-
CGI.pmのstart_htmlで思い通り...
-
パールの-pオプションの値0777...
-
クッキー書き込みが正常に行わ...
-
ディレクトリのファイル数取得
-
WEBページを強制的に横画面で見...
-
ラジオボタンを選択済みにする...
-
アンケートフォームで前のペー...
-
アンケートの質問を複数にしたい
-
ブックマークからのアクセスを...
-
大和ネクスト銀行の銀行コード
-
別formのhidden項目を自form値...
-
EXCELとの連携
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tracert ができない原因
-
Perlでuse socketを使用してフ...
-
【CGI】画像の表示の仕方【Mini...
-
c言語 構造体
-
C フォームから受け取った知を...
-
チェックボックスでのor検索
-
【再】Cookieを使用してフォー...
-
ダウンロードをした人の一覧を...
-
DataGridViewの行取得
-
日本語文字化け(GETメソッド?)
-
yoyaku.cgi の改造
-
【ASP.NET MVC】フォームヘルパ...
-
CGIでCookie取得
-
入力フォームに全角・半角スペ...
-
CGIで合計を書き出す方法
-
name[3] = seq + '0';の意味
-
sendmailのメール送信ができま...
-
perlで書いたcgiでsqliteの使い...
-
ファイル名変更プログラム
-
ラジオボタン、チェックボック...
おすすめ情報