これがシナリオです。フォームに入力し、データベースに何かを挿入します。その後、別のフォームに自動的にリダイレクトされます。ユーザーがブラウザーの戻るボタンを押したために、この 2 番目のフォームが入力および送信されなかった場合、以前に挿入したものをデータベースから削除したいと考えています。
ユーザーがブラウザの戻るボタンを押したかどうかを知るにはどうすればよいですか?
これがシナリオです。フォームに入力し、データベースに何かを挿入します。その後、別のフォームに自動的にリダイレクトされます。ユーザーがブラウザーの戻るボタンを押したために、この 2 番目のフォームが入力および送信されなかった場合、以前に挿入したものをデータベースから削除したいと考えています。
ユーザーがブラウザの戻るボタンを押したかどうかを知るにはどうすればよいですか?
まず、サーバー側ではなくクライアント側のアクションであるため、Zend でこれを行う方法はありません。2 番目のページで javascript のイベント ( jQuery にwindow.onunload
も実装されている)を利用する方法を見つけることもできますが、これは実際には最も安全なオプションではありません。一部のブラウザーでは起動しないか、ユーザーが JavaScript をオフにしている可能性があるためです。
セッションの最初のフォームの最後の挿入 ID を保存し、次にページをロードするときにその存在を確認できます。たとえば、ユーザーが最初のフォームを送信すると、フォーム A が送信され、レコードがこの ID で保存されたと言います。次に、ユーザーが次のフォームを送信すると、フラグをクリアします (すべてが計画どおりに進んだことを意味します)。ただし、ユーザーが戻るボタンを押して前のページに戻った場合は、フラグが設定されているかどうかを確認します。そうである場合は、テーブルからレコードを削除します (ユーザーが最初のフォームを送信せずに押し返したため)。
このソリューションの問題点は、ブラウザがページのキャッシュされたバージョンをロードする可能性が高く、PHP コードが実行されないことです。そのため、最初のフォームを送信する際にステータスを確認する必要があります。ただし、これは別の問題を引き起こします。ユーザーが最初のフォームを送信し、戻ってウィンドウを閉じたらどうなるでしょうか。チェックを実行することはなく、行を削除することもありません。
私の見解では、最も実行可能なオプションは、たとえば 1 時間以上経過していて、cron ジョブを使用して完了していない最初のフォームのレコードを削除することです。
簡単な解決策はないので、両方のフォームのすべてのフィールドを 1 つのページに配置することをお勧めします。それはあなたの人生をずっと楽にしてくれます。
挿入してから削除するというアイデアをあきらめました。両方のフォームが入力された後にデータを挿入することにしました。アイデアをくれたリケシュ・シャーに感謝します!そして皆さん、ご回答ありがとうございます!
どういう意味?JavaScript またはバックエンド コード (zend) でそれを検出したいですか?
トークン (一意の ID) をフォームに追加し、ページがしばらくキャッシュされていることを確認して、ユーザーが [戻る] ボタンをクリックしたときに、ページがサーバーから再取得されないようにして、新しいトークンを生成することができます。
編集: マルチステップ ウィザードは、認証されたユーザーがいないときにトークンを追跡するか、再送信されたかどうかにかかわらず、送信されたデータのケースに基づいてチェックを行うことにより、複数の方法で実行できます。
このイベントをキャッチできるかどうかわかりません ( history.back() で見てください)
しかし、それを作成するより良い方法は、DBに(ユーザーIDなどを使用して)状態を設定し、状態が「現在」のままのときにcronを作成して削除することだと思います