• 締切済み

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

現在PHPとMYSQLを使ってサイトを作っています。 そこで、テーブルの追加をinsert文を使って実行し、 追加されたテーブルをselect文で表示させるということをやっています。 現在はhoge.htmlでフォーム側を記載し、hogehoge.phpで受け取り、データを追加、表示させるようにしています。 登録作業の方は問題なく実行されるのですが、 登録されたデータがhogehoge.phpをリロードする度に永遠と同じデータが追加され続けてしまう現象がおきています。(auto_incrementに指定しているidだけがかわる) データを登録し終わると次にリロードしてもデータが追加されないようにするにはどのようにすればよいのでしょうか。 ご教授御願いいたします。

みんなの回答

回答No.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の方法が好きですが、この場合はダブルクリックには対応できませんので気をつけてください。

nonchan000
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • kuroiwa96
  • ベストアンサー率100% (2/2)
回答No.3

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

参考URL:
http://www.stackasterisk.jp/tech/php/php03_01.jsp
nonchan000
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

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

nonchan000
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • calltella
  • ベストアンサー率49% (317/635)
回答No.1

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

nonchan000
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • トランザクションとlast_insert_id

    トランザクション中にinsertする予定のテーブル(未コミット)のauto_increment値を取得することはできるのでしょうか。 以下のような処理を期待しているのですが、hoge1テーブルのauto_increment値が取得できずに困っております。last_insert_id に関わらず、hoge1テーブルのauto_increment値が取得できる方法があれば教えてください。 (1) トランザクション開始 (2) $sql=" INSERT INTO hoge1(name) value('あああ'); "; (3) ( ロールバック ) (4) $key=mysql_insert_id(); (5) $sql2=" INSERT INTO hoge2(hoge1_primary,age) value($key,'20歳'); "; (6) ( ロールバック ) (7) コミット (8) トランザクション終了 よろしくお願いします。 環境: php5,mysql5 (InnoDB)

    • ベストアンサー
    • MySQL
  • MySQLテーブルの結合

    MySQLテーブルの結合 select フィール名(field1,field2,field3)from xテーブル名 [inner/left/right] join yテーブル名 on 結合条件 解説書には説明されています 現在自分のデータベースは ahogedb(テーブル名) no hoge1 hoge2 bhogedb(テーブル名) no ahogeno(ahogedbのnoを登録) hoge3 ahogedbを表示してbhogedbでの訪問回数を表示させたいのです bhogedbのahogenoにはahogedbのnoが逐次登録されています 表示はno,hoge1,hoge2に追加したahogenoのカウント数 select文の式の書き方を出来れば1列にして教えてください ahogenoは別名の変数処理するのでしょうか

    • ベストアンサー
    • MySQL
  • PHPからMySQLのデータが表示できない

    〇質問の主旨 PHPでMySQLのデータベース(テーブル)から データを表示させようと考えていて、 一度目は表示させることはできました。 しかし同じURLでブラウザをリロードしたところ、 二度目は表示されません。 もう一度データを表示させるためには、 どのあたりをチェックすればよいでしょうか? ご存知の方がいらっしゃいましたら、 ご教示願います。 〇質問の補足 PHPによるコードとMySQLによるクエリ文は次のとおりです。 現在、PHPの「処理1」にある"Success!"は表示させることができますが、 「処理2」は表示させることはできません。 ・コード <?php // データベースの接続 try { $dbh = new PDO('mysql:host=localhost;dbname=mydatabase', 'myname','mypassword'); } catch(PDOException $e) { var_dump($e->getMessage()); exit; } // 処理 1 echo "Success!"; // 処理 2 $sql = "select * from users"; $stmt = $dbh->query($sql); foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $user) { var_dump($user['name']); } echo $dbh->query("select count(*) from users")->fetchColumn() . "records found"; // 切断 $dbh = null; ・クエリ文 create table users ( id int(11) not null auto_increment primary key, name varchar(50), email varchar(255) unique, password char(16) ); insert into users (name,email,password) values ('hoge','hoge@dummy.com','abc'); insert into users (name,email,password) values ('foo','foo@dummy.com','def'); 以上、よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • この場合のSQL構文を教えてください(MYSQL5.0)

    お世話になります。下記の場合どうしたらできるかどうか教えてください。 ・商品リストテーブル  商品ID(int primary key auto_increment )  商品名(char) ・受注リストテーブル  受注ID(int primary key auto_increment )  商品ID(int)  注文者(char) 上記のように二つのテーブルに分かれています。 (1)新商品の注文が入ると、商品リストテーブルにレコードがINSERTされ 受注リストにも同時にINSERTされるとします。 (2)すでに商品リストテーブルに登録済みの商品名の場合は受注リストテーブルのみINSERTされます。 この場合、商品リストの商品IDは自動インクリメントされるので問題ないですが、受注リストの商品IDはインクリメントされません。 商品リストに新レコードができると、このリストの商品IDは新しい番号がふられますが、この新しくできた番号を受注リストの商品IDに同時にいれたいのです。 ○方法として 二つのテーブルをJOINしてレコードをINSERTできるのならしたいのですが、どうゆうSQL文を書けばいいのかわかりません。 またその方法以外にとりあえず商品リストテーブルにだけINSERTしてそのタイミングで受注リストテーブルにトリガでINSERTとかする方法もありなんでしょうか? できればJOINした方にINSERTする方法でやりたいのですが、無理なら後者のほうでもいいんですが・・・。 SQL文わかる方どうかよろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • テーブルに入っているデータと重複チェックしたい

    やりたいこと: phpを実行して取得したデータの内容と既にDBのテーブルに格納されているデータを 比較して、 異なっていれば、新しいデータとして INSERT INTO文で テーブルにデータを登録する。 同じであれば、登録しない。 という処理がしたいです。 $sql = "select * from hoge where url= $page_uri"; $kakunin = mysql_query($sql , $db ); if ( $page_uri == $kakunin ){ //同じデータならスキップ break; } else{ $sql = mysql_query("INSERT INTO hoge VALUES (0,'$page_uri','$pon')"); と書いているのですが、以下のエラーが出てしまいます。。 Fatal error: Cannot break/continue 1 level in /www/xx.php on line 42 これは、breakは使えないよ ってことでしょうか? breakでなくても やりたいことが実現できればこだわりはないのですが、、 アドバイスよろしくお願いします。

    • 締切済み
    • PHP
  • PHP+MySQLでこのようなシステム

    PHPとMySQLで、このようなシステムを作れないかと考えているのですが、可能か不可能か、もしくはヒントだけでもいただだけないかと思い、質問させていただきました。 まず、PHP+MySQLというのは、javascriptとかも初心者用の本を買ったりしたのですが、こういうところに使うとかいまいち理解できず、 現在PHP+MySQLと必要な時だけjavascriptのサンプルをコピペとかで使って事足りているということです。 PHP+MySQLの知識は、浅い方ですが、データベースを使っての表示や条件抽出くらいはできるくらいです。 主に使うデータベース・ページは、下記の通りです。 データベース内にテーブルが複数あります。 ・table_01 ・table_02 ・table_03 全テーブルデータの一覧を表示させるPHP(1ページ20件毎に表示させています) ・itiran.php 各会員ページのPHP ・mypage.php 「このようなシステム」というのは、 ・一覧ページ【itiran.php】に[追加]ボタンを作り、[追加]を押すと会員ページ【mypage.php】に追加した商品が一覧として表示される ・【itiran.php】および【mypage.php】で追加した商品を一覧から[削除]できる ・【itiran.php】の各商品には、追加している人数[登録数]が表示される([削除]した場合は、人数は-1となる) 【itiran.php】テーブル例 ┼───┼───┼───────┼───┼ │NAME│ZAIKO│お気に入り    │登録数│ ┼───┼───┼───────┼───┼ │ポニョ │2,000 │ 追加       │500 │ ┼───┼───┼───────┼───┼ │ゲド  │1,000 │ 追加       │300 │ ┼───┼───┼───────┼───┼ │トトロ │9,000  │登録済み・・削除│100 │ ┼───┼───┼───────┼───┼ ・データベースは、各テーブル更新があった場合、一度の更新数が多くいので、1テーブルまるごとCSVで更新しています。 ・登録数を、このテーブル内に入れておいた方が良いのでしょうか。 参考になるようなサイトもなく、PHP+MySQL可能か不可能か、もしくはヒントだけでもお願い致します。

    • ベストアンサー
    • PHP
  • MySQLでinsertした行を取得する

    table t1 id name ------- 1 aaa 2 asv 3 aae といったauto incrementのidを持ったテーブルt1を考えたときに mysql_queryで新規行をinsertした場合にそのidを取得するような ことはできるのでしょうか? phpのmanualを参考にしたところ出来ないような感じのことが書かれて いたのですが,このようなことは頻繁に必要な気もするのですが・・・ 既に考えた案としては ・auto incrementを外して最大のidの1つ上を指定してinsertする ・一度lockしてからinsertして最大のidを取得する というものです もっと1つの関数かなにかでスマートに書けたらいいのですが

    • ベストアンサー
    • PHP
  • MySQLのPDO接続に関して

    SELECT文を使って件数やデータを取得することはできますが、 INSERT文を使って、データを追加することができません。 他のテーブルへはこの記述で書き込みを行えております。 書き込めない理由がわからず困っています。 よろしくお願いいたします。 ■INSERT文のソースコードです。※テーブル名、項目名は一部変更しておりますが、 実際のソース上では、テーブル名、項目名は同じにしております。項目数に変更はございません。 -------------------------------------------------------------------------- if($dbh != null){ print '接続に成功しました。<br />'; //データを登録 $sql = 'insert into test (name,flag1,content1,content2,flag2) values (?,?,?,?,?)'; $stmt = $dbh->prepare($sql); var_dump($stmt); print '<br />'; $flag = $stmt->execute(array($name,$flag1,$content1,$content2,$flag2)); if($flag){ print 'データの追加に成功しました<br />'; }else{ print 'データの追加に失敗しました<br />'; var_dump($flag); print '<br />'; } }else{ print '接続に失敗しました。<br />'; } ■画面への表示※質問板に投稿するにあたり、テーブル名、項目名の変更している都合により、string(80)とは異なっております。項目数に変更はございません。 ---------------------------------------------------------- 接続に成功しました。 object(PDOStatement)#2 (1) { ["queryString"]=> string(80) "insert into test (name,flag1,content1,content2,flag2) values (?,?,?,?,?)" } データの追加に失敗しました bool(false) ■データベース※質問板に投稿するにあたり、テーブル名、項目名の変更しております。項目数、型に変更はございません。 ---------------------------------------------------------- テーブル: test 項目: num bigint(20) UNSIGNED AUTO_INCREMENT name varchar(255) flag1 int(1)→0か1が入ります content1 longtext content2 longtext flag2 int(1)→0か1が入ります

    • ベストアンサー
    • MySQL
  • AUTO_INCREMENTのあるテーブルにinsertできません(長文)

    mysql5.0.27(RedhatLinux 9)です。 属性のひとつがAUTO_INCREMENTになっているテーブルhogeに、データをinsertしたいのですが、「コラムの数が合致しない」というエラーで、insertできません。 Webをいろいろ漁って、AUTO_INCREMENTの属性は明示的に指定しないようだと理解しました。冗長で申し訳ないのですが、エラーが出た状態のものを、そのまま掲載させていただきます(テーブル名や属性名のみ変更しました)。 状態をまとめると、以下のようになります。 ・下記のテーブル定義で、テーブルは普通にcreateできた。 ・descで確認しても、ちゃんとテーブルはできているよう。 ・下記のinsert文で、その下のエラーメッセージが出て、データを登録できない。 ・どうみても、コラム数は合っている(と思う)。 ・下記のテーブル定義の属性数を適当に減らす(id, item1, item4, item6くらいにする)と、エラーが出ずデータがちゃんとinsertできる。 私はなにか、とんてもない勘違いをしているのでしょうか?かなりの時間試行錯誤しているのですが、一向にわかりません。。。 ===== テーブル定義 ===== CREATE TABLE hoge ( id MEDIUMINT UNSIGNED AUTO_INCREMENT NOT NULL, item1 VARCHAR (64) NOT NULL, item2 VARCHAR (64) NOT NULL, item3 VARCHAR (32) NOT NULL, item4 VARCHAR (64), item5 VARCHAR (64), item6 VARCHAR (16) NOT NULL, CONSTRAINT PK_HOGE PRIMARY KEY (id) ) type=innodb; CREATE INDEX IDX_HOGE_1 ON hoge(item1); CREATE INDEX IDX_HOGE_2 ON hoge(item2); CREATE INDEX IDX_HOGE_3 ON hoge(item3); CREATE INDEX IDX_HOGE_4 ON hoge(item4); CREATE INDEX IDX_HOGE_5 ON hoge(item6); ===== descの出力 ===== +---------------------+-----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------------+-----------------------+------+-----+---------+----------------+ | id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment | | item1 | varchar(64) | NO | MUL | | | | item2 | varchar(64) | NO | MUL | | | | item3 | varchar(32) | NO | MUL | | | | item4 | varchar(64) | YES | MUL | NULL | | | item5 | varchar(64) | YES | | NULL | | | item6 | varchar(16) | NO | MUL | | | +---------------------+-----------------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec) ===== insert文 ===== insert into hoge (item1, item2, item3, item4, item5, item6) values ( 'data1','data2', 'data3', 'data4', 'data5', 'data6'); ===== エラーメッセージ ===== ERROR 1136 (21S01) at line 1: Column count doesn't match value count at row 1 長文大変申し訳ありません。よろしくお願いします。

  • auto_incrementの値の取りだし方

    またまたお世話になります。 いつも秒殺質問ばかりしているnak205です。 いまPHPとMySQLでフォームから受付を行い、auto_incrementで発行した受付番号を受付完了画面に表示させるようなものを使っています。 そこで困っているのが、MySQLにデータをINSERTしたあと、どうやって正確にインクリメントされたばかりの受付番号を得ればいいかというところです。 データをINSERTしたあと、受付番号を得るSQLを発行してる間に他の受付が入ってしまえば数字がずれてしまいますよね。INSERTと同時にauto_incrementで出来た数字の値を得る関数がPHPかMySQL側にありますか? 受付番号だけ別テーブルに置いてauto_incrementではなく、PHPで管理したほうが良いんでしょうか?

    • ベストアンサー
    • PHP