-2

出于某种原因,当用户注册时,他们不是从 0 Wood、0 Stone、0 Gold 开始,而是以时间戳作为他们的 Wood、Stone 和 Gold(数字,如 1375674873)开始。我的错误在哪里?

$timeNow = time();
$timeExpire = $timeNow - 2;
$User = $con->query("SELECT * FROM players WHERE Username='".$_SESSION['Username']."'");
$UserInfo = $User->fetch_object();

$con->query("UPDATE players SET Time='$timeNow' WHERE Username='". $_SESSION['Username']."'");
$con->query("UPDATE players SET TimeExpire='$timeExpire' WHERE Username='". $_SESSION['Username']."'");

if(time() >= $UserInfo->TimeExpire) {

    $getAmount = time() - $UserInfo->TimeExpire;
    echo $getAmount;
    $con->query("UPDATE players SET Wood=Wood+$getAmount WHERE Username='". $_SESSION['Username']."'");
    $con->query("UPDATE players SET Stone=Stone+$getAmount WHERE Username='". $_SESSION['Username']."'");
    $con->query("UPDATE players SET Gold=Gold+$getAmount WHERE Username='". $_SESSION['Username']."'");

}

使用$getAmount我正在计算有多少到期。因此,即使用户已注销,当他们在 2 小时后重新登录时,他们仍然可以获得那段时间的钱。

4

1 回答 1

0

如果你去一个 javascript 控制台并运行new Date(1375674873)它会给你这个(如果你在 EST 中):

Fri Jan 16 1970 17:07:54 GMT-0500 (Eastern Standard Time)

这告诉我的是,当您在数据库中创建一个新用户时,他们对该TimeExpire列的值并不是您认为的那样。检查该列的默认值是什么,并确保在您的代码中,当您将用户添加到数据库时,您手动将其TimeExpire列设置为,time()而不是依赖于自动设置。如果数据库时间与服务器时间不完全匹配,那么即使使用类似的东西now()也不会产生正确的数字。

此外,作为旁注,您可以将几个查询组合如下:

$con->query("UPDATE players SET Time='$timeNow', TimeExpire='$timeExpire' WHERE Username='". $_SESSION['Username']."'");
[...]
$con->query("UPDATE players SET Wood=Wood+$getAmount, Stone=Stone+$getAmount, Gold=Gold+$getAmount WHERE Username='". $_SESSION['Username']."'");

这是一件小事,但一般来说,更少的查询意味着更快的网站。

于 2013-09-11T15:54:26.073 回答