PHPプログラミング

最終更新日:
公開日:

入門

第5章 クッキーとセッション

この章では、PHPのクッキーとセッションの扱い方を学びます。JavaScriptに触れたことがある方は、クッキーはお馴染みの存在かもしれません。PHPからもクッキーを操作することができます。

目次

クッキーとセッションの違い

まずは2つの違いから見ていきましょう。図1を見てください。

図1:クッキーとセッションの保存場所

クッキーとセッションの保存場所

クッキーはブラウザ経由でクライアント側の端末(パソコンやスマホ)に保存されます。一方で、セッションはサーバー側へ保存されるデータです。このように、保存される場所が異なっているところが1つの大きな違いです。

基本的にはセッションを使用することをオススメします。
クッキーはクライアント側に保存されるので、意図しないタイミングで消されてしまったり、端末の環境設定によって使用が制限されてしまうことがあるためです。また、クライアント側に保存されるという性格上、データを悪用されるのではないかというネガティブな印象からユーザーに好まれない傾向があります。

クッキーの作成

クッキーの扱い方から見ていきましょう。
ユーザーの名前を保存するとしたら、「code5-1.php」のようになります。

code5-1.php

<?php
// クッキーを生成
setcookie( "UserName", "Jack", time()+60*5);

このコードを実行すると、新しいクッキーが1つ生成されます。
PHPからクッキーを作成する場合は、setcookie関数を使います。
関数の中で「UserName」、「Jack」、「time()+60*5」と3つの値を渡していますが、これらを「引数」と言います。

1つ目の引数「UserName」は生成するクッキーの名前、2つ目の引数はクッキーに設定する値、3つ目の引数はクッキーの保存期間の指定です。
ここで指定した保存期間を過ぎると、ブラウザが削除してくれます。

引数の中で3つ目の「time()+60*5」が少し複雑なので、もう少し詳しく解説します。
3つ目の保存期間は「クッキーを生成した時間から、どれだけの時間が経過したら削除するか」という形で指定します。なので、まずはtime関数で現在の時刻を「秒」単位で取得します。そして取得した時間に「60*5」で5分間を足し、「生成したクッキーを5分後に削除」と指定していることになります。

したがって、もし保存期間を1時間に設定したい場合はtime()+60*60となり、1日であればtime()+60*60*24です。
ユーザーの端末内の容量を一時的に借りて保存する性格上、保存期間は指定するようにした方が親切です。指定しなかった場合はブラウザを閉じたタイミングで削除されます。

クッキーから値を取得

作成したクッキーは、スーパーグローバルの$_COOKIEからアクセスすることができます。先ほど作成したコードに、出力する1行を加えてみましょう。

code5-1.php(修正)

<?php
// クッキーを生成
setcookie( "UserName", "Jack", time()+60*5);

var_dump($_COOKIE['UserName']);

ブラウザで実行すると、クッキーが生成できていたら設定した値が出力されます。

ブラウザ出力例:

string(4) "Jack"

クッキーの削除

不要になったクッキーは、保存期間に関わらず削除しておくと親切です。
削除もsetcookie関数を使って簡単に行うことができます。

code5-1.php(修正)

// 削除方法1:クッキーの値に「null」か「false」を設定する
setcookie( "UserName", null);
// または、setcookie( "UserName", false);

// 削除方法2:クッキーの保存期間に、現時刻より前の時間を設定する
setcookie( "UserName", "", time()-1);

方法1は空の値を設定することで削除し、方法2は保存期間を強制的に終了させることで削除しています。
どちらの方法でも削除することができますが、方法1の方が引数が少なく済むので使い勝手が良いです。

セッションの生成

クッキーの扱い方を一通り見てきたので、次はセッションです。
セッションの生成は関数を使わずに、スーパーグローバルを使って直接作ることができます。
しかし、セッションの使用をする前にsession_start関数を実行する必要があることに注意してください。この関数は、「これからセッションの使用を開始します」という宣言になります。
試しに「code5-2.php」を作成し、ブラウザで実行してみてください。

code5-2.php

