Question

Je suis en train d'écrire un morceau de code qui vérifie une statistiques des utilisateurs, être que leurs points, le rang ou num_friends et prix de les transformer un badge semblable à celui utilisé dans SO. Le système est réglé de manière lorsqu'une tâche (vote up, commentaires, etc.) est complétée par un utilisateur, leur user_id est enregistré et mis en attente pour être évalués à 5 minutes d'intervalle par une tâche cron. Est-ce la façon la plus efficace de le faire? J'ai vu l'autre poste au sujet des badges mais ne sais pas si cela est la méthode qui a été choisie comme méthode préférée.

Une autre question porte sur la vérification de fait ces variables (points, rang, num_friends) contre l'utilisateur. J'ai un certain nombre de badges et que vous souhaitez pour permettre aux administrateurs d'ajouter leur propre où ils choisissent une variable, l'opérateur (==,> =, etc.) et la valeur qu'elle est définie sur. Comment puis-je évaluer que, dans une instruction conditionnelle SI? J'ai essayé l'aide du commutateur pour les opérateurs, mais ne peuvent pas obtenir les variables à évaluer correctement, comme:

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;
        }
    }
}

Je pense que je dois utiliser eval () mais je ne sais pas comment, toute aide serait appréciée!

Était-ce utile?

La solution

Si une chaîne est $bq['badge_var'] qui est un nom de variable valide dans la portée actuelle, vous pouvez simplement le faire:

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

Il est peut-être plus sûr et plus facile à étendre si vous passez un tableau à la place 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']);
        }
    }
}

où est quelque chose comme $userdata ceci:

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

Vous pouvez ensuite étendre les variables disponibles sans modifier la fonction

Autres conseils

Quelle est la valeur attendue et la valeur observée de la variable que vous ne recevez pas la bonne valeur pour?

En outre, la meilleure pratique à utiliser:

$arr['key']

au lieu de

$arr[key]

PHP évaluer d'abord comme une constante qui est une mauvaise pratique, voir

scroll top