繁体   English   中英

MySQL更新查询中的增量值

[英]Increment value in MySQL update query

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

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

$points变量是用户现在的积分。 我希望它添加一个。 例如,如果他有 5 分,应该是 5+1 = 6,但事实并非如此,它只是变为 1。

我做错了什么?

只需增加数据库中已经存在的值

$sql = "UPDATE member_profile SET points = points + 1 WHERE user_id = ?";
$db->prepare($sql)->execute([$userid]);

此代码适用于现代 PHP 版本中的 PDO 和 mysqli

您可以执行此操作而无需查询实际的点数,因此它会在脚本执行期间为您节省一些时间和资源。

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

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

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

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

SELECT ' 05.05 '+'.95';

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

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

SELECT ABS('');

就像我说的,我希望我不会太离题。 我同意 Daan 和 Tomas 对这个特定问题有最好的解决方案。

此外,要“增加”字符串,更新时,使用CONCAT

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

谁需要更新字符串和数字

SET @a = 0;
UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);

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

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

有关IFNULL的更多信息

您应该使用 PDO 来防止 SQL 注入风险。

您可以像这样连接到数据库:

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=xxxx;dbname=xxxx;charset=utf8mb4', 'user', 'password', $pdo_options);

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

删除point周围的'

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM