みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

mysqlへの書き込みがリロードする度に行われてしまう。

現在PHPとMYSQLを使ってサイトを作っています。
そこで、テーブルの追加をinsert文を使って実行し、
追加されたテーブルをselect文で表示させるということをやっています。

現在はhoge.htmlでフォーム側を記載し、hogehoge.phpで受け取り、データを追加、表示させるようにしています。

登録作業の方は問題なく実行されるのですが、
登録されたデータがhogehoge.phpをリロードする度に永遠と同じデータが追加され続けてしまう現象がおきています。(auto_incrementに指定しているidだけがかわる)
データを登録し終わると次にリロードしてもデータが追加されないようにするにはどのようにすればよいのでしょうか。

ご教授御願いいたします。

投稿日時 - 2007-10-16 18:04:48

QNo.3434649

困ってます

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

フォームからhogehoge.phpへPOSTを使ってデータを送っていると思いますが、この場合はリロードするたびにPOSTのデータが送られるのでINSERTが繰り返されることになります。
この問題の対策としてはいくつかの方法が考えられます。

1.セッションに情報を保持する
一度INSERTしたら、そのデータを一意に認識できる情報(プライマリキーなど)をセッションに保持しておきます。次にINSERTが要求されたときにセッション内に同じ情報があるか確認し、存在すればINSERTしないようにします。
もしプライマリキーが自動的に連番を割り当てるタイプのものでしたら、フォームに予めランダムなIDをhiddenタグで入れておく必要があります。このランダムなIDを割り当てる方法はNo2やNo3の方が仰っているのと同じです。

2.リダイレクトを利用する
リロードによって再度POSTされることが問題になるので、リダイレクトを利用して重複したPOSTを避ける方法です。これは、hogehoge.phpをPOSTで呼び出されたらINSERTとhogehoge.phpへのリダイレクトを、GETで呼び出されたらリストの表示を行うというようにします。こうすればリロードしてもGETが呼び出されるだけですので、再度INSERTされることはありません。

個人的には2の方法が好きですが、この場合はダブルクリックには対応できませんので気をつけてください。

投稿日時 - 2007-10-17 10:17:42

お礼

親切にご回答頂き有り難うございます。
もう少し自分なりに勉強することが必要のようです。
頑張ってみます。

投稿日時 - 2007-10-24 10:24:15

ANo.3

phpのバージョン等にもよると思いますが、私もphp初心者の頃、同様の問題に当たり、参考urlのリロードクラスを使わせていただきました。
これがそのまま使用できるかどうかは不明ですが、このソースコードがやらんとしていることを理解することで、リロードや戻るボタンへの対策が取れると思います。
難しいかもしれませんし、簡単かもしれませんが、是非ソースコードを解析してみてください。

参考URL:http://www.stackasterisk.jp/tech/php/php03_01.jsp

投稿日時 - 2007-10-16 20:25:43

お礼

親切に教えて頂き有り難うございます。
今少し時間が無く試せていないのですが、使わせて頂こうとおもいます。

投稿日時 - 2007-10-24 10:23:12

ANo.2

特定のフィールドにユニーク属性をつけてみてはどうでしょう?

投稿日時 - 2007-10-16 18:47:38

お礼

ご回答有り難うございます。まだ具体的なことが分かりませんので、勉強します。

投稿日時 - 2007-10-24 10:21:45

ANo.1

hogehoge.phpの処理でhoge.htmlからデータが来ていない場合は
テーブル追加をさせない様にすればいいんじゃないですかね?

投稿日時 - 2007-10-16 18:47:02

補足

早速回答頂き有り難うございます。
「hogehoge.phpの処理でhoge.htmlからデータが来ていない場合は
テーブル追加をさせない様に」
出来れば良いのですが、
初心者なもので、コードの書き方が分かりません。
何かヒントのようなものでも与えて頂けないでしょうか。
宜しく御願いいたします。

投稿日時 - 2007-10-16 19:29:28

あなたにオススメの質問