原因はセッションか維持されていなかったことです。PHPは言語自体がセッション機能を持っているので、session_start() を呼べば特に自分で苦労しなくてもセッション管理ができますが、今回のハマリは、「特に自分で苦労しなくても」に頼りすぎたのが原因でした。
Webアプリにおける一般的なセッション管理は、
という仕組みになっています。
つまり、今回のようにセッションが維持されていない原因として、セッションIDがうまく持ち回れていないこと考えられます。PHPはセッションIDを持ちまわる方法として
が利用でき、状況に応じて自動的に選択されます。ただし、セキュリティの観点から、php.iniの指定でどちらかしか利用できないようにもできます。
で、ようやく本題なのですが、今回のアプリが載っているホスティングサービスのPHPが 2 の方法をサポートしていなかったのです。これに気づくのに相当な時間を要しました。( phpinfo() にてPHPのコンパイルオプションを確認し、--enable-trans-sid が指定されていなかった )
携帯電話ではCookie が使えないと思っていたので、手元のau端末で動いた時点でOKだと思ってしまいました。いつのころからか EZWebでは Cookieがサポートされていたらしいです。
結果、Vodafone, iモード機では Cookie が使えず、URLへの埋め込みも行われないということで、セッションが維持できないという問題になってしまいました。携帯用のページ内のフォームにセッションIDをhiddenで持たせることで対策としました。
Ethnaではページの作成をテンプレートエンジン Smarty で行っているのでコードとしては, View クラスでセッションIDの名前と値をフォームに登録する
$this->af->setApp('session_name', session_name());
$this->af->setApp('session_id', strip_tag(session_id()));テンプレート側でフォームから値を取り出すというのを埋め込んでいます。
カテゴリ:プログラミング
ワタナベ (2006-02-17 11:34) | コメント(0)| トラックバック(0)
トラックバックURL:
プロフィール
ワタナベ
サーバ管理が趣味の渡邉充隆です。
仮想化やネットワーク構成に興味があります。
あとは、ウェブ系の技術(プログラミングからインフラまで)も好きで、特にデータの見せ方などを工夫することで情報の流通や再活用を促進する技術を研究しています。
dev.tyzoh.jp では ssdb の(コアではなく)周辺のコードをいじっています。
月別アーカイブ
Copyright (C) 2004-2008 Nihon Unisys, Ltd. All Rights Reserved.
Powered by Movable Type Open Source