[PHP] setcookie() は、あらゆる出力よりも前にコールしなければいけません

「10日でおぼえるPHP入門教室 第2版」を読みながら、サンプルプログラムを動かしてたら、setcookie()の使い方がおかしいコードがあったのでメモ。
setcookie() は、あらゆる出力よりも前にコールしなければいけません。

クッキーでデータを記録する

setcookie() の使い方がおかしい

復習がてら「10日でおぼえるPHP5入門教室 第2版」を読みながら、サンプルプログラムを動かしてたら、setcookie()の使い方がおかしいコードがあったのでメモ。

サンプルコードそのまんま書いても動かない系のやつ。

動かないサンプルプログラム

サンプルプログラムは、クッキー情報を活用しよう的なプログラムで、次のような仕様。

  1. 1回目のアクセスで、メールアドレスを入力して送信
  2. 送信時、クッキーに入力したメールアドレスを保存
  3. 2回目にアクセスした時に、メールアドレスが自動的に表示される

といったプログラム。

以下、2つのファイルを使う。

cookie.php

<br />
&lt;html&gt;<br />
    &lt;head&gt;<br />
        &lt;title&gt;クッキーでデータを記録する&lt;/title&gt;<br />
    &lt;/head&gt;<br />
    &lt;body&gt;</p>
<p>&lt;form method=&quot;POST&quot; action=&quot;cookie_rec.php&quot;&gt;<br />
            メールアドレス:<br />
            &lt;input type=&quot;text&quot; name=&quot;email&quot; size=&quot;30&quot; maxlenght=&quot;50&quot;<br />
             value=&quot;&lt;?php print($_COOKIE['email']); ?&gt;&quot; /&gt;<br />
            &lt;input type=&quot;submit&quot; value=&quot;送信&quot; /&gt;<br />
        &lt;/form&gt;</p>
<p>    &lt;/body&gt;<br />
&lt;/html&gt;<br />

cookie_rec.php

<br />
&lt;html&gt;<br />
    &lt;head&gt;<br />
        &lt;title&gt;クッキーでデータを記録する&lt;/title&gt;<br />
    &lt;/head&gt;<br />
    &lt;body&gt;<br />
        &lt;?php setcookie('email', $_POST['email'], time() + (60 * 60 * 24 * 90)); ?&gt;<br />
            クッキーを保存しました。<br />
    &lt;/body&gt;<br />
&lt;/html&gt;<br />

で、cookie.phpのURLにアクセスして、メールアドレスを送信すると以下のメッセージが表示され、クッキーへの保存ができない。

Warning: Cannot modify header information – headers already sent by (output started at /Applications/XAMPP/xamppfiles/htdocs/php10/day03/cookie_rec.php:6) in /Applications/XAMPP/xamppfiles/htdocs/php10/day03/cookie_rec.php on line 7

setcookie()の仕様

setcookie()の仕様を確認してみる。

setcookie() は、その他のヘッダ情報と共に 送信するクッキーを定義します。 ほかのヘッダ情報と同様に、 クッキーは、スクリプトによる他のあらゆる出力よりも前に 送信される必要があります(これはHTTPプロトコルの制約です)。 <html> や <head> タグはもちろん 空白も含め、あらゆる出力よりも前にこの関数をコールするようにしなければなりません。

PHP: setcookie – Manual

ですよねー/(^o^)\

setcookie() の呼び出しは先頭に

というわけで、setcookie()の呼び出しは、先頭に持ってくる必要があります。

cookie_rec.php

<br />
&lt;?php setcookie('email', $_POST['email'], time() + (60 * 60 * 24 * 90)); ?&gt;<br />
&lt;html&gt;<br />
    &lt;head&gt;<br />
        &lt;title&gt;クッキーでデータを記録する&lt;/title&gt;<br />
    &lt;/head&gt;<br />
    &lt;body&gt;<br />
       クッキーを保存しました。<br />
    &lt;/body&gt;<br />
&lt;/html&gt;<br />

これで無事に動きました。

まぁ、この本自体も少し古いし、何とも言えないけど…(最新版では修正されてたりするのかな)関数の仕様はよく確認してから使いましょう、という話。

星影

Tech Hunter代表。フリーランスエンジニア、ブロガー、ゲーマー。
ガジェット、アニメ、ゲームが好きなオタク。
レビューズ公認レビュアー。各種アンバサダー活動もしてます。

コメントを残す

メールアドレスが公開されることはありません。