mysql更新查询中的增量值


138

我已将此代码用于提供+1分,但无法正常工作。

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

在$点变量是user's点现在..我希望它加一个吧..所以举例来说,如果他有一个像5分,应该是5 + 1 = 6 .. 但它不,它只是改变到1

我做错了什么?谢谢


2
我遇到了类似的问题,然后意识到该字段的默认类型为'NULL',将其更改为0,一切都很好。
Azmeer

Answers:


322

您也可以这样做:

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

59
@Steve对于知道PDO是什么的人来说,您的评论听起来很聪明,但是对于刚刚涉足PHP / MySQL的我来说,这实际上并没有给我们带来太多启发。PDO是否会使代码更小或更优雅?如果是这样,请编辑答案或发表自己的答案,以证明使用PDO更好。谢谢。
卡米洛·马丁

5
@CamiloMartin我也很好奇。我发现这是很有帮助net.tutsplus.com/tutorials/php/...
PJ深色

11
mysql_query的php.net手册页上的@CamiloMart 具有以下注意事项:自PHP 5.5.0起,此扩展名已弃用,以后将被删除。相反,应使用MySQLiPDO_MySQL扩展。另请参见MySQL:选择API指南和相关的FAQ,以获取更多信息。
2013年

9
如所示,将用户数据连接到SQL查询中是主要的SQL注入风险。
trognanders,2015年

1
@bigp:我尝试过UPDATE xyz SET points = MIN(points + 1, YOUR_LIMIT_VALUE_HERE),但是没有用。起作用的是:UPDATE xyz SET points = points + 1 WHERE points < YOUR_LIMIT_VALUE_HERE
Jealie

23

您可以执行此操作而不必查询实际的点数,因此可以在脚本执行过程中节省一些时间和资源。

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

否则,您做错的是您将旧的点数作为字符串(points='5'+1)传递了,并且无法在字符串中添加数字。;)


10

希望我不会在我的第一篇文章中脱口而出,但由于某些受访者似乎认为错误,我想在整数到字符串的转换方面做些扩展。

由于此查询中的表达式使用算术运算符(加号+),因此MySQL会将表达式中的所有字符串转换为数字。

为了演示,将产生以下结果6:

SELECT ' 05.05 '+'.95';

MySQL中的字符串连接需要CONCAT()函数,因此这里没有歧义,MySQL将字符串转换为浮点数并将它们加在一起。

我实际上认为初始查询不起作用的原因很可能是因为$ points变量实际上并未设置为用户的当前点。它要么设置为零,要么未设置:MySQL将空字符串转换为零。为了说明,以下将返回0:

SELECT ABS('');

就像我说的那样,我希望我不会太过关注话题。我同意Daan和Tomas为这个特定问题提供最佳解决方案。


+1 compton非常好,无论您是否使用引号,您都可以正确使用演员表。欢迎来到SO!
Pekka 2010年

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

1
如果我使用变量而不是value = 1怎么办?我应该以“点数=点数+ $变量”的方式进行操作吗?或“ points = points +'$ variable'”
Ivo San

7

另外,要“递增”字符串,请在更新时使用 CONCAT

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

3

谁需要更新字符串和数字 SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);


2

您应该使用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');
}

无需查询DB即可获得点数。您可以直接在更新查询中进行递增(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
));

1

删除'周围的point

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

您正在将一个整数值“强制转换”为原始查询中的字符串...


-2

您为什么不让PHP来完成这项工作?

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

7
很好,但是在并发环境中要小心,因为与此同时DB值可能已更改。
Vincent Nikkelen 2013年

1
谢谢@VincentNikkelen,您的想法真不错。并发!
吉米·伊伦洛亚

1
如果使用此方法,则应首先选择数据,这意味着对该行有附加访问权限。如果您只需要更新值,这不是可行的方法。
安德列斯SK
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.