2010-11-18 9 views
0

Je viens d'écrire du code pour un contour de base d'une page. C'est pour un jeu que je cours, mais en regardant le code, je pense que je l'ai écrit dans le mauvais ordre, et que j'exécute plus de requêtes que j'en ai besoin.Ordre logique des requêtes PHP

 

    $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?"; 
      } 
     } 
    } 

Je n'utilise qu'une seule table de base de données. si un joueur1 avait un garde du corps confirmé (player2), la ligne ressemblerait à:

nom d'utilisateur => player1, bodyguard => player2, statut => actif.

Quelqu'un aurait-il écrit le code d'une manière différente?

Répondre

3

je l'aurais fait en une seule requête:

$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?"; 
     } 
    } 
} 

REMARQUE: Assurez-vous que vous échappez $u si les données sont fournies par un utilisateur, en utilisant mysql_real_escape_string. En outre, assurez-vous de citer vos index de tableau pour éviter les avis PHP (à savoir: utilisez $bg['username'] au lieu de $bg[username]).

+0

Je dois encore la boucle pour montrer si le joueur a plus d'une invitation. – Juddling

+0

$ u est le nom d'utilisateur du joueur qui regarde la page, désolé j'ai oublié de mentionner. et ouais j'ai récemment déplacé des serveurs et la nouvelle conf PHP a commencé à montrer des tas d'avis car j'ai l'habitude de ne jamais citer mes clés de tableau:/ – Juddling

+0

@Juddling: Désolé je n'ai pas vu cette dernière boucle là. Cependant, vous pouvez toujours le faire dans une seule requête, puisque le résultat entier est déjà chargé dans $ query. Vous devez juste continuer à faire mysql_fetch_assoc pour récupérer la ligne suivante et ainsi de suite. – netcoder

0

Chaque fois que j'ai une relation entre deux entités dans une table, je crée généralement une autre table pour contenir la relation.

Mes BodyGuardRelations table peut ressembler à

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