わかると、なんだそんなことかだけど。
photo credit: mrbill via photo pin cc
現象
セッション変数の値を消すために、
unset($_SESSION["val1]);
としているが、同じセッション変数名を使っている別の画面に遷移すると、値が保持されたままになっている。
調査
unsetだけではだめだっけ?と考えながら
$_SESSION["val1] = ""; unset($_SESSION["val1]);
を追加したり、unsetの実行位置を変えたりして動作の確認をしていると、データ処理では、正しくセッション変数の値は消えていたが、PDFファイルを出力する処理では、セッション変数の値は消えていないことに気がついた。
今回現象が起きている部分は、データ処理の場合、
1.画面からロジックに画面からの値をPOSTする。
2.POSTされた値をロジックで処理し、POSTの値をセッション変数に設定する。
3.ロジックから画面に戻る
4.画面の再描画時にセッション変数に値が設定されていたら、利用する。
5.セッション変数を破棄する。
というような処理の流れになっている。
PDFファイルを出力する場合は、
1.画面からロジックに画面からの値をPOSTする。
2.POSTされた値をロジックで処理し、POSTの値をセッション変数に設定する。
3.PDFファイルを出力する
というような処理になっている。
データ処理の3.以降の処理が行われていないので、セッション変数の値が消えないということがわかった。
対処
POSTの値をセッション変数に設定する処理を、データ処理の場合だけ行うようにして、PDFファイルの出力の場合は行わないように修正した。
わかれば単純なんだけど、動作させないと気づかない内容だ。
悩んだ結果、くだらない理由で動作がおかしかったときの脱力感。
— AJYAさん (@ajyaa) 9月 6, 2012