0

在此处输入图像描述 在此处输入图像描述

我有一个问题,我已经坚持了几个小时了。我玩过多种类型的 for() 和 while() 循环。我将它们放在具有不同变量的不同位置并运行不同的东西,没有任何效果..

我的问题:

为什么我的程序为第一个以下的所有用户提供相同级别?您可以在图片中清楚地看到 Nicolas 拥有更多的 XP。(5,000 xp 是 20 级,如果“Nic5”是数据库中的第一个,那么它会将“技能级别”更改为 20。

我知道返回的变量$lvl对于每个加载的玩家都没有改变,这就是为什么每个玩家都获得第一个玩家的级别。

有人可以帮我吗?

注释: 0= 包含玩家技能水平经验的列。

类计算级别

class calculatelevel {

function level($skillnum)
{

$host = "*";
$user = "*";
$pass = "*";
$db = "*";

$con = new mysqli($host, $user, $pass, $db) or die($con->error);
$res = $con->query("SELECT `0` FROM hiscores");

$max = 99;

while($row = $res->fetch_assoc()) {
    $xp = $row['0'];

    // Find the appropriate level
    for ($lvl = 1; $lvl < $max; $lvl++) //this for loop runs 99 times
    {
        if ($xp < $this->experience($lvl))//if players xp in skill is less than experience(level 1-99)
        {
            // Level found
            $lvl -= 1;
            break;
        }
    }
}
        return $lvl;
}

public function experience($lvl)
{
    $xp = 0;
    for($x = 1; $x < $lvl; $x++)
    {
        $xp += floor($x + 300 * pow(2, ($x / 7)));
    }
    return floor($xp / 4);
}
}

将数据库信息写入页面的方法。

if($res->num_rows > 0) {
  echo "<table>
     <tr>
        <td>Rank</td>
        <td>Username</td>
        <td>Skill Level</td>
        <td>Total Exp</td>         </tr>";

while($row = $res->fetch_assoc()) {
  echo 'ran';
    $calc = new calculatelevel(); 
    $level = $calc->level(0);

     echo '<tr>
        <td>'.($count+1).'</td>
        <td>'. htmlspecialchars($row['username']) .'</td>
        <td>'.number_format($level).'</td>
        <td>'.number_format($row['0']).'</td>
        </tr>';
     $count++;
}
}
4

1 回答 1

0

您的 while 循环和 for 循环结构不正确。您只查看第一行并每次返回该行的级别。break当您找到该行玩家的级别时,您将执行 for 循环,然后立即返回该级别。结果:看起来每个人都有相同的水平。

编辑:好的,这里还有一些想法。

首先,正如 Mike W 所指出的,一个名为0“自找麻烦”的专栏。你说0的是一张桌子,但如果是这样的话,你的SELECT说法没有意义。我会尝试的第一件事是将列名更改为不是数字的名称,例如xp.

其次,如果可能的话,你真的应该只建立一个数据库连接并在整个请求中使用它。每次运行特定功能时打开一个新连接将很快占用服务器。

第三,您当前代码中的明显问题是:

功能级别($skillnum){

    // other code here....

    // Okay, you load a row's data into $row, with the idea that you will repeat this.
    while($row = $res->fetch_assoc()) {
        // $xp is set to the experience points for the user you just loaded
        $xp = $row['0'];

        // You now look at each level, starting at 1, to see if the 
        // user's xp is greater than the cutoff for that level
        for ($lvl = 1; $lvl < $max; $lvl++) //this for loop runs 99 times
        {
            // If the user's xp is less than the cutoff...
            if ($xp < $this->experience($lvl))//if players xp in skill is less than experience(level 1-99)
            {
                // ... then you go back down one level...
                // Level found
                $lvl -= 1;
                // ... and quit the for loop!
                break;
            }
        }
        // okay, you're out of the for loop, so you go back to the while loop...
        // a new row is loaded...
        // and $xp and $lvl are both overwritten with that user's values
    }

    // So, the while loop has run once for each player...
    // ... but you are only returning one player's level!
    return $lvl;
}

此外,您已定义calculatelevel::level为需要一个参数$skillnum,但您从未在此处发布的代码中使用它。

我怀疑您的真实代码中存在另一个故障,导致它返回第一个玩家的关卡,而不是最后一个玩家的关卡。0列名可能有问题;这真的应该改变。

于 2013-10-29T03:01:03.687 回答