|
8.2 セッションの継続
セッションはセッションIDで管理されます。したがって、複数のPHPファイル間を同一セッションとみなして処理するためには、セッションIDをPHPファイル間で引き渡す必要があります。
■セッションIDの引渡し方法
PHPファイル間でセッションIDを引き渡す方法はいくつかあります。
(1)Cookieが使用できない場合
a)URLのパラメータとしてGETメソッドでセッションIDを渡す。
1)PHPの設定パラメータ「session.use_trans_sid」が1に指定されている場合
ハイパーリンクの相対URLに、URL Rewriting機能により自動的にセッションIDが追加され、次のファイルに引き渡されます。
PHPの設定パラメータ「session.use_trans_sid」を1に指定する方法には次の二つがあります。
・PHPのコンパイル時にオプションとして「--enable-trans-sid」を指定する。
・php.iniファイルで設定オプション「session.use_trans_sid」を1にし、Apacheをrestartする。
なお、php.iniファイルの既定のディレクトリは/usr/local/lib/php.iniです。
2)PHPの設定パラメータ「session.use_trans_sid」が0に指定されている場合
ハイパーリンクのURLに、定数SIDを記述し、セッションIDを次のファイルに引き渡します。たとえば、以下のように記述します。
<a href="next.php?<?=SID?>">次ページ</a>
Cookieが使用できない場合、定数SIDには、セッション名=セッションIDが代入されます。たとえば、次のように置換されます。
<a href="next.php?PHPSESSID=5fb6b70b37b53114518ce19ac215e8ea">次ページ</a>
b)HTMLフォームのhiddenコントロールとしてセッションIDを引き渡す。
たとえば、以下のように記述します。
<input type="hidden" name="<?=session_name()?>"
value="<?=session_id()?>">
具体的には、例えば、以下のように代入されます。
<input type="hidden" name="PHPSESSID"
value="5fb6b70b37b53114518ce19ac215e8ea">
(2)Cookieが使用できる場合
Cookieを使用してセッションIDが引き渡されます。
■URL Rewriting機能によるセッションIDの引渡し
Cookieが使用できない場合は、URLのパラメータとしてGETメソッドでセッションIDを引き渡す方法があります。PHPの設定パラメータ「session.use_trans_sid」が1に指定されている場合は、ハイパーリンクの相対URLに、URL
Rewriting機能により自動的にセッションIDが追加され、次のファイルにセッションIDが引き渡されます。
PHPの設定パラメータ「session.use_trans_sid」を1に設定するには、(1)PHPのコンパイル時にオプションとして「--enable-trans-sid」を指定する方法と(2)php.iniファイルで設定オプション「session.use_trans_sid」を1にし、Apacheをrestartする方法があります。ここでは、後者の方法で実行してみます。なお、php.iniファイルの既定のディレクトリは/usr/local/lib/php.iniです。
次のリストのように/usr.local/lib/php.iniファイルで、「session.use_trans_sid
= 1」とし、Apacheをrestartします。
リスト php.iniファイルの一部
; trans sid support is disabled by default.
; Use of trans sid may risk your users security.
; Use this option with caution.
; - User may send URL contains active session ID
; to other person via. email/irc/etc.
; - URL that contains active session ID may be stored
; in publically accessible computer.
; - User may access your site with the same session ID
; always using URL stored in browser's history or bookmarks.
session.use_trans_sid = 1
この時点で、http://igux.mc.yc.musashi-tech.ac.jp/phpinfo.phpにアクセスし、PHPの環境設定パラメータを確認すると下図のように「session.use_trans_sid
= 1」となっています。

