クッキーとセッションに関するメモ。
PHPでWebブラウザにデータを保存する(クッキーを送信する)場合は、setcookie()関数を使う。
bool setcookie ( string $name , string $value , int $expire , string $path , string $domain )
setcookie() は、その他のヘッダ情報と共に 送信するクッキーを定義する。 ほかのヘッダ情報と同様に、 クッキーは、スクリプトによる他のあらゆる出力よりも前に 送信される必要がある(これはHTTPプロトコルの制約)。 <html> や <head> タグはもちろん 空白も含め、あらゆる出力よりも前にこの関数をコールするようにしなければならない。
つまり、setcookie()関数が含まれる「<?php」タグの前に、HTMLタグやHTMLコメント、文字あるいは空白を書いてしまうと「Warning … headers already sent by」というエラーが表示され、クッキーは送信されない。
(注意点)
Web ブラウザに保存されたクッキーは、有効期限内であれば、リクエスト時にブラウザからサーバへ送信される。
送信されたクッキーの値は、スーパーグローバル変数「$_COOKIE」に代入される。例えばクッキー名が「foo」の値を利用するには「$_COOKIE[‘foo’]」とする。
クッキーを使った簡単なカウンターの例
<?php if(!isset($_COOKIE['count'])){ $count = 1; //初回のアクセス }else{ $count = $_COOKIE['count'] + 1; //2回目以降のアクセス } setcookie('count', $count); //クッキーを発行(送信)setcookie ($name , $value) ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Cookie Counter</title> </head> <body> <?php echo 'アクセス回数: ' . $count; ?> </body> </html>
クッキーを削除するには、有効期限を過去に設定する。
setcookie(‘name’, ”, time() – 3600);
引数の順序は名前、値、有効期限なので、値を省略する場合は空文字(”)とする必要がある。
time() – 3600は現在のタイムスタンプから60×60(1時間)引いているので1時間前。特に3600に意味はない。(過去に設定すればいつでも可)
HTTP は1回毎のリクエストが独立していて、通常は同じクライアントからのアクセスかどうかを判別できない。セッションは同じクライアントからの一連のアクセうかどうかを見分ける方法の1つ。ページ遷移を超えて変数を保持できる「セッション変数」と呼ばれる変数も用意されている。
セッションは、ユーザを識別する「セッションID]とWebサーバにデータを保存する「セッション変数」により実現される。
クッキーはデータをWebブラウザに保存するが、セッションはデータ(セッション変数)をWebサーバ上に保存し、セッションIDだけをクッキーに保存する。
session_start()関数は、必ず、Webブラウザへの出力が行われる前に、呼び出す必要がある。(setcookie()関数と同様、HTTPプロトコルの制約)
session_start()関数を呼び出した後は、セッション変数「$_SESSION」が使えるようになり、データを保存することができる。セッション変数は、セッションを終了するまでページを移動しても利用することが可能。
session_start()関数はセッションを開始するが、データは何もセットされないのでセッション変数($_SESSION)にデータを格納する。
標準ではセッション変数は、セッションファイルに保存され、保存場所はphp.iniの「session.save_path」で指定されている。
session_start(); $_SESSION['username'] = 'mdavis';
セッションを使った簡単なカウンタの例
<?php session_start(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Session Counter</title> </head> <body> <?php if(!isset($_SESSION['count'])){ $_SESSION['count'] = 1; //初回のアクセス }else{ $_SESSION['count'] ++; //2回目以降のアクセス } echo 'アクセス回数: ' . $_SESSION['count']; ?> </body> </html>
session_destroy()関数をつかってセッションを破壊しても、セッション変数は削除されないので、空の配列をセットして削除する。またクッキーを一時的なセッションIDの格納領域としている可能性があるので、そのクッキーも削除する必要がある。
$_SESSION = array(); if(isset($_COOKIE[ session_name()])){ setcookie(session_name(), '', time() - 3600); } session_destroy();
セッションがクッキーを使ってセッションIDを保存している場合、そのIDはセッションの名前を持つクッキーに保存されている。セッションの名前はsession_name()で取得できる