如何编辑我现有的 php 函数并添加另一个检查



我想为高级帐户添加另一个选项。目前,您可以每 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

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

查询中使用PREMIUM表的LEFT JOIN来检查传输时间。然后使用该表中的匹配项来条件化您与之比较的时间。

$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);

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

从高级版中选择 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 天。

最新更新