たまちゃんHTMLのおうち たまちゃんHTMLのおうち

作成に役立つテクニック   PHPのセッションの値が取得できない

ホーム> リファレンス >  ホームページ作成に役立つテクニック > PHPのセッションの値が取得できない

メニュー

PHPのセッションの値が取得できない(対処法)

PHPのセッションの値が取得できない場合の対処法です。

■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などを確認しましょう。

session_start() の直後に以下のデバッグライトを挿入します。
$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>";

★セッションパラメータ
  クッキーの生存期間(lifetime) :
  
ブラウザに送信するクッキーの有効期間(秒)。 0 を指定すると "ブラウザを閉じるまで" という意味になる。 デフォルトは、0(通常はこれでよい) 。

  情報が保存されている場所のパス(path) :
  
セッションクッキーで設定するパス。 デフォルトは/。このパス以下にあるファイルに対してセッションクッキーが有効となる。

  クッキーのドメイン(domain) :
  
セッションクッキーで指定するドメイン。デフォルトでは指定なし。 この場合は、クッキーの仕様によって、クッキーを作成したサーバーの ホスト名となる。

  クッキーはセキュアな接続でのみ送信(secure):
  
セキュアな接続を通じてのみCookieを送信できるかどうか。 デフォルトは、off。

  クッキーは HTTP を通してのみアクセス可能(httponly):
  
クッキーに対して、HTTP を通してのみアクセスできるようにする。 つまり、JavaScript のようなスクリプト言語からはアクセスできなくなる。

このページのトップ

★php.iniファイルの設定

上記の確認で問題ないのにセッション動作がうまくいかない場合は、
サーバーのphp.iniファイルでディレクティブ output_bufferingの値を
output_buffering=On または4096にしてみてください。
このoutput_buffering は、 いつどこで設定できるのかのモードがPHP_INI_PERDIR なので、 ini_set() で設定することはできません。

詳しくは、PHP マニュアルを参照してください。

このページのトップ

★セッションデータの保存先パスの設定

セッションデータの保存先パスのデフォルト値は、php.iniファイルで指定します。このphp.iniファイルでの設定 を行わなければ、標準の/tmpになります。(デフォルト値のデフォルト値とでも呼べばいいのか)
このままの状態だと問題があります。PHP マニュアルでもこのように警告しています。
警告

この設定を/tmp(デフォルト)のようにどこか らでも読み込み可能なディレクトリのままにしている場合、サーバー上 の他のユーザーがこのディレクトリのファイルのリストを取得すること により、セッションをハイジャックをすることが可能となります。


セッションデータの保存先パスは、 session_save_path関数で指定することができます。
ここでの注意点は、session_start() がコールされる前に session_save_path() がコールしなければなりません。
また、指定パスのフォルダーがあらかじめ用意され、属性も適切に設定されている必要があります。

このページのトップ

★ブラウザでクッキーをブロックされている

ブラウザが、クッキーをブロックしていることによりセッションが取得できない場合があります。
クッキーがブロックされていると、クライアント側でセッションIDが保存できないため、 保存されたセッション情報を取得することができません。
他のブラウザが正常にセッションを取得できているのに、特定のブラウザだと取得できない場合は、 ブラウザの設定を確認しましょう。

例 インターネットエクスプローラのクッキーの設定
 1.[ツール] ツール をタップまたは設定マークをクリックし、
   [インターネット オプション] をクリック
 2.[プライバシー] タブで、次のうち必要な操作を行う
 3.変更が完了したら、[OK] をクリック
 参照:
  http://windows.microsoft.com/ja-jp/internet-explorer/delete-manage-cookies#ie=ie-11

このページのトップ

参照サイト:
Pentan.info セッションの有効期間とか設定とか挙動とかを調べました
PHP マニュアル