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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

12623閲覧

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

Hitomix

総合スコア14

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

2クリップ

投稿2015/01/08 08:47

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

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

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

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

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

form1.php

lang

1<input type="text" name="address" size="50" value="<?php echo htmlspecialchars($_SESSION['address'], ENT_QUOTES); ?>" />

form2.php

lang

1foreach ($_POST as $key => $value) { 2 $_SESSION[$key] = $value; 3}

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

まず、今回のフォームに関する条件ですが
・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なのでキャッシュするという選択肢は消え、下記の処理に落ち着きました。

lang

1session_cache_limiter('nocache'); 2session_start();

投稿2015/01/14 09:29

Hitomix

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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/08 10:21

mahalito_wiz

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hitomix

2015/01/09 03:57

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

0

ベストアンサー

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

投稿2015/01/08 09:14

TaMaMhyu

総合スコア1356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hitomix

2015/01/09 04:01

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

2015/01/09 04:10

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

2015/01/09 04:19

バグなのか仕様なのかはわかりませんが、特定のブラウザ(OS違いも別のものとして)でそのような動作に必ずなる可能性が考えられます。 あと可能性としては、キャッシュに入力値が含まれないということもあるかもしれません。 まずはサーバーから見て、通常アクセス、キャッシュとしての何らかのアクセス、アクセスなし、などのどれに当たるか、サーバーのログなどで切り分けた方がいいかもしれません。
Hitomix

2015/01/10 01:50

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問