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

标签 php mysql variables conditional-statements badge

我正在尝试编写一段代码来检查用户的统计数据,无论是他们的积分、排名还是好友数量,然后授予他们类似于 SO 中使用的徽章。系统设置为当用户完成任务(投票、评论等)时,他们的 user_id 会被记录并排队等待 cron 作业每隔 5 分钟进行评估。这是最有效的方法吗?我看到了另一篇关于徽章的帖子,但不确定这是否是被选为首选方法的方法。

我的另一个问题是关于针对用户实际检查这些变量(分数、排名、 friend 数量)。我有许多徽章,希望允许管理员在选择变量、运算符(==、>= 等)及其设置值的位置添加自己的徽章。如何在 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() 但我不知道如何使用,任何帮助将不胜感激!

最佳答案

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

然后您可以扩展可用变量而不修改函数

关于php - 徽章系统和存储条件作为变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/873316/

相关文章:

javascript - javascript编译器读取一行代码的方式

php - 使用 PHP 将 MySQL 查询输出为 SQLite

php - 图片上传到 SSL 文件夹,状态代码 200,标题 {connection = closed}

php - 为什么 MySQL 连接因许多连接错误而被阻止?

mysql - 配置 MySQL 检查以忽略表名的大小写

php - get 方法不适用于 php rest web 服务

mysql - Laravel API 的 mysql 查询未在 performance_schema.events_statements_summary_by_digest 中被跟踪

php - Md5 唯一 id 足以用于隐藏表单 token 吗?

ruby-on-rails - 是否可以使用 Ruby on Rails 3 将变量传递给操作?

ios - 未使用的变量 OSX