有効期限付きクッキー
有効期限の設定方法
今回は早速クッキーに有効期限をつけてみたいと思います。クッキーに有効期限を指定するには、setcookie()関数の第3引数に日時を指定すればいいだけです。
日時の指定方法は
- time() + 60; // 現在時刻から1分後
が「1分」を表わしますので、これをお好きな有効期限に直すだけです。どうしてこれが1分を表わすのかが分からない人は日付・時刻処理で時刻関連の処理を解説していますので参考にして下さい。
例えば、15分後としたければ
- time() + 60 * 15; // 現在時刻から15分後
1時間後としたければ
- time() + 60 * 60; // 現在時刻から1時間後
- time() + 3600; // 60*60の計算結果を記述しただけ
1日後としたければ
- time() + 24 * 3600; // 1日後
1週間後としたければ
- time() + 7 * 24 * 3600; // 1週間後
などのように記述していきます。
クッキーの有効期限
上記のように時間の指定をするととっても簡単に有効期限付きのクッキーが出来上がります。
- $expire = time() + 60 * 15 // 15分有効
- setcookie('クッキー名', 'クッキー値', $expire);
これで15分間有効のクッキーの出来上がりです。掲示板やメールフォームで使う場合は15分じゃ何の役にも立たないでしょうから、1週間とか1ヶ月とかに設定するといいかもしれませんね。
それでは実際に訪問回数カウンターに有効期限を付けてみます。以下のスクリプトではクッキーの有効期限を10秒に設定しています。アクセスから10秒以上経つとクッキーの有効期限が切れますので、カウント値が戻ります。
訪問回数カウンター:有効期限付
- // 訪問回数カウント用の変数$visitにカウント値を格納
- if( isset($_COOKIE['visitcount']) ){ // クッキーがあればその値がカウント値
- $visit = $_COOKIE['visitcount'];
- } else{ // クッキーがなければ初回訪問としてカウント値は0
- $visit = 0;
- }
- $visit++; // カウント値+1
- setcookie('visitcount', $visit, time()+10); // 10秒有効のクッキーを設定
- echo '訪問回数:' . $visit;
出力結果
更新ボタンをクリックして訪問回数を上げたら、そのまま10秒以上待ちます。10秒経って再度アクセスすると訪問回数が1に戻りますのでお試し下さい。
リダイレクト処理
さて、クッキーを送信したら、そのクッキーを受け取れるのは次にページをアクセスした時からです。つまり、送信したページでは受け取れないという事になりますが、どうしてでしょうか。
- ブラウザがサーバにリクエスト(ファイルを見せて欲しいと要求)
- サーバがファイル内のPHPを実行(ここでクッキー処理)
- サーバがブラウザにレスポンス(実行し終わったファイル内容を返す)
- 通信終了
クッキーはブラウザからのリクエスト時に自動で送信されてきますが、初回のアクセスの場合、クッキーはまだセットされていないのでブラウザからは何も送られてきません。
そこでブラウザにクッキーを送信するわけですが、PHPを実行する段階ではブラウザからのデータ送信は既に終了してしまっているのです。これはHTTPという通信自体が「リクエスト」と「レスポンス」のみで成り立っており、レスポンスが返された時点で通信が終了してしまう、という特性のためですが、送信したクッキーをすぐに使いたい場合などこれでは困る場合もあります。
そのような時のためにちょっとリダイレクトを紹介しておきます。
HTMLで別のページにジャンプさせる時の<meta>タグのrefreshを覚えているでしょうか。
<meta http-equiv="refresh" content="URL=http://xxx.com/">
これと同じ事をするのがリダイレクトです。クッキーを送信したら、リダイレクトを使って同じページをもう1度読み込み直せばいいわけです。
PHPではheader()という関数を使用する事でリダイレクトができます。
参考関数
- header() ---- HTTPヘッダを送信する
書式
- header( string string [, bool replace [, int http_response_code ]] )
header()関数は少しややこしい上に、本題から外れるので、今はリダイレクトの方法だけを覚えてもらいます。記述方法は以下の通りです。http://のところは適宜書き換えて下さい。
- header("Location: http://xxx.com/");
HTMLの<meta>では<head>タグ内に記述する、という条件があったと思いますが、このheader()関数はヘッダを送信する関数ですので、クッキー処理の時と同様に全ての出力の前に記述しておく必要があります。
さて、これを「現在のページを読み込みなおす」のようにするにはこのようにします。
- header( "Location: " . $_SERVER['PHP_SELF'] );





