mysql更新查询中的增量值

Kar*_*rem 125 php mysql sql sql-update

我已经制作了这个代码用于给出+1分,但它不能正常工作.

mysql_query("
    UPDATE member_profile 
    SET points= ' ".$points." ' + 1 
    WHERE user_id = '".$userid."'
");
Run Code Online (Sandbox Code Playgroud)

$ points变量现在是用户的点数.我希望它加一个...所以如果他有5分,那么应该是5 + 1 = 6 .. 但它不是,它只是改变到1

我做错了什么?谢谢

Tom*_*kas 292

你也可以这样做:

mysql_query("
    UPDATE member_profile 
    SET points = points + 1
    WHERE user_id = '".$userid."'
");
Run Code Online (Sandbox Code Playgroud)

  • @Steve你的评论听起来对于知道什么是PDO的人来说听起来很聪明,但对于那些刚刚进入PHP/MySQL的人来说,它并没有真正为这个问题带来很多启发.PDO是否使代码更小或更优雅?如果是这样,请编辑答案或发布您自己的答案,以便展示如何使用PDO更好.谢谢. (59认同)
  • @CamiloMartin mysql_query的[php.net手册](http://php.net/manual/en/function.mysql-query.php)页面有以下注释:从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)指南和[相关常见问题](http://www.php.net/manual /en/faq.databases.php#faq.databases.mysql.deprecated)了解更多信息. (11认同)
  • 将演示中的用户数据连接到SQL查询中是一个主要的SQL注入风险. (8认同)
  • @CamiloMartin我也很好奇.我发现这有用http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-should-you-use/ (5认同)
  • 您可以使用库或在用户 ID 周围使用 mysql_real_escape_string() 来避免注入攻击或编码错误 (2认同)

Daa*_*aan 21

您可以在不必查询实际点数的情况下执行此操作,因此在脚本执行期间可以节省一些时间和资源.

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

另外,你做错了的是你将旧点数作为字符串(points='5'+1)传递,并且你不能在字符串中添加数字.;)


小智 10

希望我在第一篇文章中不会偏离主题,但我想扩展一下整数转换为字符串,因为有些受访者似乎错了.

因为此查询中的表达式使用算术运算符(加号+),MySQL会将表达式中的任何字符串转换为数字.

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

SELECT ' 05.05 '+'.95';
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT ABS('');
Run Code Online (Sandbox Code Playgroud)

就像我说的那样,我希望我不会过于偏离主题.我同意Daan和Tomas对这个特殊问题有最好的解决方案.


Mar*_*ers 7

"UPDATE member_profile SET points = points + 1 WHERE user_id = '".$userid."'"
Run Code Online (Sandbox Code Playgroud)


小智 7

另外,要"增加"字符串,请在更新时使用 CONCAT

update dbo.test set foo=CONCAT(foo, 'bar') where 1=1
Run Code Online (Sandbox Code Playgroud)


Waq*_*ary 6

接受的答案很好,但不能使用空值尝试这个

mysql_query("
    UPDATE member_profile 
    SET points = IFNULL(points, 0) + 1
    WHERE user_id = '".$userid."'
");
Run Code Online (Sandbox Code Playgroud)

更多信息:IFNULL


Rod*_*uza 5

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