2012-01-09 8 views
1

J'ai trois tables de MSSQL pour un jeu qui sont structurées comme suit:Rejoindre trois tables dans MSSQL

CHARS C'est la table de consultation, il a:

  • strAccount qui est liée à la clé primaire de NGSCUSER est le nom d'utilisateur de compte
  • strChar01 qui est la première tranche de caractère
  • strChar02 qui est la deuxième fente caractère
  • strChar03 qui est le troisième emplacement de personnage

ceux-ci ont la clé primaire de la table gameuser à l'intérieur ce sont des noms de caractère

NGSCUSER

  • nom d'utilisateur compte strUserID
  • strPasswd compte Mot de passe

GAMEUSER

  • strUserId c'est le nom du personnage
  • SRANK si le personnage est un maître de jeu

Ce que je dois être en mesure de faire est de comparer les données de connexion contre les variables PHP $ username et $ mot de passe dans la requête et surtout vérifier leur caractère associé et savoir s'il a un sRank de 1

Je suppose que j'ai besoin d'une jointure de trois tables de quelque sorte, mais je ne sais pas comment s'y prendre des exemples ou l'aide serait grandement appréciée

C'est la question que j'ai essayé de construire jusqu'à présent, mais il des erreurs sur la troisième ligne avec une syntaxe incorrecte près de « CHARS »:

SELECT NGSCUSER.strUserID, NGSCUSER.strPasswd, GAMEUSER.sRank 

FROM 'CHARS' 

INNER JOIN NGSCUSER ON NGSCUSER.strUserId = CHARS.strAccount 
INNER JOIN GAMEUSER ON GAMEUSER.strUserId = CHARS.strChar01 
INNER JOIN GAMEUSER ON GAMEUSER.strUserId = CHARS.strChar02 
INNER JOIN GAMEUSER ON GAMEUSER.strUserId = CHARS.strChar03 


WHERE NGSCUSER.strUserId='$username' and NGSCUSER.strPasswd='$password' and GAMEUSER.sRank = '1' 

Répondre

2

Tout d'abord, pour répondre à la lettre votre question (qui ne probablement pas résoudre votre problème), vous devez créer un alias de vos tables pour joindre plusieurs tables:

select * from [chars] c 
inner join ngscuser n on n.strUserId = c.strAccount 
inner join gameuser g1 on g1.strUserId = c.strChar01 
inner join gameuser g2 on g2.strUserId = c.strChar02 
inner join gameuser g3 on g3.strUserId = c.strChar03 
where n.strUserId='$username' and n.strPasswd='$password' and g1.sRank = '1' 

Cependant, si vous essayez de retirer la ligne gameuser qui correspond à tout emplacement de personnage, vous devez utiliser in:

select n.strUserID, n.strPasswd, g.sRank 
from [chars] c 
inner join ngscuser n on n.strUserId = c.strAccount 
inner join gameuser g on g.strUserId in (c.strChar01, c.strChar02, c.strChar03) 
where n.strUserId='$username' and n.strPasswd='$password' and g.sRank = '1' 

Et, maintenant que je votre attention, je voudrais faire les messages d'intérêt public suivantes:

  1. J'espère que vous désinfectante $username et $password de sorte que vous n'êtes pas sensible à l'injection SQL.
  2. Ne pas stocker les mots de passe en texte clair. Vous devriez seulement les stocker comme des hachages salés. Si vous pouvez faire un select * from ngscuser et obtenir le mot de passe de tout le monde, honte à vous. La honte. La honte. La honte.
+0

la base de données (s) ne sont pas à moi, malheureusement, je Je suis conscient des dangers des mots de passe en texte clair, la protection d'injection sql est ma prochaine tâche, je remarque que mssql n'a pas mysql_real_escape_string(); donc je vais avoir besoin de quelque chose pour remplacer cela – arcanine

+0

@arcanine - Utiliser des requêtes paramétrées. Plus ici: http://blogs.iis.net/sqlphp/archive/2008/09/30/how-and-why-to-use-parameterized-queries.aspx – Eric

0

Il doit être juste Chars pas « CHARS »

0

Voici une fonction exemple pour gérer quelque chose comme vous demandez:

function functionName($username,$password){ 

    SELECT tablename.colname AS alias, tablename.colname2 AS alias2, ... 
    FROM tablename tn 
    JOIN talbename tn2 on tn2.colname = tn.colname 
    JOIN anothertable tn3 on tn3.colname = tn2.colname 

    WHERE tn.colname = $username AND rl.password ='$password' 
    AND tn3.colname = 1 
}