2010-11-18 8 views
0

Ich habe gerade etwas Code für eine grundlegende Gliederung einer Seite geschrieben. Für ein Spiel, das ich ausführe, aber wenn ich mir den Code anschaue, habe ich das Gefühl, dass ich ihn in der falschen Reihenfolge geschrieben habe und dass ich mehr Abfragen ausführe als nötig.Logische Reihenfolge der PHP-Abfragen

 

    $query = mysql_query("SELECT * FROM bodyguards WHERE username='$u'"); 

    if($bg = mysql_fetch_assoc($query)) { // if you have a bg 
     if($bg[status] == "active") { 
      echo "your bodyguard is $bg[bodyguard], kick him?"; 
     } else { 
      echo "invite a bg?"; 
     } 
    } else { 
     $query = mysql_query("SELECT * FROM bodyguards WHERE bodyguard='$u' AND status='active'"); 

     if($bg = mysql_fetch_assoc($query)) { // if you are a bg 
      echo "you are the bodyguard of $bg[username]"; 
     } else { 
      //otherwise check if anyone has invited you 

      $query = mysql_query("SELECT * FROM bodyguards WHERE bodyguard='$u' AND status='invited'"); 

      while($temp = mysql_fetch_assoc($query)) { 
       echo "$temp[username] has invited you to be their bodyguard, accept or decline?"; 
      } 
     } 
    } 

Ich verwende nur eine Datenbanktabelle. Wenn ein player1 einen bestätigten Bodyguard (player2) hätte, würde die Zeile wie folgt aussehen:

username => player1, bodyguard => player2, status => aktiv.

hätte jemand hier den Code auf eine andere Weise geschrieben?

Antwort

3

ich es in einer einzigen Abfrage getan hätte:

$query = mysql_query("SELECT * FROM bodyguards WHERE username='$u' OR (bodyguard='$u' AND (status='active' OR status='invited')"); 

$bg = mysql_fetch_assoc($query); 

if ($bg) { // check for empty result first, to prevent E_NOTICE 
    if ($bg['username'] == $u) { 
     if($bg['status'] == "active") { 
      echo "your bodyguard is {$bg['bodyguard']}, kick him?"; 
     } else { 
      echo "invite a bg?"; 
     } 
    } else if ($bg['bodyguard'] == $u) { 
     if ($bg['status'] == "active") { 
      echo "you are the bodyguard of {$bg['username']}"; 
     } else if ($bg['status'] == "invited") { 
      echo "{$bg['username']} has invited you to be their bodyguard, accept or decline?"; 
     } 
    } 
} 

Hinweis: Stellen Sie sicher, dass Sie $u, wenn die Daten sind auf der Flucht von einem Benutzer geliefert wird, mysql_real_escape_string verwenden. Stellen Sie außerdem sicher, dass Sie Ihre Array-Indizes angeben, um PHP-Hinweise zu vermeiden (z. B. $bg['username'] anstelle von $bg[username]).

+0

ich noch die Schleife müssen, wenn der Spieler mehr vorzuweisen hat als eine einladen. – Juddling

+0

$ u ist der Nutzername des Players, der die Seite aufruft, leider habe ich vergessen zu erwähnen. und ja, ich bin kürzlich umgezogen Server und die neue PHP-Conf begann zeigen viele Hinweise, wie ich in der Angewohnheit, nie meine Array-Schlüssel zitieren:/ – Juddling

+0

@Juddeln: Sorry, ich sah nicht die letzte Schleife dort. Sie können es jedoch trotzdem in einer einzigen Abfrage erstellen, da das gesamte Ergebnis bereits in $ query geladen ist. Sie müssen nur "mysql_fetch_assoc" machen, um die nächste Zeile zu holen, und so weiter. – netcoder

0

Immer wenn ich eine Beziehung zwischen zwei Entitäten in einer Tabelle habe, mache ich normalerweise eine andere Tabelle, um die Beziehung zu halten.

Mein BodyGuardRelations Tabelle aussehen könnte

[id] [userId] [bodyGuardUserId] [status] 
1 27  55    Active 
2 43  89    Invited