2009-05-16 12 views
2

J'essaie d'écrire un morceau de code qui vérifie les statistiques des utilisateurs, que ce soit leurs points, leur rang ou num_friends et à leur tour leur attribue un badge similaire à celui utilisé dans SO. Le système est défini de sorte qu'une tâche (vote, commentaire, etc.) soit complétée par un utilisateur, son id_utilisateur est enregistré et mis en file d'attente pour être évalué à intervalles de 5 minutes par un travail cron. Est-ce la façon la plus efficace de le faire? J'ai vu l'autre poste sur les badges, mais je ne suis pas sûr si c'est la méthode qui a été choisie comme méthode préférée.Système de badges et conditions de stockage en tant que variables?

Une autre question que j'ai est de vérifier réellement ces variables (points, rang, num_friends) contre l'utilisateur. J'ai un certain nombre de badges et je veux permettre aux administrateurs d'ajouter le leur, où ils choisissent une variable, l'opérateur (==,> =, etc.) et la valeur à laquelle il est défini. Comment puis-je évaluer cela dans une déclaration conditionnelle IF? 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 !

Répondre

3

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

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

Il pourrait être plus sûr et plus facile à étendre si vous passez un tableau à checkbadges() place:

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 est quelque chose comme ceci:

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

Vous pouvez alors étendre la mise à disposition variables sans modifier la fonction

+0

Merci, c'était la première fois que je rencontrais des variables variables - il Lps beaucoup! – mdolon

0

Quelle est la valeur attendue et la valeur observée de la variable pour laquelle vous n'obtenez pas la bonne valeur?

De plus, sa meilleure pratique à utiliser:

$arr['key'] 

au lieu de

$arr[key] 

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

Questions connexes