環境
PHP 7
はじめに
今回は、ユーザー登録機能を実装している時に、起きた問題です。ユーザー登録後リロードをすると同じデータが再び登録されてしまうという現象が起きました。
調べて分かった事などを備忘録として残していきたいと思います。
リロードや再読み込みで再送信される
ユーザー登録後に、再読み込みをすると同じユーザーが再び登録される、、
URLを直撃ちしてページをみると、この現象は起きないのですが毎回こんなことできないですね、、
「続行」を押すと同じデータが登録されます。
この現象は何度も繰り返されるため、無限にデータが増えることになります。
リロードによる多重登録の原因
なぜ、リロードをすると同じデータが登録されてしまうのか、、
原因を調べてみると、フォーム送信をするとPHPでは$_POST
という変数に格納されます。この変数は、送信後も保持されているためリロードすると再度この変数の値が登録されてしまうのが原因です。
このことを踏まえ$_POST
を初期化してみましたがダメでした、、
解決策
解決策としては大きく分けて二つ
-
セッション
などを使って、ページ遷移の正当性を確認する -
header関数
を使い自動リダイレクトを行い、パラメータのない状態にする。
今回は二つ目の自動リダイレクトを使って解決をしました。
一つ目でも解決できるみたいですが、生のPHPでやると結構大変みたいです。
余裕があるときに挑戦したいと思います。
自動リダイレクトさせてみる
header("Location:URL");
exit;
このコードを処理の最後に記述します。
header関数でページ遷移させます。URLの部分に読み込みたいページのURLを記入してください。
今回は、同じページに戻るので ./
を書きました。
最後に、exit;
でPHPのプログラムを終了させます。
最初のhtmlタグよりも前に記述しないと、「Warning: Cannot modify header information – headers already sent by …」というエラーが起きます。
以上となります!