質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

760閲覧

PHPの掲示板サービスをF5すると書き込みが増殖する現象

reiya1230

総合スコア20

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/01/03 00:52

前提・実現したいこと

PHPで掲示板のようなサービスがあります。
入力には名前とテキスト入力、書き込みボタンがあります。
書き込みボタンをクリックすると、sql文等の処理を流すようになっています。

発生している問題・エラーメッセージ

更新をすると前回と同じ書き込みが増殖します。
ブラウザを開きなおすと、たまに増殖しないことも有ります。

疑問点

・そもそも、なぜif(isset($_POST['submit'])#submit=>書き込みボタン
としているのに、F5で更新した際にこの条件分岐がtrueになるのかよくわかっていません。
他のサイトで、セッションを使う、やリダイレクトされたときはGETすればいいなどの
対処法を調べましたが、そもそも更新した際とボタンを押したときの共通点がわからないので
理解が出来ません。

・なぜフォームには何も値が入っていないのに前回の記録を覚えているんでしょうか?
セッションや何かなんでしょうが、保存するコードを書いた覚えがありません。

わかりやすく説明されているサイト、または分かるように解説頂けないでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2019/01/03 00:55

リロードする前の最後の操作は、書き込みボタンを押して投稿されたのでしょうか?
reiya1230

2019/01/03 01:02

はい、その通りです。 ブラウザを開き直してリロード増殖しない場合でも、書き込みボタンを押して投稿すると増殖するように思われます。
退会済みユーザー

退会済みユーザー

2019/01/03 02:31

POSTの正常終了でHTML描画してるなら普通のことですね→重複登録
guest

回答3

0

ベストアンサー

なぜフォームには何も値が入っていないのに前回の記録を覚えているんでしょうか?

HTTPリクエストを再送しているだけでは。

【フォームデータの送信 | MDN】
https://developer.mozilla.org/ja/docs/Learn/HTML/Forms/Sending_and_retrieving_form_data#The_POST_method

POST

1POST / HTTP/1.1 2Host: foo.com 3Content-Type: application/x-www-form-urlencoded 4Content-Length: 13 5 6say=Hi&to=Mom

【さいきょうの二重サブミット対策 - Qiita】
https://qiita.com/syobochim/items/120109315f671918f28d

【PHP - PHP タブブラウザでの二重POST対策について|teratail】
https://teratail.com/questions/76657

投稿2019/01/03 02:29

kei344

総合スコア69574

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reiya1230

2019/01/03 06:37

なるほどよく考えたら書き込み完了ページが無かったですね。 更新されたように見えて更新しただけで最初のページとは違ったようです。 ボタンの処理の後に最初のページにリダイレイクトさせたら解決できました!
guest

0

・F5を押したときになぜ、データが再送されるのか
ブラウザが今開いている場所のアクセス方法(GET/POST)を記憶しているので、
F5を押すとリクエストの再送を行う、という動きを行います。
このため、GET/POSTリクエストのURLへはフォームの値など変数がある場合、
値を初期化せずにサーバー側へ伝えます。

たとえばの例で言うと、Googleなどの検索サイトで検索結果の画面でF5を押したら、最初に戻らされた、なんて不便だと思いませんか?

・なぜフォームには何も値が入っていないのに前回の記録を覚えているのか
これはフォームに値が入っていない、という事象は別として、
「このURLに今このパラメータをデータとして格納してPOSTした」
という状態をブラウザが一時的に記憶しているからです。
この状態で、ブラウザを閉じて、同じURLを開き直すとデータは無いと思います。

2重データを回避するのではれば、以下URLが参考になります。
2重データ登録をさせたくない場合は、フォームを開くたびに変わるワンタイムキーのようなものを、クライアント側へセッション情報として渡すなどさまざまな方法が考えられます。

https://eight-web.com/blog/2015/01/07/phpreload/

投稿2019/01/03 02:28

SSaka

総合スコア96

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「CSRF」で調べて概念を理解した上でその対策方法を導入してみてください。

投稿2019/01/03 03:08

m.ts10806

総合スコア80873

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rana_kualu

2019/01/06 12:08

CSRFは関係ないです。 CSRFできるが二重投稿できないフォームも、二重投稿できるがCSRFのないフォームも作れます。
m.ts10806

2019/01/06 12:18

ご指摘ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問