PHP For()循环问题

时间:2013-10-29 02:52:51

标签: php loops for-loop

enter image description here enter image description here

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

我的问题:

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

我知道返回的变量$lvl对于每个加载的玩家都没有变化,这就是每个玩家获得第一个玩家等级的原因。

有人可以帮帮我吗?

备注: 0 =一个包含玩家技能等级经验的专栏。

class calculatelevel

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++;
}
}

1 个答案:

答案 0 :(得分: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列名称的问题; 真的应该改变。