KeyHoleTV開発者のブログ

日々の質問や開発の日記

PHP の $_SESSIONの値がNULLになる場合の解決方法

PHPで二重処理を回避するためにsession_start() という関数がある。 これは、session_start();を呼び出して一度セッションを開始すると、

(1)一定時間、セッションを保つ

(2)session_destroy()が呼ばれるまで、$_SESSION[ ]変数の値を保持する。

という機能を持っている。 更に、session_destroy()が呼ばれると、ブラウザのバックでは戻ることが出来なくなる。

OISEYER のホームページに新しいプライバシーポリシーをアップロードして、参照できるようにした。更に新しいプライバシーポリシーには、

www.oiseyer.com

と呼ばれるプライバシーに関する法律に基づいた要求を送ることができる。

このフォームの送信で session_start()を利用して、フォームを記述した。 自宅のWebサーバ + php8.3 で動作確認してからWebホスティングの該当場所にアップロードした。

アップロードしたフォームで入力して送信すると、振る舞いがおかしい。自宅のサーバでの振る舞いと異なる。 そこで、PHPの変数を va_dump で調べてみた。 すると、セッションで保持している $_SESSION[ ] で定義している変数の値がNULLになっている。 何故NULLになるのか全くわからない。 そこで、googleで「HP の $_SESSIONの値がNULLになる」で調べてみた。 すると、AIが

考えられる原因と確認事項

  • `session_start()`が実行されていない
  • セッションの有効期限切れ:
  • 意図しないセッション変数の削除:
  • セッション変数の上書き
  • null値の判定:

との結果がでたが、当てはまらない。 また複数の人のブログでは、

session_start()のファイル内の位置について言及しており、<?php の次に置かなければsession_start()が失敗して変数が消えてしまうらしい。また、他のブログには、<?php から複数の改行があるだけでもうまく行かないとの言及があった。しかし、どちらの場合もこちらの状況には当てはまらない。

そこで、セッションのエラーを見ることにした。何らかのエラーがあれば、それで値が消える可能があると思って、エラーログを取るようにした。まず、PHPコード

ini_set('log_errors', 1);     

ini_set('error_log', 'php_session_error.log');

を書き込んで、php.ini に 

allow_log = ~/php-errors.log

を追加した。 これでエラー見ることにした。対象のページを開くと、エラーが出力される。 その内容は

[02-Oct-2025 00:08:11 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in ...

02-Oct-2025 00:08:11 UTC] PHP Warning:  Undefined array key "SessionID" in .,.

02-Oct-2025 00:08:14 UTC] PHP Warning:  session_start(): Session cannot be started after headers have already been sent in ...

02-Oct-2025 00:08:14 UTC] PHP Warning:  Undefined global variable $_SESSION in  ...

02-Oct-2025 00:08:14 UTC] PHP Warning:  Trying to access array offset on null in ...

というエラーが記録された。 一番最初の行は、既にセッションを開始しているので、スタートできないと言うもの。 これは、以前のセッションが正しく終了していないので当然でると思う。

二行目、SessionIDというアレーのキーが定義されていない。三行目も一行目と同じで

セッションが開始できない旨。これは、送信ボタンをクリックするとセッションを継続させるため、session_start()を呼んでいることで発生するエラーだ。四行目$_SESSIONとういう広域変数が定義されていない旨だ。これは、変数をアクセスする場合、変数に値が代入されているかどうかを検証する必要があることを示している。最後の行は、問題で配列へのオフセットをNULLをにしようしている旨だ。おそらくこれが原因で変数の値がNULLになっていると思う。

で、これらのワーニングを取るべき変数のアクセスに関して、isset 関数を利用した。具体的には

if( isset($_POST['SessionID'])) {

    ....

}

のような記述を加えた。 同様に $_SESSIONにも

isset($_SESSION['xxxx'] ))  {

     ...

}

のような記述を加えた。 この結果、ワーニングは、

session_start(): Session cannot be started after headers have already been sent in ...

とPHP Warning:  Trying to access array offset on null in なったが、相変わらずセッションで確保した変数の値がNULLになる。

試しに一旦セッションのエラー出力を停止して、ページを表示してからフォームに入兎力して「送信」ボタンをクリックすると変数に値が残っている。

一応これでうまくいった。 行ったことをまとめると

  • セッションのエラーを出力するために、ini_set('log_errors', 1);  とini_set('error_log', 'php_session_error.log');を書き加えた。
  • ワーニングがsession_start(): とTrying to access array offset on null ... になるまで、修正した。
  • 最後にセッションのエラーを出力するのを停止した。

全く原因がわからないが、ホスティングのWebサーバの場合、複数の機器をあたかも一つのサーバにあるように振る舞う仕組みであるため、セッションのための変数を保存するパスがNULLをであったりするので、これが影響している可能性もある。