PHPのセッションの値が取得できない場合の対処法です。
PHPでセッションの値が取得できないは、以下の手順で確認してみてください。
セッションは、ユーザー(クライアント)側の状態をサーバー側が保持する仕組みです。
それに対して、サーバーとのやり取りの内容や履歴をクライアント側で保持する仕組みはクッキーです。
(セッションを使う場合は、クッキーも同時に使います。セッションIDだけをクッキーとして保存します。)
セッション管理の流れは、
1.サーバー側がユーザーを特定
2.ユーザーの状態(情報)をサーバー側が保持
です。
1.のサーバー側がユーザーを特定する材料は、サーバーが振り分けるセッションIDです。
セッションIDは、通常クッキーとしてブラウザ(ユーザー)が保存し、Webサイトにアクセスするときに送信します。
サーバー側ではそのセッションIDをキーにして情報を保存します(セッションファイル)。
サーバが保存したり読み込んだりするユーザーの情報は、セッション変数($_SESSION)が使用されます。
なお、この仕組みはクライアント側がクッキーを有効にしている場合です。
ちなみにクッキーを無効にしている場合は、URLにセッションIDを埋め込む方法があり、
これによりサーバー側でセッションを識別することが可能となります。(他のWebページを参照してください)
まずは、セッションファイルが正しく保存されているか確認します。
プログラムは何でもいいですが、ここではPHP マニュアルのコードで説明します。
session_start() が新しいセッションを開始、あるいは既存のセッションを再開する関数です。
再開時はセッション ID に基づき現在のセッションを復帰し、
セッションデータをセッションファイルから読み取りセッション変数($_SESSION)に格納します。
<?php
session_start();
if (empty($_SESSION
['count'
])) {
$_SESSION
['count'
] =
1;
} else {
$_SESSION
['count'
]++;
}
?>
<p>
こんにちは、あなたがこのページに来たのは
<?php
echo $_SESSION
['count'
]; ?>
回目ですね。
</p>
<p>
続けるには、<a href="nextpage.php?<
?php echo
htmlspecialchars
(SID
); ?>"
>ここをクリック</A>
してください。
</p>
PHPを実施したときに(session_start()で)、「sess_cgdgcn5ifvlfra83ngos3slp46」のような名前のセッションファイルが保存
されるはずです。内容は「count|i:1;」です。
ここで、「count」はセッション変数名、「1」は値です。
保存先は、標準ではサーバ上の「tmp」というフォルダーですが、session_save_path() で
保存パスを設定している場合は指定したフォルダーに保存されます。
「ここをクリック」を行った場合、または再度PHPを実施した場合に新たなセッションファイルが保存されず
ファイルの内容が「count|i:2;」のように値のカウントアップがされていれば、セッションの値が取得されて
いることになります。
クッキーがない状態で、 http://www.example.com/test.php とセッションを発行するページにアクセスすると、
クッキーを書く命令がサーバーからは返されます。
逆に、セッションIDがクッキーにある状態でアクセスすると、クッキーを書く命令はサーバーからは返されません。
ここで、セッションパラメータ、セッション名、セッションIDなどを確認しましょう。
$array = session_get_cookie_params();
echo "クッキーの生存期間(lifetime) : ", $array['lifetime'],"<br>";
echo "情報が保存されている場所のパス(path) : ", $array['path'],"<br>";
echo "クッキーのドメイン(domain) : ", $array['domain'],"<br>";
echo "クッキーはセキュアな接続でのみ送信(secure) : ", $array['secure'],"<br>";
echo "クッキーは HTTP を通してのみアクセス可能(httponly) :", $array['httponly'],"<br>";
echo "<br>";
echo "セッションチェック: ", $_SESSION['count'],"<br>";
echo "現在のセッション名は ". session_name() ." です。<br>";
echo "現在のセッションIDは ". session_id() ." です。<br>";
echo "現在のセッションデータは ". session_save_path() ."に保存されています。<br>";
上記の確認で問題ないのにセッション動作がうまくいかない場合は、
サーバーのphp.iniファイルでディレクティブ output_bufferingの値を
output_buffering=On または4096にしてみてください。
このoutput_buffering は、 いつどこで設定できるのかのモードがPHP_INI_PERDIR なので、 ini_set() で設定することはできません。
この設定を/tmp(デフォルト)のようにどこか らでも読み込み可能なディレクトリのままにしている場合、サーバー上 の他のユーザーがこのディレクトリのファイルのリストを取得すること により、セッションをハイジャックをすることが可能となります。