2010-02-13 90 views
98

我已經給出了這個代碼來給出+1點,但它不能正常工作。mysql更新查詢的遞增值

mysql_query(" 
    UPDATE member_profile 
    SET points= ' ".$points." ' + 1 
    WHERE user_id = '".$userid."' 
"); 

的$分變量是user's點現在..我希望它加一個吧..所以舉例來說,如果他有一個像5分,應該是5 + 1 = 6 .. 但它沒有,它只是改變爲1

我做錯了什麼?謝謝

+1

我有一個類似的問題,然後意識到該字段的默認類型是'NULL',將其更改爲0,一切都很好。 – Azmeer 2017-02-01 08:58:55

回答

222

你也可以只做到這一點:

mysql_query(" 
    UPDATE member_profile 
    SET points = points + 1 
    WHERE user_id = '".$userid."' 
"); 
+58

@Steve對於知道PDO是什麼的人來說,您的評論聽起來很聰明,但對於我只是潛入PHP/MySQL的人而言,它並沒有真正發現這件事。 PDO是否使代碼更小或更優雅?如果是這樣,請編輯答案或張貼你自己的地方,告訴你如何使用PDO更好。謝謝。 – 2013-01-21 19:06:47

+5

@CamiloMartin我也很好奇。我發現這有幫助http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-should-you-use/ – 2013-01-26 06:41:09

+8

@CamiloMartin [php.net手冊](http://php.net /manual/en/function.mysql-query.php)mysql_query的頁面有如下注意: 從PHP 5.5.0開始,這個擴展已被棄用,並且將來會被刪除。相反,[MySQLi](http://www.php.net/manual/en/book.mysqli.php)或[PDO_MySQL](http://www.php.net/manual/en/ref.pdo-應該使用mysql.php)擴展名。另請參見[MySQL:選擇API](http://www.php.net/manual/en/mysqlinfo.api.choosing.php)指南和[相關FAQ](http://www.php.net/manual /en/faq.databases.php#faq.databases.mysql.deprecated)以獲取更多信息。 – aland 2013-03-24 21:55:08

6
"UPDATE member_profile SET points = points + 1 WHERE user_id = '".$userid."'" 
+1

如果我使用變量而不是值= 1,該怎麼辦?我應該這樣做「points = points + $ variable」?或「points = points +'$ variable'」 – 2013-05-20 06:12:18

1

取出'point各地:

mysql_query("UPDATE member_profile SET points=".$points."+1 WHERE user_id = '".$userid."'"); 

你在你的原始查詢「鑄造」的整數值串...

0

爲什麼你不讓PHP做這項工作?

"UPDATE member_profile SET points= ' ". ($points+1) ." ' WHERE user_id = '".$userid."'" 
+5

好點,但要小心併發環境,因爲DB值可能在此期間發生了變化。 – 2013-12-30 21:00:30

+1

謝謝@VincentNikkelen,你撞上了頭部。併發! – 2016-11-12 02:10:20

+1

如果你使用這個方法,你應該先選擇數據,這意味着對該行的額外訪問。如果您只需要更新該值,這不是一種好的方法。 – andufo 2017-06-05 06:53:51

16

你可以做到這一點,而不必查詢實際的點數,所以它會在腳本執行過程中節省一些時間和資源。

mysql_query("UPDATE `member_profile` SET `points`= `points` + 1 WHERE `user_id` = '".intval($userid)."'"); 

否則,你是做錯了是你通過老的分額作爲字符串(points='5'+1),並且不能將號碼添加到字符串。 ;)

10

希望我不會在我的第一篇offtopic,但我想擴大一點整數的鑄造字符串作爲一些受訪者似乎錯了。

由於此查詢中的表達式使用算術運算符(加號+),因此MySQL會將表達式中的任何字符串轉換爲數字。

爲了演示,下面將產生結果6:在MySQL

SELECT ' 05.05 '+'.95'; 

字符串連接需要CONCAT()函數,所以這裏沒有歧義和MySQL轉換字符串浮並將它們相加。

我實際上認爲最初的查詢不起作用的原因很可能是因爲$ points變量實際上並未設置爲用戶的當前點。它被設置爲零,或者未設置:MySQL會將空字符串轉換爲零。爲了說明,下面將返回0:

SELECT ABS(''); 

就像我說的,我希望我沒有太偏離主題。我同意Daan和Tomas爲這個特殊問題提供了最好的解決方案。

+0

+1 compton非常好的觀點,你是對的演員工作,在那裏引號或不。歡迎來到SO! – 2010-02-13 22:52:26

7

此外,以 「增量」 的字符串,當更新,使用CONCAT

update dbo.test set foo=CONCAT(foo, 'bar') where 1=1 
2

誰需要更新的字符串和數字 SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:[email protected]+1);

0

您應該使用PDO來防止SQL注入風險。

您可以連接到數據庫這樣的:

try { 
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; 
    $bdd = new PDO('mysql:host=xxxx;dbname=xxxx', 'user', 'password', $pdo_options); 
    $bdd->query('SET NAMES "utf8"'); 
} catch (PDOException $e) { 
    exit('Error'); 
} 

無需查詢數據庫來獲得點數。您可以直接在更新查詢中增加(points = points + 1)。

(注:另外,這不是一個好主意,因爲你首先需要選擇數據和值可以改變,如果其他用戶更新,它增加與PHP的值。)

$req = $bdd->prepare('UPDATE member_profile SET 
      points = points + 1 
      WHERE user_id = :user_id'); 

$req->execute(array(
    'user_id' => $userid 
));