i-modeのフォームの受け渡しについて - PHPプロ!Q&A掲示板

2276

  • 0P

i-modeのフォームの受け渡しについて

質問日時 / 2009年9月18日 13:01    回答数 / 4件

Questioner:  yumikom  このエントリーをはてなブックマークに追加 

キーワード / i-mode    session    smarty   

初心者ですが、質問させて下さい。

yossy先生のsmartyで「ケータイサイトを作ってみる」という講座や、くまっち先生のPEAR:Net_UserAgent_Mobileを参考にしながら今回初めてモバイルサイトを構築してます。

割と入力数の多い登録フォームなので、モバイル用にページを小分けし、ロジック側で$_SESSIONに保存し、エラーチェック。エラーがなかったら次のテンプレートへ進むという具合で「4ページ」程、作りました。

最後に4ページ分の$_SESSIONに格納された全内容をを表示し内容をチェック⇒DB登録、という流れなのです。

ソフトバンク、AUともにうまく動作しますが、i-modeだけうまくセッションを利用できません。
調べるとi-modeはCOOKIEの機能が使えないようで、皆様それぞれの環境で苦労&工夫されているようです。
私も↓こんなようなものをフォームに組み込んだり、
<input type="hidden" name="<?=session_name()?>" value="<?=session_id()?>">
いろいろと試してますが、単純なテストページだと有効でも実際の作成しているページでは機能しなかったりかなりの手間がかかったりします。

「i-modeがCOOKIEの機能が使えない」というのを知らず、これまで「$_SESSIONに保存し⇒エラーチェック⇒次のページ」という流れで作っていましたので、i-mode用にまた別の構成でつくらないといけないの???と思うと納得がいかず、更に調べを進めようとしても、なかなか解決の糸口がつかめません。

出来る事なら 
くまっち先生のNet_UserAgent_MobileでAU・softbank・imodeなどのキャリアの識別は出来るようになっているので、そのようなものを活用して・・・

とか考えています。やはり考え方が安易でしょうか。
諦めるしかないのでしょうか。

smartyを使っている皆様はどうされているのでしょうか。
一人で悩んでいても仕方がないと思い、投稿させて頂きました。
そもそも、そんな作り方はダメ ですとか 諦めた方がよい ですとか、 うちはこんな感じでクリアしたとか、ご意見が伺えたらと思います。

漠然とした質問で分りにくかったら申し訳ありませんが、何かご意見を頂けましたら幸いです。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01paty_style携帯向けのサイト構築時には「session.use_trans_sid
 ┗A01-1yumikom早速のご意見誠にありがとうございます。 ご指導頂
  ┗A01-1-1paty_styleyumikomさんのコード拝見しました。 b.phpの方にLo
   ┗A01-1-1-1yumikompaty_style様 >PHPの機能によってセッションを

回答一覧

並び替え:

A01 満足
answererpaty_style [9月18日 14:30] (最終編集:9月18日 14:37)

携帯向けのサイト構築時には「session.use_trans_sid = 1」を設定しています。セッション開始前に

  1. ini_set('session.use_trans_sid',1)

とすることでPHPが実行時にhiddenタグとしてセッションIDとセッション名を埋め込んでくれます。フォームを作り直すなどはしないです。もちろん受け止める側のPHPファイルも同様の設定値で動かさないとセッションが復帰できないので、機種別に判定して設定値を変更しています。

この意見に回答する

ツリーへ TOPへ

A01-1
replyeryumikom [9月18日 16:54] (最終編集:9月18日 18:04)

早速のご意見誠にありがとうございます。

ご指導頂いたini_set('session.use_trans_sid',1)で試したところ

a.php ⇒ b.php 間、セッションが保持され
b.php から「戻る」ボタンを押してもフォーム内に値がちゃんと残りました!ありがとうございます。

ただ、今回のファイルにあてはめたところ、やはり上手くセッションの受け渡しが出来ていないようです。

力不足でこの部分がよく分かってないかもしれません。。。。

>もちろん受け止める側のPHPファイルも同様の設定値で動かさないとセッションが復帰できないので、機種別に判定して設定値を変更しています。 


今回私のファイルは単純化すると下記のようになります

[a.html]で入力⇒[a.php]エラーチェック後、エラーがなかったら[b.php]に飛んで[b.html]の入力フォームへ
[b.html]の戻るボタンを押して[a.html]に戻っても入力したデータが残っているというのが希望です。



