2011-05-26 85 views
2

如何在MySQL數據庫的單元格中增加int值?我知道自動增量是沒有用的,因爲我從不想添加新行,只需更新現有的行即可。我目前使用這個(用於明確崗位變種,在真正的代碼驗證):在MySQL字段中更新int

$columnToUpdate = 'type'.$_POST['voteid']; 
$query = "UPDATE myTable $columnToUpdate = $columnToUpdate+1 WHERE id=1;"; 
if(!mysql_query($query)) { 
    echo json_encode(array('success' => false, 'message' => 'Update failed: '.mysql_error())); 
    exit; 
} 

在數據庫中我有6個字段,ID,類型1,2型,3型,TYPE4,成的Type5和將id設置爲1的單行。意圖是接收數字(1-5),並在更新字段之前構建對正確列的引用。這導致Update failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=type4+1 WHERE id=1' at line 1,所以我想它沒有得到正確的字段值之前,它增加。

一旦這個工作,我也需要以相同的方式減少字段,除非它的值是0.所以對於獎勵積分,我可以在一個查詢中做所有這些事情,還是更好地分割它呢?

+2

Eww sql注入。 :-( – 2011-05-26 14:47:46

+0

就像我上面說過的,這是簡化的問題的根源。當然,我不只是把POST數據放入查詢:) – shanethehat 2011-05-26 14:50:12

回答

13

我想你已經錯過了從查詢「SET」關鍵字 - 嘗試

$query = "UPDATE myTable SET $columnToUpdate = $columnToUpdate+1 WHERE id=1;";

編輯:

做了「減量,除非它是零」,你可以使用這樣的:

UPDATE myTable SET $columnToUpdate = 
CASE $columnToUpdate 
    WHEN 0 THEN 0 
    ELSE $columnToUpdate - 1 
END CASE 
WHERE id=1;` 
+0

+1正確的答案。但是對於OP:您還需要注意@Denis的評論並處理您的SQL注入安全問題。 – Spudley 2011-05-26 14:50:23

+0

斑斑的先生,我好像失明瞭!喜歡刺激獎金問題? – shanethehat 2011-05-26 14:50:41

+0

(我已經編輯過我的文章,包括對它的猜測,但我不確定我是否會將其語法完美) – marnir 2011-05-26 14:52:21

3

獎勵積分,遞減:

$query = "UPDATE myTable SET '$columnToUpdate' = '$columnToUpdate'-1 WHERE id=1 AND '$columnToUpdate' > 0"; 
+0

不錯,而且會與原文結合。有點懶我問,謝謝! – shanethehat 2011-05-26 14:52:02

0

除了注入問題之外,您的工作流看起來好像可能需要一些工作。您確定要選擇將根據POST變量更新的列嗎?好像你會指定列,並使用變量來查找需要更新的記錄:

IE: 「UPDATE myTable SET votes=votes+1 WHERE id=$post_variable;

同樣,你應該把該變量作爲parameterized query保護自己免受SQL注射。