Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于多个条件更新字段_Php_Mysql_Sql - Fatal编程技术网

Php 基于多个条件更新字段

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的下一个级别)。我想要这样的东西,

我试图通过检查用户的xp值是否大于其级别的最大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'