根据多个条件更新字段

时间:2017-11-29 14:03:00

标签: php mysql sql

我正在尝试通过检查用户的xp值是否大于其级别的max xp来使我的体验栏正确更新值。我通过此代码增加了值

$sql1 = "UPDATE progression SET xp=(xp + 2) WHERE username='$username'";

然后我想检查数据库中xp的值是否高于max xp,如果是xp - max xp。这应该是这样的,如果一个玩家处于98%xp并获得10%xp,它应该在下一级别更新为8%(如果下一级别的max xp没有增加)。我想要这样的东西,但这似乎不起作用。

$sql2 = "UPDATE if xp > maxxp SET xp=(xp - maxxp) WHERE username='$username'"; 

4 个答案:

答案 0 :(得分:3)

您的查询语法错误,因为您不需要额外的if:

C1=Circle(xy=(3, 4), radius=2, fill=False, color='g')
C3=Circle(xy=(7, 2), radius=4, fill=False, color='b')
plot_circle([C1,C3])

应该是

$sql2 = "UPDATE if xp > maxxp SET xp=(xp - maxxp) WHERE username='$username'";

但我同意大卫的意见,你应该只是更新经验值的数量并立即进行水平计算。

另请注意,在此查询中,您缺少要更新的表的名称。我假设你还在更新进展。

此外,尝试查看预备语句:这将阻止SQL注入。

答案 1 :(得分:2)

您不需要2个查询,您可以使用modulus直接计算:

$sql1 = "UPDATE progression SET xp = (xp + 2) % maxxp WHERE username = :username";

另请注意,您不应在查询中注入变量,而应使用预准备语句。

答案 2 :(得分:0)

SQL使用CASE语句,类似于其他语言使用IF语句的方式。所以我相信你正在寻找类似的东西;

CASE WHEN (xp > maxxp) THEN SET xp=(xp - maxxp) WHERE username='$username'

有关SQL中CASE语句的更多信息,请查看此link。但正如其他人所说;您可以轻松地在where语句中添加另一个条件来解决此问题。

和;您永远不应该将变量直接传递给SQL语句,因为这是一个安全问题。相反,您应该将参数绑定到查询。

答案 3 :(得分:0)

如果你想使用IF,你可以尝试这样的事情。

UPDATE  progression 
SET     xp = IF(xp > maxxp, xp - maxxp, xp)
WHERE   username='$username'

但也许,使用WHERE的解决方案可能更好。