Unexpected character 解決? (結局解決してません)

PHP の例のエラーなんですが、もしかしたら原因が分かったかも。まだ様子見の段階なのでなんとも言えませんが、とりあえず自分のミスだったことをここに告白しておきます…。疑ってごめんなさい > php

原因はおそらく register_globals が On になっていたこと。これが On だと $_POST[name] の内容と $name の内容が一緒になるのはご存知の通りなのですが、$_SESSION[name] と $name も一緒にしようとするんですね。知らんかった…。On にした覚えは無いんだけどなぁ。とりあえず register_globals なんていう設定はとっとと無くして欲しいです…。全く必要無いし。

ということで、早速 Off にして error_reporting を元に戻し様子を見ている所ですが、今の所問題無いようです。お騒がせしました。

参考までに(ならないとは思いますが)、気づくまでの過程をちょっとだけ。

総合テストを行っていた時にかなり致命的な不都合が出てしまいまして、その原因を必死で探した結果行きついたのが「$_SESSION の中身がおかしくなる」という現象でした。この段階では何故 $_SESSION の中身が壊れるのかは分かっていなかったのですが壊れてしまうことだけは確かなので、その辺を中心にソースを見直していきました。

「$_SESSION に代入してる個所が悪いに決まっている!!」と grep しつつ探していたのですが、問題になりそうな部分が全く見当たりません。この段階で、壊れる個所までは特定出来ていたので、その部分のソースを眺めながら「なんで壊れるんだー」と発狂寸前に(イヤ、発狂してました)。

この部分で $name = $row[name]; となっていた部分があったので、試しに $name_t = $row[name]; としてみると、なんと正常に動くではありませんか! あ、今回のシステムは $_SESSION[name] にユーザの名前を保存させているので、この $_SESSION[name] と $name がぶつかって壊れていた、という訳ですね。この部分は短かったので関数にはせずトップレベルにそのまま書いていたので、register_globals = On の恩恵をうけて不都合を炸裂させていた、というオチです。

このシステムはソースは EUC、出力は SJIS という仕様なので、出力をする為に SJIS 変換した文字列を間接的に $_SESSION に代入してしまってて、その $_SESSION をどこかで利用する時に Unexpected character を吐いていたのではないか、というのがオレの推測ですが、どうなんでしょうか。なんとなく当たってる気もしますが、外れてる気ももちろんします。

これで総合テストの時に出た不都合が解決出来たのは間違い無いのでとりあえず一安心です。はぁ、これでぐっすり眠れます。おやすみなさい。

追記

すいません。全然直ってませんでした。逆に5回くらいリロードするとエラーになるという的中率にまで上がってます! どっかに原因があるはずなんだけどなぁ。とても見つけられる状態ではないです…。ガックリ。