セッション変数、終了
セッション変数
セッションIDとともに、任意の名前を付けたセッション変数を利用することができます。つまりセッションを利用すれば、ページを移動しても任意の値を持ち歩くことができるということです。
セッション変数は、スーパーグローバル変数$_SESSIONで管理します。
たとえば$_SESSION["name"]="nisizawa"とすれば,$_SESSION["name"]という変数に「nisizawa」というデータが保管され、他のWebページに移動してもこの値を利用することができます。
■セッション変数を使う
次の2つのスクリプトを作成して、「ses_var_test1.php」を実行すると、$_SESSION["name"]に「nisizawa」の文字列を代入してから1秒後に、別のWebページ(ses_var_test2.php)に移動。そこで運んできたセッション変数nameの値である「nisizawa」を表示します。
ses_var_test1.php
<?php
session_start();
print "セッション変数を代入します";
$_SESSION["name"]="nisizawa";
header("refresh:1;URL=ses_var_test2.php");
?>
ses_var_test2.php
<?php
session_start();
print "運んできたセッション変数の値は:";
print $_SESSION["name"];
?>
実行結果
ここで注意しなければならないのは、同じセッションで扱いたいページでは先頭で必ずsession_start関数を実行する必要があるということです。
そうしないとセッションが継続されません。「c:¥xampp¥tmp」にあるセッションIDのファイルを確認すると、次のように表示されます。このようにセッション変数はサーバー側のセッションIDのファイルに書き込まれます。
サーバー側に保存されるセッションIDの内容
■セッション変数による回数表示
よく紹介される例ですが、次は「kaisuu」という名前のセッションにページを閲覧した回数を保管する例です。
ブラウザを閉じれば回数はリセットされます。ブラウザを表示した状態で、F5などで更新して機能を確認してください。
kaisuu.php
<?php
session_start();
if(!isset($_SESSION["kaisuu"])){
$_SESSION["kaisuu"]=1;
}else{
$_SESSION["kaisuu"]++;
}
print "回数は".$_SESSION["kaisuu"];
?>
実行結果
1回目のアクセス
2回目のアクセス
セッションの終了
セッションは、ブラウザを閉じたから終了するというものではありません。セッションを完全に終了するには、実は次のような3つの手続きが必要となります。
①session_destrou関数によるセッション終了とデータ削除
②セッション変数のクリア
③クライアントのCookie削除
●session_destroy
書式 session_destroy()
機能 セッションに関連するデータを破棄する
送り値 成功するとTRUEを、失敗するとFALSEを返す
セッションを終了するときには必須の手続きです。ただしsession_destroy関数は、サーバー側のセッションIDしか削除しません。
●セッション変数のクリア
session_destroy関数を実行しても$_SESSION変数のデータはメモリ上に生きています。たとえばセッションの処理で一度定義した変数$_SESSION['kaisuu']は、session_destroy関数実行後も存在し、その値を保持し続けます。そのため明示的に削除しておいた方が安全です。
arrayは配列を生成するものでしたが、引数を指定しないで実行すると配列を初期化することができます。
配列の初期化
$配列変数 = array()
$_SESSIONを初期化する場合は、次のようにします。
$_SESSION = array();
●クライアントのCookie削除
Cookieを削除するときは、「有効期限」に過去の期限を指定してsetcookie関数を実行するのでしたね。セッションの情報は一般には$_COOKIE["PHPSESSID"]に保存されるので、たとえば次を実行することでセッションの関連のCookieが削除できます。
if (isset($_COOKIE["PHPSESSID"])){
setcookie("PHPSESSID","",time()-3600,"/");
}
$_COOKIE["PHPSESSID"]がセットされていたら、「PHPSESSID」に""(空白)を入れて過去の「有効期限」を指定してsetcookieを実行するという処理です。
実はsetcookie関数の第4番目の引数にはCookieを有効にする場所(パス)を指定することができます。ここに「/」を指定するとCookieはすべての場所で有効となります。
セッションのCookieを削除するときはこの「/」も付けておきましょう。
■セッションの終了と確認のプログラム
では、セッションの終了を実際に試してみることにしましょう。せっかくですので、実際に「セッション変数のクリア」と「セッション関連のCookie削除」が行われているかどうかも確認してみることにしましょう。
session_end1.php
<?php
session_start();
print "<p>●セッションを開始しました●</p>";
$_SESSION["a"] = "セッションに保存したデータ</p>";
print "<p>●セッション変数aにデータを保存しました●</p>";
print "<p>●下をクリックして次ページに移動してください●</p>";
print "<p><A HREF='session_end2.php'>クリック</A></p>";
?>
実行結果
1ページ目では、セッションを開始したセッション変数aに「セッションに保存したデータ」というデータを代入しています。確認したら、「クリック」をクリックしてください。
session_end2.php
<?php
session_start();
print "<p>●設定されたセッションのデータを表示します●</P>";
print_r($_SESSION); ①
print "<p>●Cookieのセッション情報を表示します●</p>";
print "<p>".$_COOKIE["PHPSESSID"]."</p>"; ②
print "<p>●ではここでセッションを終了します●</P>";
session_destroy();
$_SESSION = array();
if(isset($_COOKIE["PHPSESSID"])){
setcookie("PHPSESSID","",time()-3600,"/");
}
print"<p>●セッションを終了しました●</p>";
print"<p>●下をクリックして次ページに移動してください●</p>";
print"<p><a href='session_end3.php'>クリック</a></p>";
?>
実行結果
2ページ目ではまず、1ページ目に設定されたセッションの内容を表示します①。
print_r($_SESSION)で、配列変数$_SESSIONのすべての要素が表示されます。
②ではセッションIDの値を表示しています。
画面には「Array()」や「e8sgkdkq5enikf8topnbmk9je0」などが表示されているので、ちゃんとセッションの情報が設定されたことがわかります。
プログラムではさらに「セッション終了の3つの手続き」を実行して、セッションを終了しています。内容を確認したらリンクをクリックしてください。
session_end3.php
<?php
session_start();
print "<p>●セッション終了後のセッション情報をチェックします●</p>";
print "<p>●セッション変数を表示します●</p>";
print_r($_SESSION);
print "<p>●Cookieのセッション情報を表示します●</p>";
print "<p>".$_COOKIE["PHPSESSID"]."</p>";
?>
実行結果
3ページ目ではセッション終了後の、セッションに関する情報を確認しています。
print_r($_SESSION)で表示されるのは「Array()」のみで、配列の要素は何も表示されません。これですべてのセッション変数が初期化されたということがわかります。
また、セッションIDの値を表示させようとしているところでは「Notice:Undefined index:PHPSESSID in...」と警告が表示されてしまします。この警告は「PHPSESSID」が定義されていないことによるものです。これによって、セッション情報が保管されていたCookie「PHPSESSID」が無事削除されたことがわかります。
練習問題
1回目に閲覧すると「ようこそ1回目のご来場」、ブラウザを閉じないで2回目以降に閲覧すると、「1回目はxxxx年xx月xx日xx時xx分xx秒でした」「2回目は~」...のような形式ですべての閲覧の記録を表示するPHPスクリプトを、セッションを使って作成してください。
session_kako.php
<?php
session_start();
if(!isset($_SESSION["kaisu"])){
print "ようこそ1回目のご来場";
$_SESSION["kaisu"]=1;
$_SESSION["kako"][1]=date("Y年m月j日H時i分s秒");
}else{
$_SESSION["kaisu"]++;
$c = $_SESSION["kaisu"];
$_SESSION["kako"][$c]=date("Y年m月j日H時i分s秒");
for ($i = 1;$i <=$c; $i++){
print $i."回目は".$_SESSION["kako"][$i]."でした<br>";
}
}
?>
実行結果
1回目のアクセス
5回目のアクセス