イントラネットシステムでは、注文番号を送信する際に重複防止判定を行いますが、同じ注文番号が二度送信されるのではなく、一度だけ送信されます。

WBOY
リリース: 2016-06-23 14:00:16
オリジナル
1061 人が閲覧しました

イントラネット システム、
サーバーサイド PHP+MYSQL
データ テーブルのフィールドの値は、書き込み時に PHP で判断されます。 通常、同じ注文番号でデータを繰り返し挿入することはできないというメッセージが表示されますが、操作時に明らかに 1 回のみ送信する場合があります。しかし、データはまったく同じであり、2 つの部分が同時に同じ秒に書き込まれていることがわかりました。
あのヒーローは何が起こっているか知っています。


ディスカッションに返信 (解決策)

送信を 2 回連続してクリックしたと推定されます

現在、この状況に対してフロントエンドとバックエンドの 2 つの制限があります

フロントエンドが送信ボタンをクリックすると、最初に送信ボタンが灰色になり、クリックできなくなり、結果を返した後、プログラムのロジックがジャンプまたは復元されます

バックグラウンドで挿入する前に、最初にボタンがあるかどうかを判断します。すでにこのデータ (繰り返しできない 1 つまたは複数のフィールドに基づいて判断します) そうでない場合は、それを挿入します

まあ、フォーム送信の場合は、クリックした後、js を使用してボタンを無効にすることもできます。最初に js を使用して送信します

私は一度だけクリックしましたが、この機会は毎月 1 回または 2 回発生します。まず、現在の注文番号が存在するかどうかを確認します。データベースに書き込むジョブを実行できます。それで何が起こったのか混乱しています。 。 。

それはあなたが書くコードに依存し、ソースから問題を解決します。

2 番目の同時実行の問題。
たとえば、
AB に同時に到着する A と B の 2 つのリクエストがあり、両方のリクエストがその位置を繰り返すかどうかの判断を通過します。その後、A が挿入されると、それに応じて B が挿入されます。

繰り返し挿入を避けるために、このように書くことができます。
たとえば、テスト テーブルには名前と値の 2 つのフィールドがあります

INSERT INTO test(name, value) SELECT 'fdipzone', '123' FROM DUAL WHERE 'fdipzone' NOT IN (SELECT name FROM test);
ログイン後にコピー
ログイン後にコピー

イントラネット システムであるため、同時実行の量は決して高くはなく、複数のユーザーが同時にボタンをクリックする確率は均等ですより低い。
繰り返しの送信を防ぐためにフロントエンドで適切な作業を行い、バックグラウンドで送信を検証するだけにしてください。

2 番目の同時実行の問題。
たとえば、
AB に同時に到着した 2 つのリクエスト A と B があり、どちらもその位置を繰り返すかどうかの判断を通過しました。その後、A が挿入されると、それに応じて B が挿入されます。

繰り返し挿入を避けるために、このように書くことができます。
たとえば、テストテーブルには名前、値の 2 つのフィールドがあります

INSERT INTO test(name, value) SELECT 'fdipzone', '123' FROM DUAL WHERE 'fdipzone' NOT IN (SELECT name FROM test);
ログイン後にコピー
ログイン後にコピー

あなたの書き方が賢明だと思います、そして、insert ステートメントで別の判断をすることができます。

複数のユーザーが同時に同じコンテンツを投稿する確率は非常に低いですが、投稿者は「時々」しか起こりません
プログラムの問題はさておき、この状況は 10 年前にはよく起こりました。その理由は、ブラウザのアップグレードされたバージョンが不安定で、1 つのリクエストでデータが 2 回送信されるためです。もちろん、これは修正されています。ただし、懐かしい人がそれを使用することに固執すると、問題が発生するのが普通です
別の状況としては、フォームがこのページに送信されていないか、この時点でユーザーのマウスが疲れすぎている場合です。をクリックすると、シングルクリックがダブルクリックになります。これにより、二次投稿も可能です

こういった人為的失敗を防ぐため、受信時に判断していただくことも可能です

session_start();if(isset($_SESSION['post']) && $_SESSION['post'] == md5(serialize($_POST))) return;$_SESSION['post'] = md5(serialize($_POST));//正常的提交处理
ログイン後にコピー


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート