アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHP初心者です。

私が作っているPHPのシステムで、ユーザーがフォームデータ入力途中に、他のページに移動すると、「戻る」ボタンなどですぐに戻ってきても、入力したフォームデータが消えてしまいます。

例えば、この「教えてgoo」の「新しい質問をする」のフォームはPHPで生成されていますが、

http://oshiete1.goo.ne.jp/oshiete_new.php3?c=256

途中でちょっと他のページに行っても、(すぐ戻れば?)入力したデータは保持されますよね。

こんなふうにしたいのですが、どうすればよいでしょうか?
「戻る」ボタンで戻ったときに、サーバーから毎回新しいXHTMLをロードしてくるので、入力データがクリアされてしまうのでしょうか?

フォーム入力⇒確認画面⇒「戻る」ボタンで戻るとフォームデータが保持されないということではなく、あくまでフォーム入力中に、ちょっと他のページに行って戻ってくるという設定です。

よろしくお願いします。

A 回答 (6件)

 javascriptで、<input type=button value="戻る" onClick="history.back()"> とするとフォームデーターが残りますが、これはOSとブラウザーのバージョン等によって必ずしも残りませんです。



フォームデーターに
<input type=text name=your_name size=15 value="$this_name">
とかしといたのを

 移動したページでは、$_POST['your_name'] で書き込みデーターを受け取り、その「戻る」に、<imput type=hidden name=your_name value="$your_name"> で元のフォームデーターに送り返してあげれば、フォームデーターの受け渡しはできます。

 セッションでも受け渡しができますが、jameyさんが作ろうとしているPHPの内容や創り方に拠ると思われます。

この回答への補足

回答ありがとうございます。

つたない説明で申し訳ありませんが、状況をちょっと補足させてください。

想定しているのは単純な状況で、移動先のページは任意です。なので、移動先のページで、データを受け取って返してあげたり、データを返すための「戻る」ボタンを作ることは想定していません。

例えば、教えてgooの「PHPカテゴリー」の「新しい質問をする」ページ

http://oshiete1.goo.ne.jp/oshiete_new.php3?c=256

で「質問内容」欄に何か書きかけたまま、「確認画面へ」ボタンなどを押す前に、気まぐれで、同じウィンドウでYahoo!のトップページに移動したりしますよね。この場合、「教えてgoo」のサーバーやYahoo!がデータを受け取ったりはしてないですよね。

Yahoo!に行ったらすぐにブラウザの「戻る」ボタンで、戻ってくると、「質問内容」欄に書きかけた内容はまだ残っています。私のPCの2つのブラウザでは残っています。

しかし、私の作ったPHPのフォームでは、ちょっとよそに行って戻ってくると、データは毎回クリアされてしまいます。戻る度にサーバー側でPHPが実行されて、ページが更新されてしまうから?と思うのですが、よく分かりません。

どうなっているのでしょうか?

補足日時:2007/12/30 14:33
    • good
    • 0

「戻る」ボタンとは、ブラウザメニューの戻るボタンであれば、ブラウザの仕様しだいです



画面上に「戻る」ボタンを配置しているのであれば別ですよ

この回答への補足

回答ありがとうございます。
No.1の方への補足のとおりです。検索でいろいろ調べると、ブラウザの仕様次第ということがよく書かれているのですが、たいていのサイトの入力フォームでは、データを書きかけのまま他ページに浮気しても、すぐ戻ればデータは保持されるのですが、私のシステムはそうならないのです。
引き続きよろしくお願いします。

補足日時:2007/12/30 14:48
    • good
    • 0

 意味が良く分りました。


 一つにはセッションを使うとういのもありますが、この場合、途中でユーザーが別なサイトに行ってしまったというのは「ユーザーの勝手」になると解釈することもできるので、そこまで親切設定にしなくても良いのでは、と個人的には感じます。

 書き込んだフォームデーター等が戻った場合に残っているかどうかですが、残っている確率が多い感じがしますが、繰り返しWindows、Mac、IE、Firefoxなどのバージョンや組み合わせによって微妙に様々です。
 それによって戻ってもデーターが残っているというのを前提にPHPなどを作成しない方が良いのではと思います。
    • good
    • 0
この回答へのお礼

再度の回答ありがとうござます。

残っているかどうかは微妙に様々ということは、おそらく私のPHPの場合は、必ず消していると考えるのが妥当ということですよね~。
戻る度に毎回ページ更新してしまっているということなんですかね~。どうしたらそうしないで、例えばローカルのキャッシュを表示するように(これが正しいかはわかりませんが)書けるんだろう???

ご指摘のとおり、ユーザーの勝手ということも言えるし、特にそれを仕様にしたいわけではないのですが、私のPHPではなぜ一切残らないか知りたいです。

お礼日時:2007/12/30 17:30

>>残っているかどうかは微妙に様々ということは、おそらく私の


>>PHPの場合は、必ず消していると考えるのが妥当ということで
>>すよね~。
 この辺はちょっと自信がないのですが、「戻る」というのはブラウザーのキャッシュ等を利用しているのですが、ブラウザーのバージョン等によって、キャッシュされるものとされないのがあるように感じます。
 VistaとIE7だとクリアーされますが、Vista/XPとFirefoxなら残るとか?
 幾つかのブラウザーでお試しになってはいかがでしょうか。
    • good
    • 0