<?php
session_start();

$_SESSION['UserName'] = "Willson";
$_SESSION['Gender'] = "Male";

ちなみにセッションは先述の通り、アクセスした端末(PCやスマホ)ごとにサーバー内へ作成されるものなので、端末側でブラウザを終了してもサーバー内のセッションは期限が来るまで削除されることはありません。

セッションの取得

セッションの取得はスーパーグローバルの$_GET$_POSTと同様の方法で行います。
「code5-2.php」を次のように修正し、実行してみてください。

code5-2.php(修正)

<?php
session_start();

// セッションの作成部分をコメントアウト
//$_SESSION['UserName'] = "Willson";
//$_SESSION['Gender'] = "Male";
var_dump($_SESSION);

ブラウザで実行すると、先ほど作成した全てのセッションの値が出力されます。
もし複数のブラウザをインストールしていたら、別のブラウザでも実行してみてください。
セッションはブラウザを跨いで同じデータにアクセスすることができるので、同じ内容が出力されると思います。

ブラウザ出力例:

array(2) { ["UserName"]=> string(7) "Willson" ["Gender"]=> string(6) "Gender" }

セッションの削除

セッションのデータを削除するには、個別に削除する方法と全て一括で削除する方法があります。
まずは個別に削除する方法から見ていきましょう。「code5-2.php」を次のように修正してください。

code5-2.php(修正)

<?php
session_start();

// セッションの作成部分をコメントアウト
//$_SESSION['UserName'] = "Willson";
//$_SESSION['Gender'] = "Male";
unset($_SESSION["Gender"]);
var_dump($_SESSION);

実行すると、性別データである「Gender」が削除されるので、名前データの「UserName」のみが出力されるようになります。

ブラウザ出力例:

array(1) { ["UserName"]=> string(7) "Willson" }

次に一括で全てのセッションを削除してみます。一旦、次のようにコードを修正してセッションを登録しなおしてください。

code5-2.php(修正)

<?php
session_start();

$_SESSION['UserName'] = "Willson";
$_SESSION['Gender'] = "Male";
$_SESSION['Age'] = 30;
//unset($_SESSION["Gender"]);
var_dump($_SESSION);

実行すると、以下のように3つのセッションデータが出力されます。

ブラウザ出力例:

array(3) { ["UserName"]=> string(7) "Willson" ["Gender"]=> string(6) "Gender" ["Age"]=> int(30) }

セッションが3つ登録されていることを確認した上で、一括削除をするsession_destroy関数を呼び出します。

code5-2.php(修正)

<?php
session_start();

//$_SESSION['UserName'] = "Willson";
//$_SESSION['Gender'] = "Male";
//$_SESSION['Age'] = 30;
session_destroy();
var_dump($_SESSION);

実行すると、以下のようにセッションが空になっていることを確認できます。
※コード修正後にブラウザをリロードするとセッションは削除されますが、メモリ内にセッションの中身が残っていてvar_dump関数などで表示できてしまいます。その場合、もう一度リロードしてみてください。

ブラウザ出力例:

array(0) { }

これで、セッションが削除されたことを確認できました。

もちろん、一括削除といってもアクセスした端末に対するセッションのみが対象になります。サーバー内にある他の端末に対して生成したセッションは削除されませんので安心してください。

まとめ

クッキーとセッションの扱い方をみてきました。この2つを扱えるようになると、会員制サイトなどでユーザーのログイン状態を管理することができるようになります。

この章で学んだこと

  • クッキーはクライアント側の端末へ保存され、セッションはサーバーへ保存される
  • クッキー、セッションは同じブラウザであれば別タブ間でも同じデータにアクセスできる
  • クッキーの生成にはsetcookie関数を使用し、「クッキー名」「値」「保存期間」を指定する
  • 不要になったクッキーは、生成と同じsetcookie関数で削除をする
  • セッションの生成はスーパーグローバルの$_SESSIONを使用する
  • セッションの削除は、個別に削除する場合はunset関数を、一括削除する場合はsession_destroy関数を使用する

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。