クッキーを受け入れないようにブラウザで設定されている場合には、クッキーを書き込むことはできません。またクッキーを保存する期間がブラウザで指定されている場合には、有効期限はブラウザの設定で上書きされます。さらにブラウザの終了時にクッキーが削除されるように設定されている場合、有効期限にかかわらず削除されます。
Firefoxのクッキーの設定
setcookie()でクッキーを書き込みます。
bool setcookie( string $name, // クッキーの名前 [ string $value, // クッキーの値 [ int $expire = 0, // クッキーの有効期限 (クライアントの時刻設定に対する期限) [ string $path, // クッキーが有効なパス (ホスト名以下のパス) [ string $domain, // クッキーが有効なドメイン [ bool $secure = FALSE, // HTTPS接続時のみクッキーを送信するかどうか [ bool $httponly = FALSE// HTTPを通してのみクッキーへのアクセスを許可するかどうか ] ] ] ] ] ] );PHP: setcookie - Manual
クッキーの値 ($value) は、URLエンコードされて書き込まれます。また値を"FALSE
"とするとクッキーの削除を指示したことになるため、"FALSE
"という文字列は使用できません。
「http://localhost/dir/cookie.php」というページで、以下のコードを実行したとします。
setcookie( 'name1', 'abc' ); setcookie( 'name2', '256', time() + 3600 ); setcookie( 'name3', '日本語', time() + 3600, '/' );
このときHTTPヘッダには、
Set-Cookie: name1=abc name2=256; expires=Fri, 22-Jan-2010 13:40:45 GMT name3=%E6%97%A5%E6%9C%AC%E8%AA%9E; expires=Fri, 22-Jan-2010 13:40:45 GMT; path=/
のように出力されます。(この内容についてはクッキーのHTTP通信フォーマットで解説しています。)
これをFirecookieで確認すると、
のようにクッキーが書き込まれたのがわかります。
クッキーの設定はHTMLのヘッダに含む必要があるため、この関数はhtml要素や空白も含めたあらゆる出力よりも先に実行されなければなりません。
もしsetcookie()よりも先に出力を行った場合、
Warning: Cannot modify header information - headers already sent by (output started at C:\index.php:2) in C:\index.php on line 10
のような警告が表示されます。この例では10行目でsetcookie()が実行される前に、2行目で出力が行われていることを表しています。
出力バッファが設定されている場合には、出力を行った後でsecookie()を実行できます。これは設定ファイルのoutput_bufferingで設定します。
output_buffering = On
バッファのサイズは数値で任意に指定できますが、「On」と指定したときには最大値の4096を指定したと解釈されます。
$_COOKIE変数から読み込みます。これは連想配列で、クッキーの名前をキーとして値が格納されています。
echo $_COOKIE[ 'sample' ];
たとえば前述の例で書き込んだ内容は、print_r( $_COOKIE )
で出力すると、
Array ( [name1] => abc [name2] => 256 [name3] => 日本語 )
のように格納されていることがわかります。
なおクッキーの値は、URLデコードされて読み込まれます。また書き込んだクッキーが有効となるのは次にページをロードしたときのため、それまでは読み込むことができません。
有効期限に過去の時刻を設定して書き込むことで、指定された名前のクッキーが削除されるようにブラウザを誘導できます。ただし実際に削除するかどうかはブラウザが決定するため、確実に削除される保証はありません。
setcookie( 'sample', '', time() - 3600 );
有効期限はクライアントの現在時刻に対して比較されます。よってクライアントの時刻設定が不正確な場合には、time()関数で取得したサーバの時刻と比較しても、削除されない可能性があります。よって本来ならば1秒前の時刻でも良いところを、3600秒前の時刻を指定しています。このとき3600秒としているのは、それがちょうど1時間という以外に意味はないようです。