內網系統,單號在提交時有做防重複判斷,但是相同單號提交一次變成兩次。

來源:互聯網
上載者:User
內網系統,
服務端PHP+MYSQL
資料表欄位的值在寫入時PHP中有做判斷,正常提示相同的單號不可能會重複插入資料的,但是有時候人家操作時明明只提交了一次,但是探索資料一模一樣且同一時間同一秒寫入了兩條。
那位大俠知道怎麼回事呀。


回複討論(解決方案)

估計是連點了兩次提交

我目前對於這種情況是前後台兩種限制

前台當點擊提交按鈕時先把提交按鈕變灰,並且不可點 ,然後再ajax向後台傳值 返回結果後視程式邏輯轉跳或者恢複按鈕

後台插入前先判斷是否已經有這條資料了(根據一個或幾個不可能重複的欄位來判斷) 如果沒有才進行插入.

額,如果是form表單提交的話 也可以用js來代替submit 點擊後js先禁用按鈕,再用js進行submit

只點了一次,但這種機率一個月會遇到一兩次,我PHP代碼中有先查詢當前這個單號是否存在,如不存在才能執行寫入資料庫的作業的。所以糾結是什麼情況出現的。。。

具體要看你寫的代碼,從源頭解決問題。

秒並發問題。
例如有兩次請求A,B同時到達
AB,都過了判斷是否重複那個位置,然後當A插入後,B都會跟著插入。

可以這樣寫來避免重複插入。
例如test表有兩個欄位 name,value

INSERT INTO test(name, value) SELECT 'fdipzone', '123' FROM DUAL WHERE 'fdipzone' NOT IN (SELECT name FROM test);

既然是內網系統,並發量肯定不會很高,多個使用者同時點擊按鈕的機率更低。
做好前端防止重複提交,後台驗證提交即可。

秒並發問題。
例如有兩次請求A,B同時到達
AB,都過了判斷是否重複那個位置,然後當A插入後,B都會跟著插入。

可以這樣寫來避免重複插入。
例如test表有兩個欄位 name,value

INSERT INTO test(name, value) SELECT 'fdipzone', '123' FROM DUAL WHERE 'fdipzone' NOT IN (SELECT name FROM test);

我覺得您的寫法應該可取,在插入語句裡再判斷一次。

雖然多個使用者同時提交相同的內容的機率很低,但樓主也只是“有時候”出現
撇開程式的問題,這種情況在十年前經常出現。原因是瀏覽器的升級版本不穩定,導致一個請求發送兩次資料,當然現在都已經修複了。不過懷舊者非要使用的話,出現問題也就很正常了
另一種情況是:表單不是提交到本頁,或提交是由 ajax 完成的,此時如果使用者的滑鼠過於勞累,單單擊變成了雙擊。從而造成二次提交也是可能的

防範這些非人為的故障可以在接收時做一下判斷

session_start();if(isset($_SESSION['post']) && $_SESSION['post'] == md5(serialize($_POST))) return;$_SESSION['post'] = md5(serialize($_POST));//正常的提交處理
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.