我正在尝试通过检查用户的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'";
答案 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的解决方案可能更好。