KENT-WEB サポートコーナー 過去ログ [ 0259 ]


記事No: 7841
投稿日: 2010/08/23(Mon) 15:36:48
タイトルprint "Set-Cookie:について
ID情報: taitan9
投稿者: 昼行灯
URLhttp://taitan.net

いつもお世話になっております。
止めときゃ〜いいのに又ハマッテしまってます。
ワンランク上のperl・・・著書よりDataCabinetを勉強しております。

名前とメールアドレスをクッキー保存しょうと思い立ち(必要ない!と言われそう)同本のCHAPTER2・bbsのregst.cgiからクッキー発行サブルーチンを、mtbbs.cgiからクッキー取得のサブルーチンを切り取りcabinet.cgiの最後尾に貼り付けました。

cabinet.cgiの495行付近のprint <<"EOM";の前行に&set_cookie('$name','$mail');と書きクッキー発行サブルーチンをコールしていますがSet-Cookie: MTBBS=$cook; expires=$gmtの文字が画面に表示されてしまいます。

print "Content-type: text/html\n\n";を付加したり色々やってみましたが上手くいきません。
ビギナーが・・・と言われそうですがperl向学のためご教示いただければ嬉しいです。
環境はWinXP,SP3です。
よろしくお願いいたします。


記事No: 7845
投稿日: 2010/08/23(Mon) 16:19:54
タイトルRe: print "Set-Cookie:について
ID情報: liberty8
投稿者: KK
URLhttp://www11.atpages.jp/atgamewikibbs/Patio.html

HTTPレスポンスの構造
http://itpro.nikkeibp.co.jp/article/COLUMN/20060215/229453/?SS=imgview&FD=-1839915280&ST=selfup

ヘッダとボディの区切りに空行が使われます。
その空行後の出力は全てボディとして扱われます。

一度空行を出力すると、その後ヘッダは出力できません。

あと、「'」は展開なし文字列リテラルといいます。
これは、囲った文字列内で変数を展開しないリテラルです。
「\'」以外のエスケープ処理は無視され、例えば、

my $var = '\$';

とすると$varにはそのまま「\$」が格納されます。

変数を展開するには「"」(展開あり文字列リテラル)を使いますが、単に

print "$var";

と使ってしまうと、

print $var;

の倍メモリを喰ってしまいます。

あと、なるべくスクリプトの上の方に

use strict;
use warnings;

と書くようにしてください。
この記述の説明に関しては長くなるのでご自分で調べてください。

ここでは簡単にしか説明しませんが、疑問になったことはすぐ調べてください。


記事No: 7853
投稿日: 2010/08/24(Tue) 09:12:42
タイトルRe^2: print "Set-Cookie:について
ID情報: taitan9
投稿者: 昼行灯

KKさま

ありがとうございます。良い勉強になります。

> ヘッダとボディの区切りに空行が使われます。
> その空行後の出力は全てボディとして扱われます。
>
> 一度空行を出力すると、その後ヘッダは出力できません。

print "Set-Cookie: 〜\n";はボディと扱われて文字列表示されたのですね。

それでは、クッキー発行サブルーチン(sub set_cookie)中に
print "Set-Cookie: MTBBS=$cook; expires=$gmt\n";
とあります。

これをヘッダとして取り扱う(呼び出す)には具体的にどうすればよろしいのでしょうか?

bbs/regist.cgiには
# クッキー保存
if ($in{'cookie'} == 1) {
&set_cookie($in{'name'}, $in{'email'}, $in{'cookie'});
} else {
&set_cookie('', '', '');
}

# 完了メッセージ
&header("スレッド作成");
と記述しておりましたが?

ご多忙中とは思いますが宜しくお願いします。




記事No: 7855
投稿日: 2010/08/24(Tue) 09:54:05
タイトルRe^3: print "Set-Cookie:について
ID情報: liberty8
投稿者: KK
URLhttp://www11.atpages.jp/atgamewikibbs/Patio.html

空行を出力する前に何か出力すれば、それはヘッダとなります。
MT-BOARDのソースコードは見たことがないのでどういう処理を行っているのかわかりませんが・・・。
headerサブルーチンで空行が出力されるなら、
headerサブルーチンの呼び出しよりも前にSet-Cookieフィールド(ヘッダ)を出力すれば良いです。

以下のウェブページが参考になります。
http://www.studyinghttp.net/header
http://www.studyinghttp.net/cookies


記事No: 7858
投稿日: 2010/08/24(Tue) 11:56:30
タイトルRe^4: print "Set-Cookie:について
ID情報: taitan9
投稿者: 昼行灯

KKさん

> 以下のウェブページが参考になります。
> http://www.studyinghttp.net/header
> http://www.studyinghttp.net/cookies

読ませていただきました。
理解困難な所がありますが、要は猿真似ではダメ!
カラクリを理解して使えってことですね。

何度も読み返して少しづつ理解できるようになりました。
ご指導ありがとうございます。


[検索ページ]