MySQL 更新查询中的增量值

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

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

$points变量现在是用户的点。我想再加一个。举个例子,如果他有5个点,它应该是5 + 1 = 6,但是它没有,它只是变成了1。

我做错了什么?

331505 次浏览
"UPDATE member_profile SET points = points + 1 WHERE user_id = '".intval($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."'"

您可以这样做,而不必查询实际的点数量,因此它将节省您在脚本执行期间的一些时间和资源。

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

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

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

在现代 PHP 版本中,这段代码可以同时适用于 PDO 和 mysqli

希望我的第一篇文章不会跑题,但是我想稍微扩展一下整型到字符串的转换,因为一些回复者似乎有错误的地方。

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

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

SELECT ' 05.05 '+'.95';

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

实际上,我认为初始查询无法工作的原因很可能是因为 $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);

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

接受的答案是好的,但不与空值工作尝试这一点

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

更多关于 IFNULL的信息