Apache+PHPによる+PostgreSQLによるWebアプリケーション
−入門編−
第8章 セッション管理
前へ | 目次へ |次へ

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は無視されるためです。

 

 


前へ | 目次へ |次へ  | YCポータルサイト

執筆 山田豊通
更新日: 2003年6月26日