2014年9月20日土曜日

session_start()はコールする位置(記述する位置)が重要 PHPマニュアル

3月と9月、半年に一度使うプログラムを少し直した。3月に使った後に直しておいて9月に使った。AページからBページへ遷移して、Aページで入力した内容をプログラム処理して、Bページで表示するはずが、表示できなくなった。

調べてみると、スーパーグローバル$_SESSIONの内容が消滅してしまっている。3月に直したときは、直す前のセッションがまだ残っていて、エラーが現出しなかった。正確には、消滅というより、セッションが再開できず$_SESSIONの内容が使えなかった。

3月に直して半年経っているので、直した部分をすぐには思い出せなかった。最初からプログラムの流れを全部追ってみて原因がわかった。

session_start()の記述位置を変えてやらないといけなくなっていた。途中にページをはさんだので、直す前のままのsession_start()の位置では、セッションが再開されなくなっていた。途中に挟んだページにsession_start()を入れ直してやらなければいけなかった。

session_start()の記述位置(コールする位置)に関して、少々間違った記述をしているホームページがよくあるので、正しい認識をここに記しておく。

正しくない認識: session_start()は、<?phpの直後に書く。
<?php
session_start();
// session_start()は<?phpの直後に書く。他のどの記述よりも上に書く。
// ここからプログラムを書く
?>

正しい認識:: クッキーに基づくセッションを使用している場合、ブラウザに何か出力を行う前に session_start() をコールする必要がある。(通常は、クッキーに基づくセッションを使っている)
つまり、ブラウザに出力する処理でなければ、<?phpとsession_start()の間に、いろいろ記述してもよい。

PHPマニュアル session_start()



0 件のコメント:

コメントを投稿