2014-01-25 59 views
0

目前我有一個應用程序,當用戶點擊提交按鈕時,它會觸發insert代碼插入reports函數的記錄。php一段時間後插入數據

我現在面臨的問題是,用戶不是計算機專家,因此我從表中獲得了不準確的數據。以下是導致數據捕獲錯誤的幾個示例。

案例1:一旦用戶點擊提交按鈕,數據已經insert到數據庫,但用戶不小心碰到再次提交再次按鈕和insert觸發並導致數據庫具有不同的時刻存在兩種相同的記錄在大約5到10秒內。例如,用戶想要鍵入29/10/2013但用戶鍵入爲28/10/2013,並且用戶再次按下後退按鈕並插入正確的用戶名一個是29/10/2013,一個交易有兩個記錄,一個是正確的日期,一個是錯誤日期。

下面是代碼:

$stmt = $db->prepare("INSERT INTO log (dob, log_datetime, log_count, amount) VALUES (?, ?, ?, ?)"); 
$stmt->bindParam(1, $userDate); 
$stmt->bindParam(2, $now, PDO::PARAM_STR); 
$stmt->bindParam(3, $cust_count); 
$stmt->bindParam(4, $amount); 

date_default_timezone_set('Asia/Kuala_Lumpur'); 
$now = date('Y-m-d H:i:s'); 
$cust_count = 1; 
$amount = 10; 
$stmt->execute(); 

上述觸發的代碼,每當用戶點擊提交按鈕,所以我想是有可能使insert代碼一段時間後觸發,例如30sec

其他注意事項

  1. 這是開發的應用程序,並從表
  2. 它無關,與表單驗證執行數據庫,因爲我已經編碼的形式驗證的一部分。
  3. 我的問題是有沒有什麼辦法來觸發特定的時間量insert查詢設置

我在SO和谷歌搜索,但我找不到一個相關的例子進行工作。

請給我建議任何可以解決上述兩種情況的方法。

謝謝。

回答

1

對於第一種情況,當表單被引用時禁用該按鈕。 對於第二種情況,validate將其插入數據庫之前的日期。

+0

也許你沒有讓我清楚,不是表單驗證部分。我的數據庫存儲日期從01/01/1940到01/01/2021,用戶需要輸入每個日期以提取他們想要的數據。這是一個應用程序,我不需要進一步解釋功能。現在我的問題是存儲數據到MySQL有無論如何使'插入'代碼觸發在特定的時間,例如:30秒等等? – Nescafe

0

MySQL沒有這種行爲。我認爲你正在尋找的是一個異步任務隊列,如Celery

0

試圖捕獲所有的UI泄漏可能證明是困難和繁瑣的。

我會用cust_count作爲候選鍵,而使用DB中的時間戳的時間濾波器

我將查詢最近的記錄(在最後30秒),並更新了最後一條記錄(如果有的話)而不是重新創建它。

原理例如:

function update_log ($entry) 
{ 
    $recent = $db->select (
      "id FROM log 
      WHERE timestamp > now()-30 seconds 
      AND user = $entry->user"); 
    if ($recent) 
    { 
     // overwrite last record with current entry (and refresh timestamp) 
    } 
    else 
    { 
     // create a new entry 
    } 
} 

你甚至可以刪除該用戶的所有日誌將出現不到30秒的條目。

+0

介意舉個例子嗎?我無法弄清楚你說什麼。 – Nescafe

+0

看到我的編輯.... –

0

在提交時禁用提交按鈕,並在提交後頁面上向用戶顯示提交的數據,併爲他們提供一種清晰的編輯方式。

用戶普遍認爲重新打回表單並不是一個好主意,但您並沒有給他們更好的選擇。

+0

我正在努力使非計算機精明的一個較不復雜的方法,我的方法很簡單,輸入數據頁面 - >提交 - >結果頁面。正如我所提到的,他們不懂計算機,有時候他們可能會在數字鍵盤上輸入錯誤的數字,當結果顯示錯誤的日期而不是他們想要的日期時,他們會點擊後退按鈕輸入正確的日期。 – Nescafe