以下にサンプルをリストsession_start3.phpを示します。
リスト session_start3.php
<?php
// セッションの開始
session_start();
?>
<html>
<head>
<title>session_start3.php</title>
<!-- セッションの開始:セッション変数の登録 -->
</head>
<body>
<?php
print "session_id = " . session_id() . "<br>";
// セッションIDの出力
print '<br>$_POST[] の内容の確認;<br>';
print_r($_POST);
print "<br>";
if (isset($_POST["name"])) {
$name = $_POST["name"];
$_SESSION["s_name"]=$name; // セッション変数の登録
print "ようこそ!" . $_SESSION["s_name"] . "さん。<br>";
print '$_SESSION[]の内容の確認;<br>';
print_r($_SESSION); // セッション変数の出力
print "<br>";
?>
<a href="session_start3a.php">次ページへ</a><br>
<?php
} else {
?>
<form method="post">
氏名を記入してください。<br>
氏名:<input size="30" type="text" name="name"><br>
<input type="submit" value="登録">
</form>
<?php
}
?>
</body>
</html>
下図のようにブラウザで、Cookieを使用しないように設定します。

以上のような環境で、session_start3.phpファイルにアクセスし、下図のように「氏名」欄に氏名を記入し、「登録」ボタンをクリックします。

下図のWebページが表示されます。

セッションIDが、最初にsession_start3.phpファイルにアクセスした時と同じ値であることがわかります。これは、Cookieが使えず、かつ「session.use_trans_sid
= 1」の場合は、HTMLフォームがある場合は、hiddenコントロールでセッションIDが次ページ(この例では、自分自身のページ)に自動的に引き渡されるためです。
上図で。「次ページへ」のハイパーリンクをクリックします。以下のリストに示すsession_start3a.phpファイルが起動されます。
リスト session_start3a.php
<?php
// セッションの継続
session_start();
$name = $_SESSION["s_name"];
?>
<html>
<head>
<title>session_start3a.php</title>
<!-- セッションの継続 -->
</head>
<body>
次のページです。<br>
<?php
print "session_id = " . session_id() . "<br>";
print '$_GET[] の内容の確認;<br>';
print_r($_GET);
print '<br>$_POST[] の内容の確認;<br>';
print_r($_POST);
print '<br>$_SESSION[]の内容の確認;<br>';
print_r($_SESSION);
print "<br>";
?>
氏名は[<?=$name?>]ですね。<br>
</body>
</html>
表示されるWebページは次のようになります。URLの最後に自動的に「PHPSESSID=セッションID」の形式でセッションIDが付加されています。
http://igux.mc.yc.musashi-tech.ac.jp/php/8/session_start3a.php?PHPSESSID=1e805a09e3f363d87424be78800c0408

セッション変数$_session["s_name"]の値が正しく参照できているのも確認できます。
【補足】
なお、Cookieが使えず、「session.use_trans_sid = 0」の環境で、上記のsession_start3.phpにアクセスし、下図のように氏名を記入し「登録」ボタンをクリックしますと、

下図のように、2回目のsession_start3.phpファイルにアクセスした場合は、別のセッションIDの値に設定されて、セッションが継続していません。これは、HTMLフォームのhiddenコントロールで自動的にセッションIDが引き渡されないためです。

上図で、「次ページへ」のハイパーリンクをクリックすると、session_start3a.phpファイルが起動され次図のようにWebページが表示されます。

この場合も、セッションIDは新しい別の値で、直前のセッションが引き継がれていません。これは、URL Rewritingが実行されず、session_start3.phpファイルからsession_start3a.phpファイルにセッションIDが引き渡されなかったためです。したがって、session_start3a.phpファイルで生成されたセッションではセッション変数$_SESSIONは空で,直前のセッションのセッション変数$_SESSION["s_name"]を参照することができなかったことがわかります。
■URLに定数SIDを追加記述してセッションIDを引き渡す方法
Cookieが使用できない場合は、URLのパラメータとしてGETメソッドでセッションIDを引き渡す方法があります。PHPの設定パラメータ「session.use_trans_sid」が0に指定されている場合は、ハイパーリンクのURLに、定数SIDを追加記述し、次のファイルにセッションIDを引き渡すことができます。
Cookieが使用できない場合、定数SIDには、セッション名=セッションIDが代入されます。
サンプルをリストsession_start4.phpに示します。
リスト session_start4.php
<?php
// セッションの開始
session_start();
?>
<html>
<head>
<title>session_start4.php</title>
<!-- セッションの開始:セッション変数の登録 -->
</head>
<body>
<?php
print "session_id = " . session_id() . "<br>";
// セッションIDの出力
print '<br>$_POST[] の内容の確認;<br>';
print_r($_POST);
print "<br>";
if (isset($_POST["name"])) {
$name = $_POST["name"];
$_SESSION["s_name"]=$name; // セッション変数の登録
print "ようこそ!" . $_SESSION["s_name"] . "さん。<br>";
print '$_SESSION[]の内容の確認;<br>';
print_r($_SESSION); // セッション変数の出力
print "<br>";
?>
<a href="session_start3a.php?<?=SID?>">次ページへ</a><br> <!--
定数SIDの記述 -->
<?php
} else {
?>
<form method="post">
氏名を記入してください。<br>
氏名:<input size="30" type="text" name="name"><br>
<input type="submit" value="登録">
</form>
<?php
}
?>
</body>
</html>
session_start4.phpファイルにアクセスし、下図のように「氏名」欄に氏名を記入し、「登録」ボタンをクリックします。

