• 締切済み

クッキーのタイミング

PHPのクッキーは、ブラウザにContent-type:のようなものが届く前にクッキー命令が届く必要がありましたが、Perlではそういった決まりはないのですか? <body> が出力される前に print "Set-Cookie: ~"; すると、bodyのbgcolorがむこうになったりしますよね? print "Set-Cookie: ~";によってbodyが出力済みと解釈されるためだと思います。 できればPHPのように <HTML>を出力する以前に print "Set-Cookie: ~"; したいのですが、よい方法はありませんか?

  • Perl
  • 回答数2
  • ありがとう数1

みんなの回答

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.2

モジュールを使っていないのなら自前でContent-type等を出力していると思いますが、基本的にはContent-typeを出力する前にSet-Cookieしてやれば大丈夫です。 print "Set-cookie: foo=bar\n"; print "Content-type: text/html\n\n"; ただ、質問者さんのCookie周りの理解が頓珍漢な感じですので、今一度HTTPの仕組みについて再学習されたほうがいいでしょう。特にリクエスト/レスポンスヘッダあたりを重点的に。

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.1

Webサーバ→Webクライアント 方向のデータをHTTPレスポンスと言います。 (1) "Set-Cookie: " 文は HTTPレスポンスのヘッダ部で出力し, (2) ヘッダとボディの区切りとして1つの空行 "\n" を出力した後, (3) "<html><body>" などのHTMLを HTTPレスポンスのボディ部で出力する, というのは HTTPの仕様ですから, PHPだろうが Perlだろうが 他のどんなプログラム言語で書こうが, 「<HTML>を出力する以前に print "Set-Cookie: ~";」せねばなりません。 http://www.rfs.jp/sb/perl/03/03.html > <body> が出力される前に > print "Set-Cookie: ~"; > すると、bodyのbgcolorが無効になったりしますよね? というのは,質問者が Perlの use CGI; の機能を理解しないで使っており,"Set-Cookie:"文をHTTPボディ部で出力している可能性が考えられます。 http://www.hidekik.com/cookbook/p2h.cgi?id=cookie1 CGI.pm を使用せず,HTTPヘッダもHTTPボディも自分でprint出力してみるとよく理解できると思います。 http://www.hidekik.com/cookbook/p2h.cgi?id=cookie2

emaita
質問者

補足

useに依存したくないのでuseは使っていません。

