• 締切済み

データの同時編集を制限する方法 PHP MySQL

PHPとMYSQLで、情報の共有用のフォームを作っているのですが、複数人による同時編集の制限について困っております。 フォームへの書き込みが追記されていくようにしたいと考え、フォームを編集するとMysqlのデータを読み出してきて編集し、編集完了ボタンでMysqlのデータを上書きするものです。 当たり前なのですが、パソコンAとパソコンBで同時に編集した場合は後出しのみ残ります。これを全ての書き込みを残すようなものにしたいのですが、具体的な考え方がわからず困っています。 質問です 「他社が編集中はデータを上書き禁止にする」やBBSのようにどんどん追記していく方法があると思うのですが概念としてのロジックはどの様なものがあるのでしょうか 出来るだけ簡単な方法で、複数人での同時編集したデータが消えなければいいレベルのものを作りたいと考えています。 どなたかスキルのある方のご教授を頂ければ幸いです。

みんなの回答

回答No.2

複数のクライアントから書き込む場合は「上書き」をしないで「追記」をするようにします。 「既存のデータはいじらない」ようにするのが「鉄則」です。 表示する時は「バラバラに追記された物を、時系列に並べて、1箇所に表示」します。 それとは別に「追記用のテキストボックス」を作って、追記ボタンなどで「書き込み時間、スレッド名、投稿者名などと一緒に、データベースにINSERT」します。UPDATEしてはいけません。 読み出す場合は、スレッド名で絞り込みして、書き込み時間で昇順か降順に並べて、SELECTします。 こうすると「完全に同時に書き込み」をしても「SQLのデータベースに、順番に追加されていく」ので、問題は起きません。

makino03
質問者

お礼

INSERTですね、INSERTされるようにします! 非常にアレンジもしやすそうでわかりやすくてchie65535さんのスキルの高さを感じます。 丁寧な説明をありがとうございます。 やってみます!

  • t_ohta
  • ベストアンサー率38% (5239/13709)
回答No.1

一番いいのはDBのデータをUPDATEするのでは無く、編集したものをINSERTで追記していく方法ですかね。 記事を管理するマスターテーブルを用意し、記事の管理番号を割り振ります。 記事のデータテーブルにはデータの管理番号(通番)と記事の管理番号、投稿日時を記録するようにします。 表示自体は記事の管理番号を元に、投稿日時が一番新しいデータを表示すれば問題無いでしょう。 編集を開始する時は、最新データの管理番号をフォームのhiddenで受け渡すようにしておき、submitされて来たらデータテーブルの最新データの管理番号と編集したデータと一緒に送られてきたデータの管理番号を照合して、異なっていたらコンフリクトが発生したと判断して、DBに保存せず再度フォームを表示してコンフリクトが起きていることを表示して再編集してもらうと言ったやり方がいいんじゃないでしょうか。

makino03
質問者

お礼

なるほど、わかりやすい説明をありがとうございます。 やってみます!

関連するQ&A