我的网站有这个脚本,我认为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)
答案 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
);