関連するQ&A

  • クッキーが保存されずに困っています

    どなたか、詳しい方がおりましたらアドバイスをお願い いたします。私はプログラムを仕事としている者では ありませんが、独学でPHPを勉強しております。 クッキーが保存されなくて困っています。 以下の部分です。 クッキーの有効期間は設定していませんが、ブラウザを 閉じずにテストしていての情況です。 ---------------------------------------------------- ファイル名:rogin.php <?php setcookie("userck","ckdata=100"); print $_COOKIE[userck]; ?> <html> <body> <br><br><br> <center> <table border="1"> <form method="post" action="<?=*********"> <tr> <td> Email: </td> <td><input type="text" name="data1" size="30"> </td> </tr> <tr> <td> pass: </td> <td><input type="text" name="data2" size="30"> </td> <tr> <td colspan="2" align="center"> <input type="submit" name="sousin" value="送信"> </td> </tr> </form> </center> </body> </html> ---------------------------------------------------- どうしてクッキーが保存されないのか自分なりにいろいろと 調べたり、テストをしてみたりしました。 テストの内容 test1.php <?php setcookie("userck","ckdata=100"); ?> test2.php <?php print $_COOKIE[userck]; ?> 上の2つのファイルを作成して、test2.phpで出力してくるか どうかを試してみますと、問題なく「data=10」が出力されて きます。(保存されているかどうかだけを調べたいので、 parse_strは省略しています。) ところが、問題のrogin.phpでクッキーを保存して別のファイル で$_COOKIE[userck]を取得しようとしてもどうやら保存されて いないようです。 rogin.phpの内部に記載した、print $_COOKIE[userck];では ckdata=100は出力してきます。 それではと思い、test1.phpでセットしたクッキーはrogin.phpで 取得できるのかどうかをテストしてみますと、無事に取得できます。 setcookie()の前にはHTMLの出力はありません。 クッキー名にアンダーバーも使っていません。 何か、php.iniに関係するのかと思い、一応iniファイルに output_buffering = On を書き足したりもしました。 クッキーが保存されない原因で、考えられることはどんなこと なのかが知りたいです。 どなたか、お分かりになる方アドバイスをお願いできないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • クッキーがよくわかりません

    クッキーの利用の仕方が不明です。 ↓以下のようなプログラムを↓をコピペしてきたのですが、よくわかりません…$data=$_COOKIE["data"];の部分でエラー発生します。 どういうことでしょうか? http://w1.nirai.ne.jp/freeze/main/files/10_01_cookie.html <?php       //クッキーは<html>よりも先に記述する $data=$_COOKIE["data"];     //まずクッキーを読み出す  if(!isset($data)){       //何もデータが無ければ   $data = $_POST['data'];   //postで受け取ったデータを  }else{             //クッキーデータがあれば   $data = $data."<br>".$_POST['data'];    //前のデータに新しいデータをくっつける  } setcookie("data", $data, time()+60*10);    //そしてそのデータを60秒×10つまり10分間記憶する ?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-type" content="text/html; charset=EUC-JP"> <meta http-equiv="Content-Style-Type" content="text/css"> <title>クッキーで、すぐ消える一行メモ</title> </head> <body> クッキーで、すぐ消える一行メモ<br> 文章を入力して表示クリックを、何度か繰り返してください。10分で消えます。<br> <form action="10_01_cookie.php" method="post"> <input type="text" name="data" size="50"> <input type="submit" value="表示!"> </form> <!--ここからPHPが始まります。--> <?php echo $data;    //入力された文を改行をはさんで記憶しているので、それを記述する ?> <!--これでPHPは終わりです。--> </body> </html>

    • ベストアンサー
    • PHP
  • iswebでクッキーが焼きたい

    Infoseekのiswebを借りています。 perlでcookieを焼こうと考えていますが パソコンの中のローカルサーバでは print "Set-Cookie: COO=****;"; で焼けるのですが、iswebに上げると cookieが焼けません。 プログラムの文法がおかしいのでしょうか、 iswebに何か特別なことがあるのでしょうか?

  • クッキーがセットされません

    PHP初心者です。 よろしくお願い致します。 環境 レンタルサーバーを借りています PHP 5.2.9(CGI) 過去のスレッドも参考にしながら、クッキーを設定しましたが、保存されません。 ***コードはじまり*** <?php // cookie があればプラス1、無い場合は1にする if ($_COOKIE['visit']) { $count = $_COOKIE['visit'] + 1; } else { $count = 1; } setcookie("visit", $count); ?> こんにちは。 <?php print $count ;?> 回目の訪問ありがとうございます。<br> <?php print_r($_COOKIE); ?> ***コードおわり*** ***出力結果はじまり*** こんにちは。 1 回目の訪問ありがとうございます。 移動 Array ( ) ***出力結果おわり*** 何度読込なおしても、出力結果はかわりません。 よろしくお願い致します。

    • 締切済み
    • PHP
  • クッキーの基礎的なことについて

    print "Content-type: text/html\n\n"; #クッキーがないときの動作。 #クッキーがない場合クッキーを期限1日で発行する。 if(!$ENV{'HTTP_COOKIE'}){ #クッキーが存在する場合の動作 print "クッキーないない<br>\n"; #1時間先のグリニッジ標準時を取得し、weeksとmonthsを定義 ($gmSec, $gmMin, $gmHour, $gmMDay, $gmMon, $gmYear, $gmWDay, $gmYDay, $gmIsDst) = gmtime(time + (3600 * 24)); $gmYear += 1900; @weeks = ('Sun', 'Mon', 'Tue', 'Web', 'Thu', 'Fri', 'Sat'); @months = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); #クッキーの有効期限をその日の1日後までにする $limitTime = sprintf("%s\n, %02d-%s-%04d %02d:%02d:%02d GMT",$weeks[$gmWDay], $gmMDay, $months[$gmMon], $gmYear, $gmHour, $gmMin, $gmSec); #クッキー発行 print "Set-Cookie: myBool=1; expires=$limitTime\n"; print "\n"; } else { #クッキーがあった場合の動作。クッキーありと表示するだけ。 print "クッキーあり。"; } クッキーの発行を見ると print "Set-Cookie: なんたらかんたら"; らしいのですが、printでこう書くだけでクッキーが発行できたことになるのですか? 実行しても、ただ単に例えば Set-Cookie: myBool=1; expires=Mon , 08-Aug-2005 12:11:43 GMT というようになるだけです。 初心者でまだ1度もクッキー作成成功してないのですが何がいけないのでしょうか。

    • ベストアンサー
    • Perl
  • クッキーの削除がうまくいきません

    <?php setcookie("a","おいしいクッキー"); $a=$_COOKIE["a"]; print "$a"; print "<br />"; setcookie("a","",time()-60); $b=$_COOKIE["a"]; print "$b"; ?> と書いて、クッキーの設定は出来たのですが、有効期限を過去にしても クッキーが削除されずにエラーメッセージが出ます。 エラーメッセージ Warning: Cannot modify header information - headers already sent by (output started at C:\Eclipse\workspace\PHP\cookie.php:7) in C:\Eclipse\workspace\PHP\cookie.php on line 11 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHPでのクッキー

    PHPでクッキーを使い、下記のような入力フォームを作りました。 form.phpで入力→form2.phpで正常出力出来るのですが、 直接form2.phpへ飛ぶと、クッキーの値がなくなってしまいます。 setcokkieが、何の値もないのを上書きしていることは理解できるのですが、これを上書きせず回避?する方法はありますでしょうか? よろしくお願いします。 【form.php】 <?PHP parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); ?> <html> <form method="post" action="form2.php"> <?PHP echo "名前1<input type=text name=name1 maxlength=16 size=12 value=$set_name1> <BR>ID<input type=text name=p1 maxlength=8 size=6 value=$set1><BR><BR>"; echo "名前2<input type=text name=name2 maxlength=16 size=12 value=$set_name2> <BR>ID<input type=text name=p2 maxlength=8 size=6 value=$set2>"; ?> <input type="submit" value="実行"> </form> </html> 【form2.php】 <?php $city1 = $_POST["p1"]; $city2 = $_POST["p2"]; $city_name1 = $_POST["name1"]; $city_name2 = $_POST["name2"]; setcookie ("city", "set1=$city1&set2=$city2",time()+3600*24*90); setcookie ("city_name", "set_name1=$city_name1&set_name2=$city_name2",time()+3600*24*90); parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); echo $set_name1; echo $set1; echo $set_name2; echo $set2; ?>

    • ベストアンサー
    • PHP
  • クッキーと?

    三項演算子?について教えてください やりたいことはHTMLのリンクをクリックするとクッキーの値が変わるようにするこです 本見てていまいち理解できませんでした if (isset($_COOKIE["size"])) { $size = intval($_COOKIE["size"]); } このリンクをクリックするとなぜcookieの値が変わるのですか? ?マークだから三項演算子ですよね? ?の意味がわかりません・・・?がつくとクッキーの値が変更できるのですか? //ここからHTML 文字サイズ <a href="test.php?size=20">中</a> <a href="test.php?size=10">小</a>

    • ベストアンサー
    • PHP
  • どうしてもCookieとCGI・perlの関係?が理解できない。

    ととろさんのところを(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解説サイトをみたのですが、どうしてもここだけが理解できませんでした。

    • ベストアンサー
    • CGI
  • クッキー書き込みが正常に行われない?

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=394703 を質問していたものです。 1.フォームで名前を入力 2.1の情報をクッキーに書き込み ということをやりたいのです。 (応用いたしますが、基本はこれです。) 1つ目のcgiで、フォームで名前を入力。 -----1.cgi-------------------- #!/usr/local/bin/perl print "Content-type:text/html\n\n"; print "<form method=post action=2.cgi>\n"; print "<input type=text name=name></input><BR>\n"; print "<input type=submit value=ok></input><BR>\n"; print "</form>\n"; exit; ------------------------------ 1.cgiの名前のデータを呼び込もうとしてもエラーになる。 -----2.cgi-------------------- #!/usr/local/bin/perl read(STDIN,$atai,$ENV{'content_length'}); ($key, $value) = split(/=/, $atai); $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; print &setCookie("name",$value); print "Content-type:text/html\n\n"; print "名前:<FONT COLOR=RED>",$value,"</FONT>と送信されました。<br>\n"; #Cookie書き込み。 sub setCookie{ local($tmp,$val); $val = $_[1]; $val =~ s/(\W)/sprintg("%%%02X",unpack("C",$1))/eg; $tmp="Set-Cookie: "; $tmp .="$_[0]=$val; "; $tmp .="expires=Thu, 1-Jan-2030 00:00:00 GMT;\n"; return($tmp); } ------------------------------ クッキー書き込みをしないで実行すると、きちんと名前が表示されます。 どこをなおせばきちんとクッキーにセットされるのでしょうか? 何度も申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • CGI

専門家に質問してみよう