session,タスク作成,formでPOST後戻る、データ復帰、再入力不可

このQ&Aのポイント
  • phpのフォームでPOST後に戻る場合、データが消えてしまう問題が発生しました。sessionを追加することでデータの復帰を試みましたが、再入力時にエラーが発生します。
  • session.cache_limiterをnoneに設定したり、キャッシュ関連の設定を削除することでデータの消失を防ぐことができましたが、再登録時にエラーが発生します。
  • 戻るボタンで前のページに戻り、[F5]キーでリフレッシュすることでデータの消失を防ぐことができますが、より使いやすい方法を求めています。
回答を見る
  • ベストアンサー

session,タスク作成,formでPOST後戻る、データ復帰、再入力不可

phpでフォームをつくり二重登録防止のためこちら(http://code.nanigac.com/source/view/178)のサイトを参考にセッションを追加しました。 が、フォームで誤入力の後戻ると入力したデータが消えるので session.cache_limiterをnoneにしたり、METAに入っているキャッシュ関連のものを消してデータが消えないようになりましたが、 今度は再入力後登録しようとすると上記の機能によりエラーが出されてしまいます。 戻るボタンで前のページに戻り、[F5]キーでリフレッシュすれば データも消えず、登録も出来ましたが、それもどうかと思うので 戻るボタンで戻っただけで再登録できるようにしたいのですが、 どなたかやり方を教えてください。

  • PHP
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

参考にされたスクリプトは、どちらかといえば、CSRF対策のコードで、二重登録防止の方法ではなさそうです。 そして、誤入力があった場合に戻る、というのがいまいち良くわかりません。 誤入力、というのは、検証用の関数かなんかでPHPスクリプトが入力不備と判断した場合、という意味でしょうか。 フォームと一口に言っても、実装方法はいろいろあるので、どのような画面遷移なのかを教えてください。

taro0714
質問者

補足

hogehoge78さん ご回答ありがとうございます。 >どのような画面遷移なのかを教えてください。 (1)顧客情報登録画面→(2)入力確認画面→(3)登録 という流れで、(2)のところで(1)の入力チェックにより入力漏れなどが ありに(1)に戻った際にデータがという話でした。 がよくよく考えてみると(1)と(2)の間にこの機能は必要なくて (2)と(3)の間でやればいいことに気づきました。 また効果的な二重登録防止の方法などございましたらご教授願えればと思います。

その他の回答 (1)

回答No.2

>また効果的な二重登録防止の方法などございましたらご教授願えればと思います。 二重登録防止のみを考える場合であれば、最後、登録が完了したところで、 <?php header('Location: thanks.php'); ?> などとして、別の登録完了と記述しているページへリダイレクトしてしまえばよいのではないでしょうか。 そうすれば少なくともF5を押したときに、再度POSTされることはなくなります。

taro0714
質問者

お礼

なるほど。 見よう見まねでやってみてるのですが、少しはちゃんと 勉強しないと駄目かなと思ってきました。 このたびはありがとうございました。

関連するQ&A

  • session_cache_limiterについて

    お世話になっています。 キャッシュで、悩んでいます。 ログイン(セッションに名前などを登録)  ↓ 入力フォーム(「登録」ボタンを押す)  ↓ 判定(エラーが発生したら、「戻る」ボタンを押してもらい、 入力フォームに戻る。) という、ごくありきたりな、事をやっているのですが、 iniファイルで、session_cache_limiter('nocache') にすると、「戻る」ボタンを押しても、先ほど入力 したデータが全て消えています。 今度は、入力フォームの先頭で、session_cache_limiter("public");を 入れると、確かに、「戻る」ボタンを押しても、先ほど入力したデータが 保持されていますが、この状態で、 session_unset(); session_destroy(); をして、再度、入力フォームに行っても、前回のセッション情報 (前回ログインした、ユーザー名)を保持したままになっています。 セッションの情報のキャッシュは破棄して、入力フォームのデータ はキャッシュしたいのですが何か良い方法は、無いでしょうか? session_cache_limiter("private");にしても、結果は同じです。 環境は、php4.06 apache1.3 です。 よろしくお願い致します。

    • 締切済み
    • PHP
  • セッションにpostで受け取ったデータを格納する

    お世話になります。 プログラミング初心者の者です。 初歩的な質問で非常に恥ずかしいのですが、幾ら調べてもPHPを用いてフォームで入力されたデータ(postで次のページに送信)を、セッションに追加するためのコードをどう書けば良いのかわかりませんでした…… どなたかお助けください…… よろしくお願い致します。

    • ベストアンサー
    • PHP
  • セッション使用時のフォームのデータ

    PHPでsession_start();とした後のフォームで、その後にフォームで入力したデータをPOSTで送って確認画面を表示したとします。 ここで、最初のsession_start();がなければ、ブラウザの戻るボタンで前のフォーム入力画面へと戻っても、入力したデータは保存されたままですが、session_start();とした後では、入力したデータが全てクリアされてしまうようです。 ちょっと修正したい時に、すべてクリアされてしまうとかなり不便なのですが、何かよい方法はないものでしょうか?セッション変数にPOSTするデータを保存する以外で方法はないものでしょうか?

    • ベストアンサー
    • PHP
  • フォームの入力値のセッション破棄は?

    Aフォームがありまして、入力して確認ボタンを押し、セッションに入力値が格納されたけど、途中でBフォームへ行ってしまった、という場合、いつまでもAフォームの入力値をセッションに格納しておいても使わないですし、セッション変数名が競合して予期しない動作をしても困るので、他のページへ遷移した時点でAフォームの入力値セッションを削除するようにしたいのですが、実装方法としては、URLまたは絶対パスをセッションに入れといて、画面遷移するごとにそのセッションとURLまたは絶対パスを突き合わせ、一致しなければ削除、というやり方で問題ないでしょうか? ロードバランサ使ってても同一ページなら絶対パスは変わらないのでしょうか??詳しくないんですが…。 美しい実装方法をご教示ください…。

    • ベストアンサー
    • PHP
  • 更新ボタンを押されたときにフォーム内容をキャッシュさせたくない

    現在問い合わせ等に使うフォームを作っています。 実現したいことは、 「フォーム入力後OKボタンを押したあと入力内容の確認画面でブラウザの戻るボタンを押した場合に、ページの有効期限切れを表示させずに入力した内容をそのまま表示したい」 ということなのですが、session_cache_limiter("none");とした場合、たしかに入力内容はそのまま表示されるものの、今度は更新ボタンを押そうが別の画面に一度飛ぼうが、スクリプトを読みに行ってくれず入力内容がずっと表示されっぱなしになってしまいました。 あれこれ検索したところ、「ページ生成のたびにURLのパラメータにランダムな(ユニークな)値を付け加えればページを読み直してくれる」という話が出てきたのですが、具体的にどのようにやればよいのでしょうか。あるいは他に妙案があるでしょうか。 現在の構成は、 入り口となるHTML(PHPで出力)にフォームへのリンク(<a href=form.php>フォームへ</a>)をもうけ、フォーム専用スクリプトに飛ばしています。

    • 締切済み
    • PHP
  • ACCESSのデータ入力

    access2000です。 本を読んでデータベースを作ろうとしているのですが テーブルで、入力したいフィールドの名称を登録して フォームで入力画面を作りました。 これでは フォームに入力したデータは左上にある▲みたいなものを押さないと登録されないようです。 フォーム上に大きなボタンでテーブルに登録したいです。 本には載っていないのですが どうすればいいのでしょうか?

  • フォーム入力前後のテーブルデータの同一性の確認方法は?(トランザクション?)

    PHP4.3 + PEAR + PostgreSQL + Apache + Linux/Debian Sarge を使っています。 重複を許さないデータを登録するために、既に登録されているデータを確認しつつ、テーブルに新データを追加する方法についてお尋ね致します。 下記の流れを考えています。 (1)既に登録されているデータを画面に表示する。  ↓ (2)フォームを利用してユーザーが新データを入力する。  ↓ (3)フォーム入力を受信して、新データをテーブルに追加する。 この場合、(1)でのデータ表示から(3)のデータ追加登録までトランザクションをかけておかなければ、他のユーザーが同じデータを追加登録してしまう恐れがあるかと思います。 一方、(1)においてデータベースに接続した時に得たインスタンス(?)を $_SESSION['db'] = DB::connect(DSN)           (PEARを利用しています) のようにしてセッション変数に保存しても、(3)の処理に引き継ぐことができませんでした。 このような処理はどのように行えばよいのでしょうか。

    • ベストアンサー
    • PHP
  • PHP セッションを利用した入力フォーム

    入力内容をセッションで保持しているフォームで, 入力画面から「前の画面に戻る」ボタンが押された際に 保持していた入力内容のセッションを破棄するようにしたいのですが, どのようにしたらいいでしょうか. unset($_SESSION['変数名'])で破棄できるのはわかっているのですが, これをどこに記述したらいいのかがわかりません. それとも,別の破棄する方法があるのでしょうか. 入力内容に関係ないところでもセッションを使っているので, session_destroy()ですべて破棄するのはしたくありません. よろしくお願いいたします.

    • ベストアンサー
    • PHP
  • PHPの入力フォームのセッションによる値の受け渡し

    PHPの入力フォームに関するフォームの 値の受け渡しについての質問です フォームのフィールドの値の名前はtitleです で$_POSTで値を受け取って$_SESSIONに値を 格納、変数で出力という感じにしたいと思い こう書きました <?php session_start(); $_POST['title']=$_SESSION['tit']; $_SESSION['tit']=$title; ?> <html> <head> <title>test</title> </head> <body> <?php echo $title; ?> </body> </html> こう書いたのですが、値が表示されません 画面が真っ白になってなにも見えないです なにがおかしいのか教えてください issetはあえて使わず書いたのですが それがいけなかったのでしょうか?

    • 締切済み
    • PHP
  • formで送信したPOSTデータの削除について

    いつもお世話になっております。 PHPでカートを作っております。カートに入れるボタンを押した際に、どのボタンを押したかを識別する為に、POSTで識別データを送信しております。 このPOSTデータが含まれている場合にカートに入れる動作が実行される様に設定しておりますが、POSTで送信すると、ブラウザの更新ボタンを押すたびにカートに同じ商品が追加されていってしまいます。 ですので、カートに入れる動作が終了した時点で、このPOSTのデータを無効にしたいのですが、PHPのunset関数を実行しても、ブラウザの更新を押した時点で、再度POSTを送信してしまうので、やはり重複登録されてしまいます。 このPOSTのデータを無効にする方法があれば、是非お教え頂けると助かります。

    • ベストアンサー
    • PHP