この回答へのお礼

何度も回答ありがとうございます。

それがですねー、ブラウザの違い以上の違いなのです。うちにはWindows98のIE6.0とWindowsXPのIE7.0、Firefox2.0を常時使っているのですが、私の書いたPHPでは、入力したフォームデータはどれも残りませんが、他サイトのはたいがい残ります。

「戻る」というのは、ブラウザのキャッシュを利用しているようで、でも一部ブラウザが勝手に判断しているようでもあり、その辺がブラウザのバージョンによって違うということもわかる(詳細は闇の中(^^;)・・・)のですが。

お礼日時:2008/01/04 09:54

サーバの環境が分からないのと、どういうコードを書かれているか分からないので完全な答えでは無いですが…



PHPだから残らないですか?HTMLだと残ります?
(HTMLのソース部分が全く同じ条件で)


「戻る」の操作で毎回新規でページを読み込んでいるのだとすれば、
一番疑わしいのは、キャッシュコントロールだと思います。
(正確な動作を確認するのであれば、フォームのページにアクセス解析を設置するかWEBサーバのログを確認して下さい)

HTTPレスポンスヘッダか、HTMLのmetaタグでブラウザがページをキャッシュしない状態になっているのではないでしょうか?

■<meta>タグでキャッシュ無効にしていないか
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="***">
のようなコードがあるかどうか

■PHPのコード側でキャッシュを無効にしているか
Header("Cache-Control: no-cache");
のような記述がないか
(セッション使っているのなら、また別の可能性もありますが)

WEBサーバ側でキャッシュを無効にしているか
.htaccess, httpd.conf等でHTTPヘッダを追加しているかどうか

など、色々と方法はあるので、どれかでキャッシュ無効にしているのが効いているのかもしれません。

この回答への補足

★下記の「お礼」より、こちらの「補足」を後で書いてます!

お礼を書いた後、いろいろ試してみたところ、結果は、以下の通りでした。
○PHPでは残らないフォームデータがHTMLでは残りました。
○header(),httpd.conf,.htaccessでは、キャッシュをコントロールする記述はありませんでした。
○metaタグでのno-cacheの設定を削除してもフォームデータは残りませんが(PHPの場合)、HTMLならmetaタグにno-cacheの設定があってもフォームデータは残りました。

ということで、問題はPHPだと思い、

>(セッション使っているのなら、また別の可能性もありますが)

が気になったので、PHPの先頭のsession_start()を削除したら、フォームデータが残るようになりました。

session_start()については、恥ずかしながらよく理解しておりません。これがPHPの先頭にあると、呼ばれるたびに新しいセッションになる?(呼ばれなければ前のセッションを引き継ぐ???)、という程度の意識しかなくて、他のプログラムの再利用で分からないまま使っていたのですが・・・。

これは、セッション変数を使っていなければ、消してしまっていいのでしょうか?ちなみにクッキーは使っています。

不勉強で申し訳ありませんが、よろしくお願いいたします。

補足日時:2008/01/04 13:50
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

実はご指摘の
>■<meta>タグでキャッシュ無効にしていないか
><meta http-equiv="Pragma" content="no-cache">
><meta http-equiv="Cache-Control" content="no-cache">
><meta http-equiv="Expires" content="***">
>のようなコードがあるかどうか

ですが、これらのコードあります。が、消してみましたが、結果は変わりませんでした。まだ「シロ」と判断したわけではありませんが。

他のコードも紛れ込んでいるかもしれません。あまりわからず見よう見真似で作った部分もあるので(^^;)。他に挙げていただいたものをを検証してみますね。

PHPとHTMLは、結局ダウンロードしてくるデータは同じなので、HTMLではまだ試していませんが、同じことですよね、たぶん。

とにかくキャッシュの無効化が影響しているかについて、調べてみます。ありがとうございました。

お礼日時:2008/01/04 10:02

原因はセッション関連にありそうですね。


session_cache_limiter()
というのは指定されていますか?
恐らく現状はnocache(ページ内容をキャッシュしない状態)になっているのだと思います。

もし
session_cache_limiter('nocache');
となっていれば、publicもしくはprivateへ変更してみて下さい。
ないようでしたら、session_start()の前に
session_cache_limiter('public');
session_cache_limiter('private');
のどちらかを記述してみて下さい。
publicだと、クライアントマシン、プロキシのどちらもキャッシュを保持しますが、
privateだとクライアントマシンのみキャッシュを保持します。
どちらが良いのかは使い方によると思いますし、
nocacheでないと困る時もありますから。

session_startを削除してしまって良いかどうかは、
他の部分の処理との関連が分からないので何とも言えないです。

一度試してみて下さい。

参考URL:http://jp.php.net/session_cache_limiter
    • good
    • 0
この回答へのお礼

ありがとうございますーーー!
見事に解決しました。

いろいろ自分でも調べた結果、

session_cache_limiter('private_no_expire');

と設定することにしました。
今回のことでいろいろ勉強したら、やっぱりセッション変数使ってて、セッション限定のクッキーも使っていたので、session_start()は消すことはできませんでした。

どんぴしゃの回答、ありがとうございました!!!

お礼日時:2008/01/13 16:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています