0

我想为高级帐户添加另一个选项。目前,您可以每 2 天更改一次角色,但我想添加另一项检查,以允许高级用户每 12 小时更改一次。它们是从另一个表中确定的,如果PREMIUM它们strAccountID不是溢价,则该表中将没有针对其帐户的行。

这是我当前的 PHP 函数,它适用于所有用户,并允许他们每 2 天执行一次。

private function doProcessClassChangeFormD()
{
    $db = $this->database[GDB];
    $character = $this->site->SanitizeName($_POST['character']);
    $num_rows = $db->doQuery('SELECT bNation FROM ACCOUNT_CHAR WHERE strAccountID = ? AND ? IN(strCharID1, strCharID2, strCharID3)', $_SESSION['strAccountID'], $character);
    if ($num_rows == -1)
    {
        $db->GetError(__file__, __line__);
        $this->m_ccError = Template::GetLangVar('DB_ERROR');
        return false;
    }
    else if ($num_rows == 0)
    {
        $this->m_ccError = Template::GetLangVar('CC_INVALID_ACCOUNT');
        return false;
    }

    $row = $db->doRead();
    $nation = $row['bNation'];

    $num_rows = $db->doQuery('SELECT Class, Race, Strong, Sta, Dex, Intel, Cha, Points, TransferTime FROM USERDATA WHERE strUserId = ? AND (TransferTime < DATEADD(DAY,-2,GETDATE()) OR TransferTime IS NULL) and zone<>199 and authority<>255', $character);
    if ($num_rows == -1)
    {
        $db->GetError(__file__, __line__);
        $this->m_ccError = Template::GetLangVar('DB_ERROR');
        return false;
    }
    else if ($num_rows == 0)
    {
        $this->m_ccError = Template::GetLangVar('CC_RECENT_TRANSFER');
        return false;
    }

    $row = $db->doRead();

    $oldRace = $row['Race'];
    $oldClass = $row['Class'];
    $newRace = intval($_POST['race']);
    $newClass = intval($_POST['class']);

    $pCT = new ClassTransfer($nation, $oldClass, $oldRace, $newClass, $newRace);
    if (!($res = $pCT->canChangeClass()))
    {   
        $this->m_ccError = $pCT->GetError(__file__, __line__);
        return false;
    }

    $newClass = $res[0];
    $newRace = $res[1];

    $free = $row['Points'] + $row['Strong'] + $row['Sta'] + $row['Dex'] + $row['Intel'] + $row['Cha'];
    $newStats = $pCT->getStarterStats($newClass, $newRace);

    for ($i = 0; $i < 5; $i++)
        $free -= $newStats[$i];

    if ($free > 255)
    {
        $_SESSION['bClassTransfer'] = true;
        $_SESSION['strUserId'] = $character;
        $_SESSION['bNewRace'] = $newRace;
        $_SESSION['bNewClass'] = $newClass;
        $_SESSION['bStrong'] = $newStats[KO_STR];
        $_SESSION['bStamina'] = $newStats[KO_STA];
        $_SESSION['bDexterity'] = $newStats[KO_DEX];
        $_SESSION['bIntelligence'] = $newStats[KO_INT];
        $_SESSION['bCharisma'] = $newStats[KO_CHA];
        $_SESSION['bAvailable'] = $free;

        $this->m_bSelectPoints = true;
        return false;
    }

    $newStats[5] = $free;
    return $this->doExecuteClassChangeD($character, $newClass, $newRace, $newStats);
}

http://pastebin.com/VK4Bi7FJ

我尝试了几种方法,但没有成功。我怎样才能做到这一点?

4

2 回答 2

1

将 aLEFT JOINPREMIUM查询中用于检查传输时间的表一起使用。然后使用该表中的匹配来限定您比较的时间。

$num_rows = $db->doQuery('
    SELECT Class, Race, Strong, Sta, Dex, Intel, Cha, Points, TransferTime
    FROM USERDATA u
    LEFT JOIN PREMIUM p ON p.strAccountID = u.strUserId
    WHERE strUserId = ?
      AND (TransferTime < IF(p.strAccountId IS NULL,
                             DATEADD(DAY,-2,GETDATE()),
                             DATE_SUB(NOW(), INTERVAL 12 HOUR)))
           OR TransferTime IS NULL)
      AND zone<>199 and authority<>255', $character);
于 2013-10-14T02:00:02.270 回答
0

最简单的方法是查询高级表:

从 PREMIUM 中选择 strAccountID,其中 strAccountID 等于当前登录用户(存储在某处的会话/cookie 中?)

从那里只做一个简单的 if 语句。如果上面的 select 语句返回一行并且时间已经大于 12 小时,那么是让他们改变字符。

在这里围绕这一点执行上述操作:

    $num_rows = $db->doQuery('SELECT Class, Race, Strong, Sta, Dex, Intel, Cha, Points,  TransferTime FROM USERDATA WHERE strUserId = ? AND (TransferTime < DATEADD(DAY,-2,GETDATE()) OR TransferTime IS NULL) and zone<>199 and authority<>255', $character);

那么您需要做的就是,如果此人是高级会员,请将上述声明更改为仅 12 小时而不是 2 天。如果它们不是溢价,则将其保留 2 天。

于 2013-10-14T01:57:55.727 回答