2014-04-30 30 views
0

我從來沒有問過任何其中之一,我通常可以通過 想到或找到一個發佈的想法。 我嘗試過我想到的方式,嘗試使用看起來應該工作但不去的CASE示例。它不會在任何情況下更新。重複密鑰上的Mysql更新表僅當BlahVAl <BlahRowVal

這裏確定是什麼,我試圖做的:

$Mysqlinfo="INSERT INTO `$PNum` (P_IDNum, P_Name, Raw_Time, Total_Time, T_Mode) 
     VALUES ('$PersId', '$_POST[PersonaName]', '$Stats_Vals[1]', '$Stats_Vals[2]', '$Stats_Vals[5]') 
     ON DUPLICATE KEY UPDATE Car_Model='$Stats_Vals[1]', Total_Time='$Stats_Vals[5]', Raw_Time='$Stats_Vals[7]', T_Mode='$Stats_Vals[2]' (there was originally the "; at end here) 
     ***WHERE Raw_Time > '$Stats_Vals[7]'";*** 

(有多個名稱存在,但我刪除了一些,所以還不是SOOO龍,所以不介意這麼多的$ Stats_Vals數字作爲結構)。

這個東西沒有在最後的WHERE工作,除非它總是會插入或更新,我知道哪裏不適用與ON DUPLICATE KEY不幸的是,什麼是一個簡單的等價物? 它必須爲纈氨酸chk和做任何,如果條件不是真的。

噢,它被格式化爲用於PHP腳本。 :0)

非常感謝您的幫助!

編輯 - 這是一些最不我想實現的條件PHP/SQL代碼,它是由一個應用程序調用:

<?php 
hostname and 
database info here 
Variables, $_POST... etc. 

$link = mysql_connect($hostname, $username, $password); 
     if (!$link) { 
       die('Connection failed: ' . mysql_error()); 
     } 
     else{ 
      echo "Connection to Server successful!" . PHP_EOL; <for testing from web 
} 

     $db_selected = mysql_select_db($database, $link); 
     if (!$db_selected) { 
      die ('Can\'t select database: ' . mysql_error()); 
     } 
     else { 
      echo "Database successfully selected!". PHP_EOL; 

$Mysqlinfo="INSERT INTO `$PNum` (P_IDNum, P_Name, Raw_Time, Total_Time, T_Mode) 
     VALUES ('$PersId', '$_POST[PersonaName]', '$Stats_Vals[1]', '$Stats_Vals[2]', '$Stats_Vals[5]') 
     ON DUPLICATE KEY UPDATE Car_Model='$Stats_Vals[1]', Total_Time='$Stats_Vals[5]', Raw_Time='$Stats_Vals[7]', T_Mode='$Stats_Vals[2]'"; 

    if (!mysql_query($Mysqlinfo,$link)) 
       { 
       mysql_close($link); 
       die('Error: ' . mysql_error()); 
       } 
}    
mysql_close($link); 
?> 

它的工作原理不同的是未以下的僅更新,如果條件Raw_Time較少。 再次感謝!

回答

0

沒有單一查詢解決方案,您必須檢索適當記錄(如果存在)的Raw_Time列的值並在PHP腳本中評估該值;或者爲該任務創建一個存儲過程。

順便說一句,在用戶給出的查詢中插入值時,請注意安全問題,如SQL注入。

+0

我想我可能需要在幾個步驟中做到這一點,努力工作上述答案英寸我認爲我的頭需要休息首先LOL THX! – user3591080

0

如果你想使更新有條件,那麼恐怕你不能用INSERT...ON DUPLICATE KEY UPDATE...來完成。你必須在兩個或更多的查詢中完成。而爲了讓原子,你將不得不使用LOCK TABLES

$primarykey = 'whatever'; 

query("LOCK TABLES mytable WRITE;"); 

$count = query("SELECT COUNT(*) FROM mytable WHERE id=?;", $primarykey); 

if($count>0) // the ID already exists 
{ 
    $time = query("SELECT Raw_time FROM mytable WHERE id=?;", $primarykey); 
    if($time>$Stats_Vals[7]) 
     query("UPDATE mytable SET ... WHERE id=?;", $primarykey); 
} 
else 
    query("INSERT INTO mytable ..."); 

query("UNLOCK TABLES;"); 

有兩點要注意:

  1. 我打電話一些由功能query在這裏,因爲我不知道你用什麼方法來執行查詢。我也縮寫了一些查詢,因爲我懶得複製你的所有代碼。您需要根據您的需要調整代碼。

  2. 我也在查詢中使用了?作爲參數 - 這是防止SQL注入的好實踐。

  3. LOCK TABLES聲明用於確保在您檢查記錄存在的時間(SELECT COUNT(*)...)和更新時間之間沒有其他進程可以刪除您正在使用的記錄。如果發生這種情況,您的代碼將導致錯誤。

+0

好吧,看起來不錯,我在PHP代碼中發送這樣的查詢:if(!mysql_query($ mysqlinfo,$ link)) { mysql_close($ link); die('Error:'。mysql_error()); } – user3591080

+0

好的,這看起來不錯,我編輯我的帖子,以顯示我是如何發送它。我現在正在試圖將這一點轉化爲我的情況。我不太習慣PHP的SQL,它花了我一段時間才弄清楚如何以正確的方式獲得我已格式化的內容。所以這是一種雙重打擊,我可以在我的查詢或PHP格式中獲得probs。 :0) – user3591080

+0

當不是絕對必要的時候,不要鎖定整個表格,它很少。這是一個非常糟糕的做法。改用交易。 – mcserep