php
  • mysql
  • sql
  • upsert
  • 2011-09-05 99 views 0 likes 
    0

    我正在使用mysql_affected_rows()檢查是否必須輸入新記錄或更新現有的,但問題是如果用戶試圖輸入完全相同的數據作爲已存在的記錄它運行插入成。mysql_affected_rows();不檢查行是否存在

    $result = mysql_query("update Data set Score='$score',Comment='$_POST[Comments]' where Date='$_POST[forDay_3]-$_POST[forDay_1]-$_POST[forDay_2]' AND User='$_POST[UserID]';"); 
    $last = mysql_affected_rows(); 
    
    if ($last==0) { 
    
        $result1 = mysql_query("INSERT INTO Data (User,Date,Score,Comment) VALUES ('$_POST[UserID]','$_POST[forDay_3]-$_POST[forDay_1]-$_POST[forDay_2]','$score','$_POST[Comments]')"); 
    

    是我應該做的,以避免重複條目

    +3

    請,請有關[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)立即讀取。 –

    +0

    欣賞tht,但我只是試圖使功能部分第一。 – PUG

    +1

    只是一個建議,但我會開始考慮PDO。 http://php.net/pdo –

    回答

    0
    1. 您可以解析mysql_info()輸出(但是解決方案本身將通過競爭條件問題的影響)
    2. 你可以創造出獨特的鍵User + Date和使用ON DUPLICATE KEY UPDATE語法結束單個查詢:

      INSERT INTO `Data` (User,Date,Score,Comment) 
      ('$_POST[UserID]','$_POST[forDay_3]-$_POST[forDay_1]-$_POST[forDay_2]','$score','$_POST[Comments]') 
      ON DUPLICATE KEY UPDATE Score='$score',Comment='$_POST[Comments]' 
      
    +0

    重複密鑰更新方法似乎更容易,它的工作很棒! – PUG

    0

    一些解決方案:

    1. 添加另一個查詢,看是否存在的數據,然後決定是否需要做一些動作(更新/刪除),或什麼都沒有。
    2. 型「時間戳」添加「修改」列,使其在更新 - CURRENT_TIMESTAMP

    我會去的第一個選項。

    順便說一句,你應該逃避你的post數據(mysql_real_escape_string),以防止或內噴射畸形的查詢字符串

    +0

    1.如果OP不處理交易和鎖定,它可能會導致競爭條件2.有一些系統可以在一秒內發出請求(因此將具有相同的時間戳) – zerkms

    +0

    1.在PHP中,它不應該導致問題。 2.使用毫秒然後 – galchen

    +0

    1.你錯了2.也受到競爭條件的影響 – zerkms

    0

    你可能會受到影響的行數與FOUND_ROWS(),而不是mysql_affected_rows()。後者也計算未修改的行。

    $result = mysql_query("update Data set Score='$score',Comment='$_POST[Comments]' where Date='$_POST[forDay_3]-$_POST[forDay_1]-$_POST[forDay_2]' AND User='$_POST[UserID]';"); 
    $last = mysql_query("SELECT ROW_COUNT();"); 
    $last = mysql_fetch_array($last); 
    ... 
    

    參考:http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_row-count

    相關問題