質問: PHPとMySQLを使用して、受注システムを設計し運営しているのですが、 たまに登録漏れが発生してしまいます。 多数の端末から同時にアクセス、使用された際に頻繁に起こります。 解決策のご教授をいただけますと幸いです。 ### 受注システムの流れ 1受注フォームから必要事項(名前、メールアドレス)を入力して送信する 2PHPとMySQLで入力チェックと登録を行う(PDOでinsert) テーブルは下記の通りです。 id(int) | name(varchar) | mailaddress(varchar) | comment(text) ※ 「id」は受注管理番号(主キー)とし、 登録をするときに「auto_increment」で重複しないように生成しています。 3登録完了後に、入力されたメールアドレスへ登録完了のメールを送る ### 問題 ``` 多数の端末から同時使用した際に、データベースへの登録漏れが発生してしまいます。 データベースへの登録漏れが発生しても3のメール送信は問題なく実行されています。 登録完了を知らせるメールで受注管理番号(id)を記載しているのですが、 その受注管理番号(id)が重複していた(同じ番号が使われていた)ため問題が発覚しました。 AさんとBさんが同じタイミングで別々の違う端末から登録をこなうと、 Bさんしか登録されず、Aさんが登録漏れしてしまうという症状です。 メールでは、それぞれ ・Aさんのメール 受注番号:00001 名前:Aさん メールアドレス:name_a@yahoo.co.jp コメント:・・・ ・Bさんのメール 受注番号:00001 名前:Bさん メールアドレス:name_b@yahoo.co.jp コメント:・・・ となります。 ``` ### 本当にシンプルなシステムですので、記載したこと以外の処理は行っていません。 登録のタイミングが同じだと「auto_increment」による生成で同じ番号が発行され、 どちらかの登録処理が無効になることがあるのでしょうか? 本当に困っておりますので、ご教授いただけますと幸いです。 よろしくお願い致します。 ### 補足情報 レンタルサーバー: heteml(ヘテムル) PHPバージョン: 5.4 ・登録処理は「PDO」 ・メール送信は「mb_send_mail」
回答: * 登録時、本当になにもidには入れていないですか?lastInsertIdを入れたりしてませんか?タイミングによっては同じIDがlastInsertIdで引かれることになるので、後から入れたBさんに上書きされている可能性があります。 * 処理の前後でトランザクションを使われていますか?トランザクションが使われていればおそらくダブることはないと思います