それぞれのphpファイルには統一ファイルの頭に↓この部分が読み込まれる。
  1. <?
  2. ini_set('session.use_trans_sid',1);
  3. session_start();
  4. require_once($_SERVER['DOCUMENT_ROOT']."/lib/MySmarty.class.php");
  5. require_once($_SERVER['DOCUMENT_ROOT']."/lib/Mlib.php");
  6. require_once 'Net/UserAgent/Mobile.php';
  7.  
  8. $smarty = new MySmarty
  9. $smarty->autoload_filters = array('output' => array('xmldoctype'));
  10.  
  11. //*キャリアの判別
  12. $userAgent = Net_UserAgent_Mobile::singleton();
  13. $agentname = $userAgent->getName();


  1. /*----[a.html]----*/
  2. <form action="a.php" method="post">
  3. <input type="text" name="test" value="{{$smarty.session.test}}">
  4. <input type="submit" value="送信">
  5. </form>


  1. /*----[a.php]----*/
  2. <?
  3. require_once($_SERVER['DOCUMENT_ROOT']."/lib/Mini.php");
  4.  
  5. /*----------------------------------------
  6. ここでセッションに格納してエラーチェックする
  7. $_SESSION['test'] = $_POST['test'];
  8.  
  9. $error_list = error_check($_SESSION);
  10.  
  11. $count = count($error_list);
  12.     if($count > "1"){}
  13.     if($count == "0"){
  14.     $url = "b.php";
  15.     header("Location: $url");
  16.     exit;}
  17. -----------------------------------------*/
  18. $smarty = new MySmarty
  19. $smarty->display("m/a.html")
  20. ?>


  1. /*----[b.html]----*/
  2.  
  3. <form action="a.php" method="post">
  4. <input type="submit" value="戻る">
  5. </form>

  1. /*----[b.php]----*/
  2. <?
  3. require_once($_SERVER['DOCUMENT_ROOT']."/lib/Mini.php");
  4.  
  5. $smarty = new MySmarty
  6. $smarty->display("m/b.html")
  7. ?>


分りにくい説明&コードだったらすみません。
ご理解頂き再度ご指導頂けましたら幸いです。

この意見に回答する

ツリーへ TOPへ

A01-1-1 満足
replyerpaty_style [9月18日 20:06] (最終編集:9月18日 20:08)

yumikomさんのコード拝見しました。

b.phpの方にLocationヘッダでリダイレクトしていますので、セッションが飛んでますね。
フォーム上でsubmitを押した場合の遷移だけを考慮した回答でしたので、うまく行かなくなると思います。理由としてはフォーム上に埋め込まれたセッションはフォームのactionに設定されたURIに送信されることになります。つまり、拝見したコードではリダイレクトを利用しているため、PHPの機能によってセッションを埋め込むことができず、リダイレクト先にセッションを送信していない状態となっています。

修正が必要と思われる箇所はa.phpの

  1. header("Location: $url");



  1. $url=$url . '&' . session_name() . '=' . session_id();
  2. header("Location: $url");

のようにGETリクエストに含めることで対応できるかと思います。
上記コードはセッションが漏えいする可能性がありますので、セッションの管理方法に工夫が必要だと思います。SSL環境でなければ、iモードIDの利用を検討するのもありだと思います。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyeryumikom [9月18日 21:25] (最終編集:9月18日 21:28)

paty_style様


>PHPの機能によってセッションを埋め込むことができず、リダイレクト先にセッションを送信していない状態


アドバイス通り実際のファイルに当てはめたところ、見事に希望通りに動きました。
この未熟者に的確に助言下さり、本当に感謝の一言ではすみません。
(一人で手を叩き歓喜した後は、自分の理解度の低さにガックリもしましたが。。)


>セッションが漏えいする可能性がありますので、セッションの管理方法に工夫が必要だと思います。SSL環境でなければ、iモードIDの利用を検討するのもありだと思います。

うまく動いたで終わらせず、今から上記戴いたアドバイスをきちんと消化するために勉強したいと思います。

本当にありがとうございました!

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
array_mergeの再帰処理の動作について
 このエントリーをはてなブックマークに追加 
A
>1個になったとき$leftを返しますが、 >このとき、最終的な$leftはnullになるかと思います。 いいえ、最後は「渡された配列をそのまま」返します。要素が2以上あるときとの違いは(並べ替えずに戻るので...

>>続きを読む

再帰関数は最初の内は混乱しますが、非常に上手く使える場面もいずれ出てきます。これを機会に学んでいけるといいですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)