Php 基于多个条件更新字段
我试图通过检查用户的xp值是否大于其级别的最大xp,使我的体验栏正确更新该值。我正在通过此代码增加值Php 基于多个条件更新字段,php,mysql,sql,Php,Mysql,Sql,我试图通过检查用户的xp值是否大于其级别的最大xp,使我的体验栏正确更新该值。我正在通过此代码增加值 $sql1 = "UPDATE progression SET xp=(xp + 2) WHERE username='$username'"; 然后我想在数据库中检查现在xp的值是否高于max xp,以及它是否为take xp-max xp。这应该是这样的,如果一个玩家在etc 98%经验,并获得10%经验,它应该更新到8%的下一个级别(如果没有增加最大xp的下一个级别)。我想要这样的东西,
$sql1 = "UPDATE progression SET xp=(xp + 2) WHERE username='$username'";
然后我想在数据库中检查现在xp的值是否高于max xp,以及它是否为take xp-max xp。这应该是这样的,如果一个玩家在etc 98%经验,并获得10%经验,它应该更新到8%的下一个级别(如果没有增加最大xp的下一个级别)。我想要这样的东西,但这似乎不起作用
$sql2 = "UPDATE if xp > maxxp SET xp=(xp - maxxp) WHERE username='$username'";
您的查询语法错误,因为您不需要额外的if:
$sql2 = "UPDATE if xp > maxxp SET xp=(xp - maxxp) WHERE username='$username'";
应该是
$sql2 = "UPDATE progression SET xp=(xp - maxxp) WHERE username='$username' AND xp > maxxp";
但是我同意David的观点,你应该更新经验点的数量,并在飞行中进行等级计算
还请注意,在此查询中,您缺少要更新的表的名称。我想你还在更新进度
此外,尝试查看准备好的语句:这将阻止SQL注入。SQL使用
CASE
语句,类似于其他语言使用IF
语句的方式。所以我相信你是在寻找类似的东西
CASE WHEN (xp > maxxp) THEN SET xp=(xp - maxxp) WHERE username='$username'
有关SQL中CASE语句的更多信息,请查看此文档。但正如其他人提到的那样;您可以轻松地在where语句中添加另一个条件来解决此问题
及;永远不要将变量直接传递到SQL语句中,因为这是一个安全问题。相反,您应该将参数绑定到查询。此操作不需要两个查询,您可以直接使用:
还要注意的是,您不应该在查询中插入变量,而应该使用一个预先准备好的语句。如果您想使用if,可以尝试类似的方法
UPDATE progression
SET xp = IF(xp > maxxp, xp - maxxp, xp)
WHERE username='$username'
但是也许,一个带有WHERE的解决方案会更好。如果在mysql中起作用,那就不是这样了。但是您可以在
WHERE
部分添加另一个条件。如果要比较,为什么要使用UPDATE?你需要运行一个SELECT,那么它在哪里呢?“如果一个玩家在etc 98%的经验,并且得到10%的经验,那么它应该在下一个级别更新到8%——我认为你从一开始就采取了错误的方法。大多数系统只会记录获得的经验点数。任何额外的经验都只会增加这个总数。当显示到下一个级别的级别或完成百分比时,这些都是动态执行的简单计算。不要存储计算结果。存储数据并在显示器上执行计算。@jeroen这种情况会是什么样子?@Fred ii-因为如果xp大于最大xp,我想更新值?也更改了标题。谢谢。谢谢。但不幸的是,这会产生其他问题,所以你介意解释一下你和大卫在飞行中计算的意思吗?假设你每100分就获得一个新的等级。您存储在DB325 point中,并使用php(或其他任何工具)计算您的级别为3+25点。在这种情况下,你使用(325/100)=3.25的模数,所以模数是3,剩下的是0.25,也就是*100=25点。如果您确实改变了每个级别的阈值(第一个100,第二个250),这一点更为重要。更清楚吗?是的,更清楚一点。但由于我对这一点很陌生,所以还有很多不清楚的地方。首先,该计算应在何处进行?我还通过将每个级别所需的最大xp增加*1.5来改变阈值。例如Atm,第一级需要10分,相当于经验条的100%。我刚才给了你一个简单的提示。但是您需要在前端(php或任何其他语言)完成这项工作,您的页面是在前端编写的,而不是在db上。当你陷入困境时,为什么不试着详细阐述一下,然后从一些新问题开始呢?
UPDATE progression
SET xp = IF(xp > maxxp, xp - maxxp, xp)
WHERE username='$username'