下図のWebページが表示されます。セッションIDが直前の値と異なることがわかります。これはsession_start4.phpファイルに2回目にアクセスするときにセッションIDが引き渡されなかったために、新たなセッションが生成されたためです。

「次ページへ」のハイパーリンクをクリックすると、次図のようなWebページが表示されます。

今度は、直前のセッションIDが引き継がれているのがわかります。これは、 「次ページへ」のハイパーリンクのURLに定数SIDを以下のように記述したことにより、定数SIDが「PHPSESSID=セッションID」のように展開され、GETメソッドで次のsession_start3aファイルにセッションIDが引き渡されたことによります。
<a href="session_start3a.php?<?=SID?>">次ページへ</a><br>
ブラウザのURLは、以下のようになって、「PHPSESSID=df086c6291ecebe4eac6112b38de0416」の部分が追加されていることがわかります。
http://igux.mc.yc.musashi-tech.ac.jp/php/8/session_start3a.php?PHPSESSID=df086c6291ecebe4eac6112b38de0416
【補足】
なお、下図のように、Cookieが使える場合は、状況が異なります。

session_start4.phpファイルにアクセスし、氏名を記入し「登録」ボタンをクリックすると次図のWebページが表示されます。

さらに、「次ページへ」のハイパーリンクをクリックすると、次図のWebページが表示されます。URLにはセッションIDが付加されていないのですが、セッションIDは直前のsession_start4.phpファイルからsession_start3a.phpファイルに引き渡されていることが分かります。これはCookieによりセッションIDが引き渡されたことによります。

■HTMLフォームのhiddenコントロールでセッションIDを引き渡す方法
Cookieが使用できない場合は、HTMLフォームのhiddenコントロールでセッションIDを引き渡すことができます。
サンプルをリストsession_start6.phpに示します。つまり、以下のように記述します。
<input type="hidden" name="<?=session_name()?>"
value="<?=session_id()?>">
リスト session_start6.php
<?php
// セッションの開始
session_start();
?>
<html>
<head>
<title>session_start6.php</title>
<!-- セッションの開始:セッション変数の登録 -->
</head>
<body>
<?php
print "session_id = " . session_id() . "<br>";
// セッションIDの出力
print '<br>$_POST[] の内容の確認;<br>';
print_r($_POST);
print "<br>";
print '<br>$_COOKIE[] の内容の確認;<br>';
print_r($_COOKIE);
print "<br>";
if (isset($_POST["name"])) {
$name = $_POST["name"];
$_SESSION["s_name"]=$name; // セッション変数の登録
print "ようこそ!" . $_SESSION["s_name"] . "さん。<br>";
print '$_SESSION[]の内容の確認;<br>';
print_r($_SESSION); // セッション変数の出力
print "<br>";
?>
<!-- hiddenコントロールによるセッションIDの引渡し -->
<form action="session_start6a.php" method="post">
<input type="hidden" name="<?=session_name()?>"
value="<?=session_id()?>">
<input type="submit" value="次ページ">
</form>
<?php
} else {
?>
<form method="post">
氏名を記入してください。<br>
氏名:<input size="30" type="text" name="name"><br>
<input type="submit" value="登録">
</form>
<?php
}
?>
</body>
</html>
サンプルのリストsession_start6a.phpを以下に示します。
リスト session_start6a.php
<?php
// セッションの継続
session_start();
$name = $_SESSION["s_name"];
?>
<html>
<head>
<title>session_start6a.php</title>
<!-- セッションの継続 -->
</head>
<body>
次のページです。<br>
<?php
print "session_id = " . session_id() . "<br>";
print '$_GET[] の内容の確認;<br>';
print_r($_GET);
print '<br>$_POST[] の内容の確認;<br>';
print_r($_POST);
print '<br>$_SESSION[]の内容の確認;<br>';
print_r($_SESSION);
print "<br>";
print '<br>$_COOKIE[]の内容の確認;<br>';
print_r($_COOKIE);
print "<br>";
?>
氏名は[<?=$name?>]ですね。<br>
</body>
</html>
session_start6.phpファイルにアクセスし、氏名を記述し、「登録」ボタンをクリックします。

