获得Xp并升级PHP& MYSQL

时间:2018-04-17 15:21:49

标签: php

我的网站有这个脚本,我认为for行有问题。如果我用256更新我的user_xp_amount,脚本运行正常。但是,当我用更高的XP更新时,例如785,脚本显示我有1级而不是2级256xp。为什么这不符合我的意愿?

PHP脚本:

<?php
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
$user_id = 4;
function get_user_xp($user_id, $mysqli) {
   $sql = $mysqli->query("SELECT user_xp_amount FROM users_xp WHERE user_id='$user_id'");
   $row = $sql->fetch_assoc();
   return $row['user_xp_amount'];

}

$xp = array(0,256,785,1656,2654);

$my_xp = get_user_xp($user_id, $mysqli); // where 4 is my user id

for($i = 0; $i < count($xp); $i++) {
   if($my_xp == $xp[$i]) {
       echo 'I\'m on level ', ($i+1);
       break;
   }
   else {
       if(isset($xp[$i+1])) {
           if($my_xp > $xp[$i] && $my_xp <= $xp[$i + 1]) {
               echo 'My next level is ', ($i+2), ' and I need ', $xp[$i+1], ' more points for achieving it!';
               break;
            } else {
               echo 'My next level is ', ($i+1), ' and I need ', $xp[$i], ' more points for achieving it!';
               break;
            }
        }
    }
}
?>

MySQL DB:

user_xp_id Primar   bigint(20) | user_id bigint(20) | user_xp_amount    bigint(20)

1 个答案:

答案 0 :(得分:0)

可以通过一些基本的调试找到它无法工作的原因:逐步思考for循环。如果失败,请尝试类似

的内容
// snip

for($i = 0; $i < count($xp); $i++) {
    print $i; // show me which step I'm on
    if($my_xp == $xp[$i]) {

    // snip

试试吧,原因会突然出现在你面前。

这是调试的一个重要部分:小心你的假设。你的假设通常是你的错误。

只有在完成练习后 ,您才能进一步了解此答案。 (你甚至可能不想!)

提示您可以更轻松地进行编码:您可以继续重新分配值,直到退出循环。

$xp = array(0,256,785,1656,2654);

$my_xp = 254;

for($i = 0; $i < count($xp); $i++) {

    // if we've looped beyond our xp, exit with last assigned (current) values
    if($my_xp < $xp[$i]) { break; } 

    $my_level = $i;

    // if index + 1 is in range, assign values
    if($i+1<count($xp)) {
        $next_level = $i+1;
        $xp_needed = $xp[$i+1] - $my_xp;

    // if index + 1 is out of range, give default values
    } else {
        $next_level = $i;
        $xp_needed = 0;
    }

}

printf("<div>Current Level: %d (%d xp)</div>" . 
       "<div>Next Level: %d (%d xp)</div>" . 
       "<div>XP Needed: %d</div>",
       $my_level +1, // correct off-by-1 error of index
       $my_xp,

       $next_level +1, // correct off-by-1 error of index
       $xp[$next_level],

       $xp_needed 
);