スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[PHP]exitを忘れるな!


Webシステムに二重リロードの制御という面倒な処理があります。
Web系のシステムでは入力画面→確認画面→完了画面という遷移が多いのです。

ユーザーがブラウザの更新ボタンをクリックして
リロードすると、データが再送信されて、再度、登録処理が
実行されてしまうことがあります。
中には、ブラウザのボタンを使用させないように制御してしまう
サイトもありますが、それではユーザビリティが悪すぎます。
イントラネットでの開発なら、それもありかもしれませんが、
不特定多数のユーザが閲覧するようなWebシステムでは、
非難されること間違い無しです。

これを防ぐには、いくつか方法があると思います。

  1. 確認画面で登録処理を行う

  2.  hidden値に、「登録フラグ」を作っておき、「確認画面」にPOSTします。
     「登録フラグ」が無効(つまり入力画面からの遷移)の場合は確認画面を、
     「登録フラグ」が有効の場合は登録処理を行います。
     
     登録完了後に、完了画面を表示。
     ただ、確認画面から「戻る」ボタンをクリックされた時に、
     何らかの制御が必要になります。

  3. 完了画面で登録処理を行う。

  4.  確認画面から受け取ったデータを元に登録処理を行う。
     この場合、リロードされた時の対策を考える必要がある。

  5. 登録処理を別のスクリプトで行う。

  6.  確認画面→登録用スクリプト→確認画面といった制御を行う。
     じつは、こういうシステムは作ったことが無いのですが、
     もしかしたら、二重登録の制御対策としては美しくコーディング
     できるんじゃないかと、ちょっと思ったりします。


今回は、既に[2.完了画面で登録処理を行う]パターンでコーディング
されていたので、こちらのサンプルを紹介します。

環境はPHP5とMySQLです。

確認画面で登録実行フラグをONにして、
登録作業が完了した時点で、登録実行フラグをOFFにします。
この登録実行フラグは、Session変数を使いました。

そして、完了画面のトップに以下のスクリプトを組み込んでおきます。
このとき、exit;は絶対、忘れないで下さい。


session_start(); //これを忘れたらSession変数が取得できません

if (!$_SESSION["regisit_flg"]) {
header ("Locaiont:top_page.php");
exit;
}


exit;を忘れると、その後の処理を実行してから
header();関数を実行します。

結構、はまりましたので教訓として、メモに残しておきます。

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

難しそうですね

こんにちは。
私は、ソフトのサポートをしているのですが開発は、さっぱりわかりません。
開発は、専門技術職って感じがしますね。
ちなみに、うちもPHPをしようして開発しているようです。

どうなんでしょう?

今はいいですよ、困ったらGoogle先生に聞けば、ほとんどわかりますから(笑)

たけっちさん、サポート係なんですね。
尊敬します!人に教えるのって難しいですもの。

承認待ちコメント

このコメントは管理者の承認待ちです

承認待ちコメント

このコメントは管理者の承認待ちです
スポンサードリンク
枚方情報
最新記事
カテゴリ
人気ページランキング
ブログパーツ
検索フォーム
最新コメント
楽天オススメ
人気検索記事
プロフィール

ときどきぷろぐらま。

miichan1016をフォローしましょう

Author:ときどきぷろぐらま。
ママぷろぐらま、として頑張ってます。
好きなことはPHPでプログラムを組むこと。
ブログランキング・にほんブログ村へ

メールフォーム

名前:
メール:
件名:
本文:

お気に入りリンク
相互リンク 新着記事
相互リンクをしていただくと、こちらにあなたの最新のブログ記事が表示されます。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。