內網系統,
服務端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));//正常的提交處理