徽章系统和存储条件作为变量?

时间:2009-05-16 21:09:56

标签: php mysql variables conditional-statements badge

我正在尝试编写一段代码来检查用户统计信息,无论是他们的积分,等级还是num_friends,然后奖励他们一个类似于SO中使用的徽章。系统被设置为当用户完成任务(投票,评论等)时,他们的user_id被记录并排队以由cron作业以5分钟的间隔进行评估。这是最有效的方法吗?我看到了关于徽章的其他帖子,但我不确定这是否是被选为首选方法的方法。

我的另一个问题是实际检查用户的这些变量(points,rank,num_friends)。我有许多徽章,并希望允许管理员添加他们自己选择变量的位置,运算符(==,> =等)及其设置的值。如何在IF条件语句中对此进行评估?我尝试使用SWITCH作为运算符,但无法正确计算变量,例如:

function checkbadges($userid,$points,$rank,$friends){
    global $database;

    $q = $database->db_query("SELECT * FROM badges");
    while($bq = $database->db_fetch_assoc($q)) {
        switch($bq[badge_sign]) {
          case "1":
              if($bq[badge_var] == $bq[badge_value])
                  givebadge($userid, $bq[badge_id]);
            break;
          case "2":
              if($bq[badge_var] >= $bq[badge_value]))
                  givebadge($userid, $bq[badge_id]);
            break;
          case "3":
              if($bq[badge_var] <= $bq[badge_value]))
                  givebadge($userid, $bq[badge_id]);
            break;
          case "4":
              if($bq[badge_var] != $bq[badge_value]))
                  givebadge($userid, $bq[badge_id]);
            break;
        }
    }
}

我想我必须使用eval(),但我不确定如何,任何帮助都会受到赞赏!

2 个答案:

答案 0 :(得分:3)

如果$bq['badge_var']是一个字符串,它是当前作用域中的有效变量名,您可以这样做:

$value = ${ $bq['badge_var'] };

如果将数组传递给checkbadges(),则扩展可能更安全,更容易:

function checkbadges($userid,$userdata){
    global $database;
    $q = $database->db_query("SELECT * FROM badges");
    while($bq = $database->db_fetch_assoc($q)) {
        $currentValue = $userdata[ $db['badge_var'] ];
        $requiredValue = $db['badge_value'];
        $issueBadge = false;
        switch($bq['badge_sign']) {
          case "1":
              $issueBadge = ( $currentValue == $requiredValue );  
          break;
          case "2":
              $issueBadge = ( $currentValue >= $requiredValue );  
            break;
          case "3":
              $issueBadge = ( $currentValue <= $requiredValue );  
            break;
          case "4":
              $issueBadge = ( $currentValue != $requiredValue );  
          break;
        }

        if ($issueBadge) {
            givebadge($userid, $bq['badge_id']);
        }
    }
}

其中$userdata是这样的:

array( 'points' => 1 , 'friends' => 10, 'rank' => 10 );

然后,您可以在不修改函数的情况下扩展可用变量

答案 1 :(得分:0)

您未获得正确值的变量的预期值和观察值是什么?

此外,更好的做法是使用:

$arr['key']

而不是

$arr[key]

因为PHP会首先将它作为常量进行评估,这是一种不好的做法,请参阅PHP Reference: Arrays