スレッド表示 | フラット表示〕 全トピック 920 件中 82 番目 次≫ ≪前

ブラウザの[戻る]から戻れなくする方法ってありますか?

created: 2007-09-18 20:56 | modified: 2007-10-31 15:50 | reply: 3

[3912] ブラウザの[戻る]から戻れなくする方法ってありますか?

user: ふう坊 | created: 2007-09-18 20:56
 今、PHPを使用して商品販売の注文フォームを作成しています。お客様情報を入力してもらい、それをデータベースに格納するというものです。

 作成中に気づいたのですが、データ送信後にブラウザの[戻る]から、送信ボタンのあるページに戻られると、また誤って送信される可能性があるようです。

 これを防ぐために、[戻る]ボタンを押されても、ページを表示させない方法はないでしょうか?

 お力添えしていただけると助かります。
reply: 3914 3963 返信 編集 削除

[3914] [戻る]ボタンの制御は無理です

user: ゆうじ | created: 2007-09-19 02:11
こんばんわ。

ブラウザを完全に制御することは
PHPでもJavascriptでも出来ませんので
[戻る]ボタンの制御は無理とお考え下さい。
[戻る]ボタンに限らず、ブラウジングはユーザの主導ですので
どのように操作されても問題ないよう考える方が得策です。


フォームデータの再送信防止(二重投稿防止)は、
いくつか手法があり、検索すれば山ほど出てくると思いますが
私は良く、リダイレクトとユニークIDを組み合わせて用います。

おそらく今は「フォームページ」と「登録結果表示ページ」の
2つで構成されてると思いますが、
「登録結果表示ページ」の方を、フォームデータの値チェックや
データベースに格納する処理を行う「登録処理ページ」と、
結果を表示するだけの「表示ページ」に分けます。

1.「フォームページ」がリクエストされた際は、
ユニークなIDを生成し、session に保存するのとあわせて
フォームの中に、このIDを type="hidden" で埋めておきます。
フォームの送信先は、「登録処理ページ」にしておきます。

2.フォームデータを受け取った「登録処理ページ」では、
先ず、session に保存しておいたユニークなIDと、
フォームから受け取ったユニークIDの照合を行います。

一致していれば、フォームデータのチェックや
データベースの処理完了後、、
header('Location: http://~'); で
「表示ページ」にリダイレクトします。

もしユニークIDが不一致または、sessionにユニークIDが無い場合は、
すでに登録済みのフォームが再送信されたか
不正なアクセスだと判断できるので、以後の処理は行わず
元のフォームページか、別途用意したエラーページなどに
リダイレクトします。

3.「表示ページ」では、
sessionのユニークIDを破棄さえすれば、表示内容は問いません。
登録されたデータを表示するのも良し、一覧表示も良し、
登録が完了した旨のメッセージだけもOK、
また、フォームページに戻る手もありです。


ポイントのひとつは、「POSTメソッド⇒結果表示」だったところを
リダイレクトすることにより、
「GETメソッド⇒結果表示」に変えることにあります。
これで、「更新ボタン」による二重投稿を防げます。

もうひとつのポイントは、ユニークIDで、
既定のフォームから送信されたのか、
それとも、戻るボタンで表示されたフォーム、もしくは
不正なアクセスなのかを、判断できる点です。

細かなところは、考えてみてください。
Parent: 3912  reply: 3920 返信 編集 削除

[3920] ありがとうございます。

user: ふう坊 | created: 2007-09-19 14:47
さっそくのご解答ありがとうございます。
 セッション関数は、その存在こそしってましたが、どのような用途で使用するのかいまいち理解できませんでした。これでまた一つ勉強になりました。
 ゆうじさんからもらったアドバイスを元に、自分なりに勉強して、プログラムの方を作っていきたいと思います。
 どうも有難うございました。本当に助かりました。
Parent: 3914  返信 編集 削除

[3963] いい方法ではないですが。。。

user: カーポートの介 | created: 2007-10-31 15:50
いい方法ではないですが。。。
そして私はこんな方法は使いませんが、

完了ページ出力時にheader()関数でキャッシュするように
ヘッダを送っておいて、
(これだけでも二重送信はかなりへります。)

jsでonLoad にhistory.forward()を入れておけば
戻れなくなるのではないでしょうか。


参考になれば。
Parent: 3912  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 82 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