質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.63%

webフォームでAndroid端末の「Back」ボタンを使用した時に入力した内容が消えている

解決済

回答 3

投稿

  • 評価
  • クリップ 2
  • VIEW 9,009

Hitomix

score 13

PHPで数ページにわたるwebフォームを制作しており

・値は全て$_SESSIONに格納
・フォーム内に設置した「戻る」ボタンにはhistory.back()を使わず前のページのURLに接続

iPhoneの場合はブラウザの「Back」ボタンで一つ前の入力した状態の画面に戻れますが
Androidの場合は標準のブラウザ・Chrome共に、
入力内容が全て消えた状態(画面の位置はSubmitボタンを押したときのページ位置)になってしまいました。

ただし、フォーム内の「戻る」ボタンを1度でも使うと
それ以降は端末の「Back」ボタンで戻っても内容が表示されます。
原因や解決法をご存知の方がいらっしゃいましたら
ご教示いただけますと幸いです。

■フォームの要素(次の画面に遷移したタイミングで、POST値を$_SESSIONに代入しています。)

form1.php
<input type="text" name="address" size="50" value="<?php echo htmlspecialchars($_SESSION['address'], ENT_QUOTES); ?>" />
form2.php
foreach ($_POST as $key => $value) {
  $_SESSION[$key] = $value;
}

■やってみて効果の無かったこと
・session_cache_limiterをpublicにする
・echoする前に「issetでTRUEの場合」という条件を付ける

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

解決とまではいかないものの
色々と調べ、最終的な結論が出ましたのでご報告します。

まず、今回のフォームに関する条件ですが
・POSTで送信
・SESSIONに格納
・複数ページを跨ぐ遷移
に加えて
・SSL通信
というところが抜けておりました。

SSL通信のため、そもそもno-cacheにしなければなりませんでした。
(そのためにブラウザの戻るボタンで「送信の再確認画面」が出てしまいますが。)

また、キャッシュに関して下記のサイトが大変参考になりました。
Web 2.0 アプリケーションのパフォーマンスを改善する-ブラウザー・サイドのさまざまなキャッシュ・メカニズムを探る

特に最後のまとめ部分
まとめ
複数のブラウザーが存在することから生じる複雑さから、適切なキャッシュ設定は非常に重要となってきます。この記事で説明したベスト・プラクティスは以下のとおりです。
 
・できるだけ多くのファイルをキャッシュしてロード時間を短縮し、パフォーマンスを改善すること。
・Cache-Control を使用して、可能な限りキャッシュの振る舞いを定義すること (特に IE の場合)。これによりブラウザー間での不一致が減るため、パフォーマンスを改善するには最も効果的な方法となります。
・「キャッシュ関連の設定を使用しない」という状態は避けること。
・デフォルト設定で新しくページを開くと、IE ブラウザーはほとんど常に、サーバー・サイドにリクエストを送信してデータを取得します。
・キャッシュに入れるべきでないページがある場合は、「Cache-Control: no-cache, no-store」を使用して、ページが確実にキャッシュされないようにすること。これは、データがセキュリティーまたは機密情報に関わる場合には特に重要なことです。
・POST リクエストはキャッシュできないため、必要でない限り使用しないこと。
ということですので、個人情報を入れるフォームに関しては
キャッシュに入れるべきではないですし、POSTなのでキャッシュできないということでした。
(「POSTリクエストはキャッシュできない」というのはブラウザに依存しそうですが。)

ただ、スマホ端末の「Back」機能やブラウザの「戻る」を使わずに
ページ内に設置した「戻る」ボタンだけを使ってもらうようにアナウンスする必要があり
ユーザー側から見ると使いづらくなりそうな気もします。

結局
・現時点でChromeではPOST値はキャッシュできない(Firefoxは可能なようです)。SESSIONの値を表示するためにはsession_cache_limiter('nocache');と書けば可能だが、ブラウザの「戻る」で「有効期限切れ」を起こす。
・「有効期限切れ」を防ぐにはsession_cache_limiter('private_no_expire');だが、SSLの場合は不可な上にChromeではPOST値がキャッシュで保存されないので空白になる。
という堂々巡りになりました。
そもそもSSLなのでキャッシュするという選択肢は消え、下記の処理に落ち着きました。
session_cache_limiter('nocache');
session_start();

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

調べたわけではないですが、特定条件下でブラウザが キャッシュを使わない かつ Cookieを付けないアクセス をしてくることがあるのではないでしょうか?
もしそうだとすると、入力値を含めたキャッシュを使うブラウザや、その条件下でCookieを付けるブラウザでしか目的の動作にはならないのではないかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/01/09 13:01

    回答ありがとうございます。
    特定条件下というのは、今回でいうとAndroidスマホということでしょうか。
    今回の症状はPCのどのブラウザでも入力値は消えず、
    iPhoneでも問題なく、Androidのブラウザのみで起きています。

    もう少し調べてみます。

    キャンセル

  • 2015/01/09 13:10

    すみません、Chromeは入力値が消えました。

    キャンセル

  • 2015/01/09 13:19

    バグなのか仕様なのかはわかりませんが、特定のブラウザ(OS違いも別のものとして)でそのような動作に必ずなる可能性が考えられます。

    あと可能性としては、キャッシュに入力値が含まれないということもあるかもしれません。

    まずはサーバーから見て、通常アクセス、キャッシュとしての何らかのアクセス、アクセスなし、などのどれに当たるか、サーバーのログなどで切り分けた方がいいかもしれません。

    キャンセル

  • 2015/01/10 10:50

    ありがとうございます。
    ご指摘の点を調査してみます。

    キャンセル

0

もしかしたらぐぐって既に試されてるかもしれませんが

ブラウザの戻るでもフォームの値を保持する
http://www.k-sugi.sakura.ne.jp/php/2877/

session_start() → POST遷移 → history.back 等で戻ると「有効期限切れ」を防ぐ
http://qiita.com/mugng/items/ae3c4c07f920a5e6e2ed

session_start()のあとにキャッシュ関連の命令を
送る必要があるみたいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/01/09 12:57

    ありがとうございます。
    最初のリンク先の「キャッシュ指定をヘッダー出力」の部分はやっていなかったので試してみましたが、入力値は消えてしまいました。
    session_cache_limiter()はpublicでもprivate_no_expireでも効果なしでした。
    header('Content-Type: text/html; charset=utf-8');追記も同様に効果なしです。

    もう少し色々調べてみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる