1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【PHP】データ登録処理後、再読み込みしたら同じデータが再び登録される

Posted at

環境

PHP 7

はじめに

今回は、ユーザー登録機能を実装している時に、起きた問題です。ユーザー登録後リロードをすると同じデータが再び登録されてしまうという現象が起きました。
調べて分かった事などを備忘録として残していきたいと思います。

リロードや再読み込みで再送信される

ユーザー登録後に、再読み込みをすると同じユーザーが再び登録される、、
URLを直撃ちしてページをみると、この現象は起きないのですが毎回こんなことできないですね、、

リロードをすると下記の画像のアラートが出力されます。
image.png

「続行」を押すと同じデータが登録されます。
この現象は何度も繰り返されるため、無限にデータが増えることになります。

image.png

リロードによる多重登録の原因

なぜ、リロードをすると同じデータが登録されてしまうのか、、
原因を調べてみると、フォーム送信をするとPHPでは$_POSTという変数に格納されます。この変数は、送信後も保持されているためリロードすると再度この変数の値が登録されてしまうのが原因です。
このことを踏まえ$_POSTを初期化してみましたがダメでした、、

解決策

解決策としては大きく分けて二つ

  • セッションなどを使って、ページ遷移の正当性を確認する
  • header関数を使い自動リダイレクトを行い、パラメータのない状態にする。
    今回は二つ目の自動リダイレクトを使って解決をしました。

一つ目でも解決できるみたいですが、生のPHPでやると結構大変みたいです。
余裕があるときに挑戦したいと思います。

自動リダイレクトさせてみる

index.php
header("Location:URL");
exit;

このコードを処理の最後に記述します。
header関数でページ遷移させます。URLの部分に読み込みたいページのURLを記入してください。
今回は、同じページに戻るので ./ を書きました。

最後に、exit; でPHPのプログラムを終了させます。

最初のhtmlタグよりも前に記述しないと、「Warning: Cannot modify header information – headers already sent by …」というエラーが起きます。

以上となります!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?