次図のWebページが表示されます。次に「次ページ」ボタンをクリックします。

session_start6a.phpファイルが起動され、次図のWebページが表示されます。セッションIDがPOSTメソッドにより引き渡されているのがわかります。

■CookieによるセッションIDの引渡し方法
ブラウザが次図のようにCookieの利用を許容している場合は、CookieによりセッションIDをphpファイル間で引き渡すことが可能になります。

サンプルをリストsession_start5.phpに示します。
リスト session_start5.php
<?php
// セッションの開始
session_start();
?>
<html>
<head>
<title>session_start5.php</title>
<!-- セッションの開始:セッション変数の登録 -->
</head>
<body>
<?php
print "session_id = " . session_id() . "<br>";
// セッションIDの出力
print '<br>$_POST[] の内容の確認;<br>';
print_r($_POST);
print "<br>";
print '<br>$_COOKIE[] の内容の確認;<br>'; // クッキー変数の出力
print_r($_COOKIE);
print "<br>";
if (isset($_POST["name"])) {
$name = $_POST["name"];
$_SESSION["s_name"]=$name; // セッション変数の登録
print "ようこそ!" . $_SESSION["s_name"] . "さん。<br>";
print '$_SESSION[]の内容の確認;<br>';
print_r($_SESSION); // セッション変数の出力
print "<br>";
?>
<a href="session_start5a.php?<?=SID?>">次ページへ</a><br>
<!-- 定数SIDの記述 -->
<?php
} else {
?>
<form method="post">
氏名を記入してください。<br>
氏名:<input size="30" type="text" name="name"><br>
<input type="submit" value="登録">
</form>
<?php
}
?>
</body>
</html>
サンプルのリストsession_start5a.phpを以下に示します。
リスト session_start5a.php
<?php
// セッションの継続
session_start();
$name = $_SESSION["s_name"];
?>
<html>
<head>
<title>session_start5a.php</title>
<!-- セッションの継続 -->
</head>
<body>
次のページです。<br>
<?php
print "session_id = " . session_id() . "<br>";
print '$_GET[] の内容の確認;<br>';
print_r($_GET);
print '<br>$_POST[] の内容の確認;<br>';
print_r($_POST);
print '<br>$_SESSION[]の内容の確認;<br>';
print_r($_SESSION);
print "<br>";
print '<br>$_COOKIE[]の内容の確認;<br>';
print_r($_COOKIE);
print "<br>";
?>
氏名は[<?=$name?>]ですね。<br>
</body>
</html>
session_start5.phpファイルにアクセスし、氏名を記入し、「登録」ボタンをクリックします。

以下のWebページが表示されます。セッションIDが前のページと同じですこれはCookie変数によりセッションIDが引き渡されているからです。

「次ページへ」のハイパーリンクをクリックします。次図のWebページが表示されます。セッションIDがCookie変数により引き渡されているのが分かります。なお、URLにはセッションIDが付記されていません。これは、Cookieが有効な場合は、URLに記述された定数SIDは無視されるためです。

|