2009-05-16 8 views
2

Ich versuche, ein Stück Code zu schreiben, der die Werte eines Benutzers überprüft, sei es ihre Punkte, Rang oder num_friends, und ihnen wiederum ein Abzeichen zuweist, das dem in SO verwendeten ähnlich ist. Das System wird so eingestellt, dass eine Aufgabe (Abstimmung, Kommentar, usw.) von einem Benutzer abgeschlossen wird, ihre Benutzer-ID wird aufgezeichnet und in die Warteschlange gestellt, um in Intervallen von 5 Minuten durch einen Cron-Job ausgewertet zu werden. Ist das der effizienteste Weg, dies zu tun? Ich habe den anderen Beitrag über Badges gesehen, bin mir aber nicht sicher, ob dies die bevorzugte Methode ist.Badge System und speichern Bedingungen als Variablen?

Eine andere Frage, die ich habe, ist über diese Variablen (Punkte, Rang, num_friends) gegen den Benutzer tatsächlich zu überprüfen. Ich habe eine Reihe von Badges und möchte Admins erlauben, ihre eigenen hinzuzufügen, wo sie eine Variable, den Operator (==,> =, usw.) und den Wert wählen, auf den sie eingestellt ist. Wie bewerte ich das in einer IF-bedingten Anweisung? Ich habe versucht, für die Betreiber mit SWITCH kann aber nicht die Variablen korrekt ausgewertet werden erhalten, wie:

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

Ich glaube, ich habe eval() verwenden, aber ich bin nicht sicher, wie wäre jede Hilfe geschätzt !

Antwort

3

Wenn sehen ist ein String, der im aktuellen Bereich ein gültiger Variablenname ist, können Sie einfach folgendes tun:

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

Es könnte sicherer und einfacher zu verlängern, wenn Sie ein Array checkbadges() stattdessen passieren:

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']); 
     } 
    } 
} 

wo $userdata so etwas wie dieses:

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

Anschließend können Sie erweitern die verfügbare Variablen, ohne die Funktion zu ändern

+0

Danke, das war mein erstes Mal auf Variablen treffen - das ist er lps viel! – mdolon

0

Welcher ist der erwartete Wert und der beobachtete Wert der Variablen, für die Sie nicht den richtigen Wert erhalten?

Zusätzlich seine bessere Praxis zu nutzen:

$arr['key'] 

statt

$arr[key] 

als PHP wird es zunächst als konstant bewerten, die schlechte Praxis, $bq['badge_var']PHP Reference: Arrays

Verwandte Themen